Java Orientado a Objeto

download Java Orientado a Objeto

of 131

Transcript of Java Orientado a Objeto

  • 7/29/2019 Java Orientado a Objeto

    1/131

    TUTORIAL:A LINGUAGEM DE PROGRAMAO

    JAVA E

    ORIENTAO A OBJETOS

    Instituto de ComputaoJulho 1996;

    Atualizado 2009.

    Andr Augusto Cesta. [email protected]

    Orientadora: Profa Dra Ceclia Mary Fischer Rubira

  • 7/29/2019 Java Orientado a Objeto

    2/131

  • 7/29/2019 Java Orientado a Objeto

    3/131

    INFORMAO SOBRE COPYRIGHT

    Copyright 1996- IC - UNICAMP.Este texto e documentos relacionados so protegidos por copyright.Esta publicao apresentada como est sem garantia de erros e mudanas, sejam nos endereos(URLs) , texto ou do cdigo reutilizado nos programas exemplo.

    Para obter a ltima verso deste texto consulte http://www.ic.unicamp.br/~cmrubira/aacesta/

    Marcas Registradas:

    Sun, o logotipo da Sun, Sun Microsystems, Solaris, HotJava e Java so marcas registradas deSun Microsystems, Inc. nos Estados Unidos e em alguns outros pases. O personagem Duke marca registrada de Sun Microsystems. UNIX marca registrada nos Estados Unidos e outros pases,exclusivamente licenciada por X/Open Company, Ltd.. Netscape Navigator marca registrada de:Netscape Communications Corporation.

  • 7/29/2019 Java Orientado a Objeto

    4/131

  • 7/29/2019 Java Orientado a Objeto

    5/131

    Prefcio:

    Este texto faz parte de um estudo comparativo de linguagens de programao orientadas aobjetos. O contedo deste estudo tambm est disponvel na Web sob o endereohttp://www.ic.unicamp.br/~cmrubira/aacesta/ . Neste endereo, voc pode complementar seuaprendizado, rodando exerccios iterativos, acessando links para outros hipertextos sobre

    linguagens de programao, vendo exemplos de programas e interagindo com aplicaes para aInternet.A diferena entre este estudo e outros textos que voc possa encontrar sobre o mesmo assunto

    o carter prtico. Exemplos completos, dicas de programao, explicaes sobre detalhesnormalmente ignorados em livros, tornaro seu aprendizado mais fcil, principalmente na segundaparte onde tratamos da construo de aplicaes para a Internet.

    No inicio, os exemplos podem ser considerados fceis, mas eles vo se complicando cada vezmais de modo que importante que o leitor acompanhe o texto fazendo os exerccios. Forneceremosuma srie de idias de programas simples para que voc possa testar seu conhecimento. Estesprogramas simples podem ser melhorados atravs do uso de interfaces grficas, assunto que no coberto neste tutorial.

    QUEM DEVERIA LER ESTE TUTORIAL

    Qualquer leitor que tenha experincia com pelo menos uma linguagem de programao.

    DIAGRAMAO DESTE TEXTO

    Apesar de Java ser uma linguagem que serve para vrios propsitos, o seu sucesso atual (pocado seu lanamento em 1996) se deve a possibilidade de elaborao de aplicaes para a Internet.Dada a importncia deste aspecto da linguagem, este texto est organizado de maneira semelhante aspginas encontradas na WWW, frequentemente voc encontrar diagramas como o seguinte:

    TUTORIAL

    http://www.dcc.unicamp.br/~cmrubira/aacestaEstudo comparativo de linguagens de programao orientadas a objetos. Nestapgina voc encontrar tutoriais sobre diversas linguagens orientadas a objetos,

    dentre elas: C++, Modula-3, Java. Quanto a Java, voc ter a oportunidade de vercdigo de programas e test-los, alm de poder adquirir a verso mais nova deste

    texto. Encontrar tambm links para sites sobre orientao a objetos.

    Este diagrama representa um hipertexto que pode ser acessado de modo a complementar seuestudo. A parte escrita em letra maior o endereo, o texto em itlico faz um resumo do contedodesta pgina. Usando estes links ou diagramas voc encontrar uma maneira ordenada de aprender

    sem se perder no mar de informaes da Internet.

    URL: Uniform Resource Locator, o endereo de um computador na internet

    O diagrama acima aparecer toda vez que introduzirmos uma palavra nova. Caso voc encontrealguma palavra desconhecida, basta usar o ndice remissivo para obter sua definio.

    importante lembrar que os hipertextos citados neste tutorial, no so de nossaresponsabilidade. Como eles esto sujeitos a mudanas, contamos com a sua ajuda para efetuarmosatualizaes, conte voc tambm com a nossa ajuda na internet.

  • 7/29/2019 Java Orientado a Objeto

    6/131

    Os programas exemplo deste texto so apresentados em caixas retangulares, e todo cdigo escrito em fonte diferente da usada neste texto comum. O trechos de cdigo que aparecemdesmembrados de seus arquivos, tem fundo cinza claro. Todos os arquivos presentes dentro dosretngulos, so arquivos text-only, qualquer formatao (negrito) tem apenas funo didtica.

    Os resultados dos programas so indicados pelo diagrama ao lado:

    DIVISO DO TUTORIAL

    Este tutorial contm uma sequncia de tpicos que permite apresentar a linguagem sob a ticada teoria de orientao a objetos. A apresentao do modelo de objetos da linguagem e conceitosrelacionados tais como polimorfismo, tratamento de excees est em primeiro plano. Ao longodessa apresentao, em segundo plano, voc aprender os aspectos bsicos da linguagem tais como

    loops, desvios condicionais, etc.Estes tpicos so frequentemente retomados, cada vez de maneira mais aprofundada. Quandoterminamos o assunto mtodos, voc j est pronto para saber o que so contrutores, e exatamenteisto que ensinamos. Porm o assunto contrutores no esgotado, voc ainda vai aprender a usarconstrutores em conjunto com agregao e depois em conjunto com herana.

    A maioria dos leitores fica ansiosa para aprender como criar aplicaes para a Internet, masdepois de satisfeita esta ansiedade voltam para o ponto onde aprendem como programar na linguageme no apenas experimentar com a criao de botes, caixas de dilogo, imagens, etc. Se esse o seucaso, recomendvel um tour pela WWW antes de comear a programar, um bom site paracomear a pesquisar com um browser compatvel com Java (Netscape Navigator 2.0 ousuperior) :

    APPLETS

    http://java.sun.com/applets/Links para vrios applets, divididos por categorias: games, sound, busines, animation...Divirta-se...

    APPLETS: So pequenos programas escritos em Java que podem ser embebidos emdocumentos hipetextos. So exemplos de applets: animaes, imagens, botes, etc.

    Applets podem suportar efeitos de multimidia como sons, iteraes com o usurio

    (mouse, teclado), imagens, animaes, grficos, etc.

    Ao longo do texto,voc perceber que Java excelente para desenvolver aplicaescomerciais e para ser usada em universidades. Java pode ser vista como uma fuso de vriastcnologias que vm sendo desenvolvidas na rea de computao, de modo que estudantes dessa

    linguagem tem a oportunidade de tomar contato com vrios tpicos recentes: programaoconcorrente, sitemas distribudos, orientao a objetos, protocolos da internet, business intelligence euma srie de outros assuntos fceis de praticar nessa linguagem.

    claro que os resultados dependero de seu esforo, portanto depois de ler esta introduo,descanse um pouco, tome um cafezinho1. Pois durante o restante do texto esperamos que voc seenvolva com a linguagem, reuse programas encontrados na Web, se comunique com colegasprogramadores, participe de listas de discusses, newsgroups (comp.lang.Java &alt.www.hotJava), e o mais importante: PROGRAME, PROGRAME, RE-PROGRAME!

    1 Um dos smbolos da linguagem uma xcara de caf que aparece em animaes com sua fumaa quente tremulando.

  • 7/29/2019 Java Orientado a Objeto

    7/131

    ADQUIRINDO O SOFTWARE NECESSRIO, PLATAFORMAS SUPORTADAS

    Um ambiente de programao Java normalmente composto de um kit de desenvolvimento deaplicaes Java e um browser compatvel com esta linguagem (recomendvel). Se voc no temacesso a esse ambiente de programao, tente estes endereos:

    DOWNLOADJAVA

    http://Java.sun.comRaiz do hipertexto montado pelos criadores da linguagem. Sob este endereo voc

    pode obter o compilador e outras ferramentas de desenvolvimento de aplicaes Javapara a sua plataforma de programao. Fique atento! Outros desenvolvedores esto

    criando ambientes de programao Java como Eclipse.

    DOWNLOADBROWSERS

    http://www.netscape.com

    Raiz do hipertexto montado pelos criadores do Netscape Navigator. Sob este

    endereo voc pode obter o browser Java compatible da Netscape ComunicationsINC.. Outros desenvolvedores esto lanando browsers compatveis com Java.

    DOWNLOADBROWSERS

    http://www.microsoft.com

    A microsoft licenciou a tecnologia Java e a incorporou em seu novo browser:

    Internet Explorer verso 3.0 ou superior.

    BROWSERS: So uma categoria de programas que permitem voc visualizar um

    documento criado em um certo padro, no caso html (hipertext markup language).Atualmente os browsers tem se tornado complexos devido a quantidade de padres

    existentes (ex. imagens .gif .jpg, etc). A linguagem Java pode contribuir para

    minimizar esta complexidade.

    CARACTERSTICAS DA LINGUAGEM

    Parecida com C, C++:

    Java tem a aparncia de C ou de C++, embora a filosofia da linguagem seja diferente. Por estemotivo estaremos frequentemente fazendo comparaes com alguma destas linguagens. O leitor queprograma em qualquer uma delas, ou em uma linguagem orientada a objetos, se sentir mais avontade e se tornar um bom programadorJava em menos tempo.

    Java tambm possui caractersticas herdadas de muitas outras linguagens de programao:Objective-C, Smalltalk, Eiffel, Modula-3, etc. Muitas das caractersticas desta linguagem no sototalmente novas. Java uma feliz unio de tecnologias testadas por vrios centros de pesquisa edesenvolvimento de software.

    Distinta de Javascript:

    Muita gente confunde Java com JavaScript. As duas linguagens so semelhantes na sintaxe,mas diferem no sistema de tipos, orientao a objectos e outros aspectos. Javascript tem sidocombinada com sucesso com Java e dynamic HTML resultando em aplicaes dynamicas conhecidascomo AJAX enabled applications.

    Compilada:

  • 7/29/2019 Java Orientado a Objeto

    8/131

    Um programa em Java compilado para o chamado byte-code, que prximo as instruesde mquina, mas no de uma mquina real. O byte-code um cdigo de uma mquina virtualidealizada pelos criadores da linguagem. Por isso Java pode ser mais rpida do que se fossesimplesmente interpretada.

    Portvel:Java foi criada para ser portvel. O byte-code gerado pelo compilador para a sua aplicao

    especfica pode ser transportado entre plataformas distintas que suportam Java (Solaris, Windows,Mac/Os etc). No necessrio recompilar um programa para que ele rode numa mquina e sistemadiferente, ao contrrio do que acontece por exemplo com programas escritos em C e outraslinguagens.

    Esta portabilidade importante para a criao de aplicaes para a heterognea Internet. Muitosdos programas exemplo deste tutorial foram escritos e compilados numa plataforma Windows-95em 1996 e rodaram perfeitamente quando simplesmente copiados para uma plataforma Solaris. mJava um inteiro por exemplo, tem sempre 32 bits, independentemente da arquitetura. O prprio

    compiladorJava escrito em Java, de modo que ele portvel para qualquer sistema que possua ointerpretador de byte-codes. Um exemplo de programa escrito em Java a aplicao de filesharing multi-plataforma chamada Limewire2.

    Orientada a Objetos:

    A portabilidade uma das caractersticas que se inclui nos objetivos almejados por umalinguagem orientada a objetos. Em Java ela foi obtida de maneira inovadora com relao ao grupoatual de linguagens orientadas a objetos.

    Java suporta herana, mas no herana mltipla. A ausncia de herana mltipla pode sercompensada pelo uso de herana e interfaces, onde uma classe herda o comportamento de sua

    superclasse alm de oferecer uma implementao para uma ou mais interfaces.Java permite a criao de classes abstratas. Outra caracterstica importante em linguagensorientadas a objetos a segurana. Dada a sua importncia o tpico foi escrito a parte.

    Segura:

    A presena de coleta automtica de lixo, evita erros comuns que os programadores cometemquando so obrigados a gerenciar diretamente a memria (C , C++, Pascal ). A eliminao do uso deponteiros, em favor do uso de vetores, objetos e outras estruturas substitutivas traz benefcios emtermos de segurana. O programador proibido de obter acesso a memria que no pertence ao seuprograma, alm de no ter chances de cometer erros comuns tais como reference aliasing e usoindevido de aritmtica de ponteiros. Estas medidas so particularmente teis quando pensarmos emaplicaes comerciais desenvolvidas para a internet.

    Ser strongly typed tambm uma vantagem em termos de segurana, que est aliada aeliminao de converses implcitas de tipos de C++.

    A presena de mecanismos de tratamento de excees torna as aplicaes mais robustas, nopermitindo que elas abortem, mesmo quando rodando sob condies anormais. O tratamento deexcees ser til na segunda parte para modelar situaes tais como falhas de transmisso e

    2 importante dar exemplos para que o leitor curioso possa conferir o look and feel e qualidade das aplicaes. Paramais aplicaes escritas em Java visite: http://java-source.net/.

  • 7/29/2019 Java Orientado a Objeto

    9/131

    formatos incompatveis de arquivos.

    Suporta concorrncia:

    A linguagem permite a criao de maneira fcil, de vrios threads de execuo. Este tpicoser til quando voc estudar animaes, e particularmente poderoso nos ambientes em que

    aplicaes Java so suportadas, ambientes estes que geralmente podem mapear os threads dalinguagem em processamento paralelo real em mquinas que o suportam a exemplo das mquinasmulti-core.

    Eficiente:

    Como Java foi criada para ser usada em computadores pequenos, ela exige pouco espao,pouca memria. Java muito mais eficiente que grande parte das linguagens de scriptingexistentes, embora seja mais lenta que C. Com a evoluo da linguagem, sero criados geradores debyte-codes cada vez mais otimizados que traro as marcas de performance da linguagem maisprximas das de C++ e C. Alm disso um dia Java permitir a possibilidade de gerar cdigoexecutvel de uma particular arquitetura on the fly, tudo a partir do byte-code.

    Suporte para programao de sistemas distribudos:

    Java fornece facilidades para programao com sockets, remote method call, tcp-ip, etc. Estestpicos no sero abordados neste texto.

  • 7/29/2019 Java Orientado a Objeto

    10/131

    PROGRAMAO ORIENTADA A OBJETOS

    NOTA AOS PROGRAMADORES C

    A leitura deste hipertexto fortemente recomendada para os programadores que tem C ou C+

    + como sua principal linguagem de programao, mesmo antes de iniciar a leitura deste tutorial:

    DOWNLOADBROWSERS

    http://www.cafeaulait.org/javatutorial.htmlBrewingJava: A Tutorial, Um tutorial de Java que segue o estilo do livro inicialsobre C, escrito por Kernighan & Ritchie [2], a referncia bsica para este texto.

    Cobre principalmente sintaxe de loops e outros assuntos fceis no abordados aqui.

    Iniciaremos com um pouquinho de teoria sobre orientao a objetos. Se voc quiser algumhipertexto para aprofundamento ou para ler em paralelo com esta introduo sobre classes e objetos euse:

    TUTORIAIS

    http://java.sun.com/docs/books/tutorial/java/concepts/Introduo a orientao a objetos e Java em ingls

    CLASSES E OBJETOS

    Uma classe um tipo definido pelo usurio que contm o molde, a especificao para osobjetos, algo mais ou menos como o tipo inteiro contm o molde para as variveis declaradas comointeiros. A classe envolve, associa, funes e dados, controlando o acesso a estes, defin-la implicaem especificar os seus atributos (dados) e seus mtodos (funes).

    Um programa que utiliza uma interface controladora de um motor eltrico provavelmentedefiniria a classe motor. Os atributos desta classe seriam: temperatura, velocidade, tenso aplicada.

    Estes provavelmente seriam representados na classe por tipos como int ou float. Os mtodos destaclasse seriam funes para alterar a velocidade, ler a temperatura, etc.Um programa editor de textos definiria a classe pargrafo que teria como um de seus atributos

    uma String ou um vetor de Strings, e como mtodos, funes que operam sobre estas strings.Quando um novo pargrafo digitado no texto, o editor cria a partir da classe Pargrafo um objetocontendo as informaes particulares do novo texto. Isto se chama instanciao ou criao do objeto.

    ESPECIFICANDO UMA CLASSE

    Suponha um programa que controla um motor eltrico atravs de uma sada serial. A velocidade

    do motor proporcional a tenso aplicada e esta proporcional aos bits que vo para sada serial epassam por um conversor digital analgico.Vamos abstrair todos estes detalhes por enquanto e modelar somente a interface do motor como

    uma classe, a pergunta que mtodos e que atributos deve ter nossa classe, que argumentos e valoresde retorno devem ter os mtodos?

    Representao da velocidade:

    A velocidade do motor ser representada por um atributo inteiro ( int). Usaremos a faixa de bits

  • 7/29/2019 Java Orientado a Objeto

    11/131

    que precisarmos, caso o valor de bits necessrio no possa ser fornecido pelo tipo , usaremos ento otipo long, isto depende do conversor digital analgico utilizado.

    Representao da sada serial:

    O motor precisa conhecer a sua sada serial, a sua ligao com o motor do mundo real.

    Suponha uma representao em hexadecimal do atributo endereo de porta serial, um possvel nomepara o atributo: enderecomotor. No se preocupe em saber como usar a representao hexadecimal.

    Alterao do valor da velocidade:

    Internamente o usurio da classe motor pode desejar alterar a velocidade, cria-se ento omtodo: public void setSpeed(int newSpeed);. O cdigo anterior corresponde ao cabealho domtodo ele definido junto com a classe motor, associado a ela. O valor de retorno da funo queimplementa o mtodo void, poderia ser criado um valor de retorno (boolean) que indicasse se ovalor de velocidade era permitido e foi alterado ou no era permitido e portanto no foi alterado.

    O ato de invocar um mtodo tambm chamado de passar uma mensagem para o objeto queest executando este mtodo.

    No faz sentido usar, chamar, este mtodo separado de uma varivel do tipo motor, mas entoporque na lista de argumentos da funo no se encontra um motor? Este pensamento reflete amaneira de associar dados e cdigo (funes) das linguagens procedurais. Em linguagens orientadas aobjetos o cdigo e os dados so ligados de forma diferente, a prpria declarao de um tipo definidopelo usurio j engloba as declaraes das funes inerentes a este tipo, isto ser explicado emCLASSES. O objeto ao qual aplicado o mtodo passado de outra forma.

    Note que no fornecemos o cdigo do mtodo, isto no importante, por hora a preocupao com a interface definida pela classe: seus cabealhos de mtodos e atributos. Apenas pense que suainterface deve ser flexvel de modo a no apresentar entraves para a criao do cdigo que seria feitanuma outra etapa. Nesta etapa teramos que imaginar que o valor numrico da velocidade deve ir parao conversor onde ir se transformar numa diferena de potencial a ser aplicada nos terminais domotor, etc.

    Um diagrama simplificado da classe motor com os atributos e mtodos:

    Este e outros diagramas deste texto foram elaborados com uma ferramenta case para object

    oriented modeling and design segundo a metodologia descrita em [1]

    Acessores de atributos:

    Voc pode se perguntar porque no usamos um mtodo de nome alteraVelocidade(novavelocidade) envs de setSpeed(newspeed), uma vez que estamos escrevendo o tutorial e tambmo cdigo em lingua portuguesa. A razo um padro de programao Java chamado beans queespecifica que qualquer mtodo que altere somente o valor de um atributo de nome X deve se chamarsetX e qualquer mtodo que retorne o valor de um atributo de nome X deve se chamar getX.

  • 7/29/2019 Java Orientado a Objeto

    12/131

    Embora esse padro no seja obrigatrio ele usado pois Servlets, Reflexo, JSF e outras APIs fazemuso dele. Esses mtodos so chamados em ingls de acessors or getters and setters.

    Exerccios:

    1-

    Lembre-se de algum programa em que voc trabalhou, cite que tipos de classes seriam criadasse esse programa fosse escrito em Java, que atributos e que mtodos estariam associados aos objetosdessas classes? Desenhe o diagrama de classe para as cada classe de objetos identificada.

    Exemplo: Eu trabalhei em um programa de contas a pagar e contas a receber. Se esseprograma fosse escrito em Java eu definiria a classe contaBancaria. Os atributos seriam: saldo,taxaDeJuros, limiteDeSaque, etc. Minha opo seria por represent-los como variveis do tipodouble (no se preocupe em usar os tipos da linguagem inda). Dentre os mtodos desta classeestariam funes para efetuar saques, depsitos e computar juros.

    OBJETOS EM JAVA

    Objetos so instncias de uma classe. Quando um objeto criado ele precisa ser inicializado, ouseja para uma nica classe de nome EstudanteDeGraduacao podemos ter vrios objetos ativos emmemria durante a execuo de um programa.

    Estudante de graduao Andre; Identificao 940718; Curso Computacao | Estudante degraduao Luiza , Identificao 893249, Curso Medicina... A classe representa somente o moldepara a criao dos objetos, estes sim contm informao, veja tpico CLASSES E OBJETOS.

    O atributo Identificao tem valor 940718 para a instncia (objeto) Andr da classe Estudantesde Graduao.

    INSTANCIAS: Um objeto existente durante um momento da execuo de um

    programa uma instancia de uma classe.Uma classe e suas instancias: Cada estudante (ou instancia) poderia ser modelado, desenhado como:

    Objetos podem conter objetos, ou seja os atributos de um objeto podem ser objetos, da mesmaclasse ou no. Objetos podem ser passados pela rede, armazenados em meio fsico. Objetos possuemum estado e um comportamento. Mtodos podem receber objetos como argumentos, podem declararobjetos como variveis locais, podem chamar outros mtodos. Voc pode chamar um mtodo (mandaruma mensagem) para objetos em outras mquinas atravs de sua rede.

    Um objeto pode ser visto como um RECORD de Pascal ou Strut de C, s que com uma tabelade funes que podem ser chamadas para ele. Na verdade esta definio no muito terica, mas um bom comeo para os programadores que esto acostumados com linguagens procedurais. Naverdade podemos fazer com objetos muito mais do que fazemos com records e procedimentos emPascal.

  • 7/29/2019 Java Orientado a Objeto

    13/131

    Em Java, ao contrrio de C++ e Modula-3, no existem funes desvinculadas de classes,funes isoladas. Isto implica que todo trecho de cdigo que for escrito deve pertencer a uma classe,mais precisamente deve ser um mtodo desta. O programa mais simples em Java deve conter pelomenos uma classe e um mtodo de incio de programa, e este programa que faremos agora.

    Esta filosofia simples e semelhante a adotada em Eiffel, tudo o que se pode fazer comprocedimentos, funes isoladas e variveis de procedimentos, tambm se pode fazer com classes e

    mtodos. C++ tinha que permitir a criao de funes isoladas para manter a compatibilidade comC, mas Java no. Quando neste texto usarmos o termo funo no lugar de mtodos estaremosmais interessados em enfatizar a parte de implementao em detrimento da interface, voc pensar queem Java toda funo implementa um mtodo de uma classe.

    O leitor no acostumado com o paradigma de orientao a objetos, pode achar estranhas asafirmaes acima, e a pergunta mais comum neste momento : Mas ento como voc sabe aonde vaicomear o programa?. Antes da resposta a essa pergunta, leia o primeiro programa exemplo, que semelhante ao primeiro programa em C, Hello World, presente em [2].

    PROGRAMA HELLO INTERNET!

    Este exemplo visa apresentar um programa simples para imprimir uma mensagem na tela, esteprovavelmente ser seu primeiro programa em Java.

    COMPILANDO UM PRIMEIRO PROGRAMA:1-Certifique-se de ter adicionado a sua lista depaths o path do compilador e interpretador Java.Javac e Java respectivamente.

    2-Crie o arquivo ao lado em um diretrio qualquer(folder para usurios mac) e salve com o nome:

    HelloInternet.Java

    3-Chame o compilador Java para este arquivo:javac HelloInternet.Java

    4-Seu diretrio deve ter recebido um novo arquivoaps essa compilao: HelloInternet.class

    5-Chame o interpretador Java para este arquivo(omita a extenso .class de arquivo): JavaHelloInternet

    6-Observe o resultado na tela: Hello Internet!

    //Comentario de uma linha

    public class HelloInternet {

    public static void main (String args[]) {

    System.out.println("Hello Internet!");

    }

    }

    Hello Internet!

    Resolvendo os eventuais problemas:Compile este programa. Voc pode decidir por no prosseguir enquanto no compil-lo. Se

    voc for como eu, e principalmente se tiver digitado tudo ao envs de usar copy and paste, bemprovvel que ele no compile, se isto ocorrer, leia atentamente o programa. Voc no esqueceu oponto e vrgula? E as chaves? Hellointernet comea com letra maiscula, e isso faz diferena3, voc

    3 Identificadores em letras maisculas e minsculas so diferentes, a linguagem case-sensitive.

  • 7/29/2019 Java Orientado a Objeto

    14/131

    foi coerente com a conveno adotada de letras maisculas e minsculas para seus identificadores?Voc estava no mesmo diretrio de HelloInternet.java quando chamou o compilador? E quando

    chamou o interpretador? Tambm?Se ainda no der certo, no se desespere, leia as explicaes passo a passo do programa e depois

    recorra a um usurio mais experiente. Normalmente a Java muito fcil de se programar, e vocprecisar de pouca ajuda, o seu interesse o far cada vez mais familiar com esta linguagem.

    Explicao passo a passo do programa exemplo:

    //Comentario de uma linhaComentrios em Java seguem a mesma sintaxe de C++, // inicia uma linha de comentrio,

    todo o restante da linha ignorado. Existe tambm um outro tipo de comentrio formado por /*Insira aqui o texto a ser ignorado */ , este tipo de comentrio pode ser intercalado em uma linha decdigo. Comentrios so tratados como espaos em branco.

    public class HelloInternet {class a palavra reservada que marca o inicio da declarao de uma classe. Public um

    especificador, por enquanto guarde public class como o incio da declarao de uma classe. Todaclasses sero declaradas assim at o tpico ENCAPSULAMENTO DE ATRIBUTOS E MTODOSCOM PACKAGESENCAPSULAMENTO DE CLASSES COM PACKAGES.

    HelloInternet o nome dado a esta classe. O abre chaves marca o incio das declaraes da classe que

    so os atributos e mtodos. Esta classe s possui uma declarao, a do mtodo main, note que ummtodo, ao contrrio de C++, s pode ser declarado {internamente} a classe a qual pertence, evitandoas confuses sobre escopo. Desta forma, todo pedao de cdigo em Java deve pertencer ao abrechaves, fecha chaves da definio de uma classe.

    public static void main (String args[]) {System.out.println("Hello Internet!");

    }

    public um qualificador do mtodo que indica que este acessvel externamente a esta classe (para

    outras classes que eventualmente seriam criadas), no se preocupe com ele agora, apenas declaretodos os mtodos como public. Voltaremos a este assunto em ENCAPSULANDO MTODOS EATRIBUTOS.

    static um outro qualificador ou specifier, que indica que o mtodo deve ser compartilhado por

    todos os objetos que so criados a partir desta classe. Os mtodos static podem ser invocados, mesmoquando no foi criado nenhum objeto para a classe, para tal deve-se seguir a sintaxe:.(argumentos); ou seja HelloInternet.main(args);.Retornaremos a esta explicao mais tarde, por hora voc precisa saber que particularmente o mtodomain precisa ter essa qualificao porque ele chamado sem que se crie nenhum objeto de sua classe(a classe HelloInternet).

    Curiosidade:

  • 7/29/2019 Java Orientado a Objeto

    15/131

    Se voc gosta de paradoxos e j conhece um pouco de orientao a objetos, pense que se omtodo main tivesse que ser chamado para um objeto (o que no o caso) este objeto teria que tersido criado em algum outro lugar ento este lugar seria o incio do programa e main4 deixaria de teresta finalidade.

    A linguagem de programao Eiffel adota uma tcnica diferente para resolver este problema:todo programa comea com a criao de um objeto (e no mais a chamada automtica de main), este

    objeto chamado ROOT, ele pode conter atributos que so inicializados e um mtodo deinicializao, construtor do objeto, que o incio do cdigo do programa.

    voidSemelhante ao void C++ ou C, o valor de retorno da funo, quando a funo no retorna

    nenhum valor ela retorna void, uma espcie de valor vazio que tem que ser especificado.

    mainEste um nome particular de mtodo que indica para o compilador o incio do programa,

    dentro deste mtodo e atravs das iteraes entre os atributos, variveis e argumentos visveis neleque o programa se desenvolve.

    (String args[]) o argumento de main e por consequncia do programa todo, ele um vetor de Strings que

    formado quando so passados ou no argumentos atravs da invocao do nome do programa nalinha de comando do sistema operacional, exemplo:

    Java HelloInternet argumentotexto1 argumentotexto2

    No nosso caso, ignoramos a possvel passagem de argumentos via linha de comando,retornaremos a este assunto mais tarde.

    { ... }Abre chaves e fecha chaves. Para quem no conhece C ou C++, eles podem ser entendidos

    como algo semelhante ao BEGIN END de Pascal ou Modula-3, ou seja: delimitam um bloco decdigo. Os programadores Pascal notaro que variveis locais dos mtodos podem ser declaradas emqualquer local entre as chaves. Mas por motivos de clareza do cdigo declararemos todas no incio doabre chaves.

    System.out.println("Hello Internet!");Chamada do mtodo println para o atributo out da classe ou objeto System, o argumento uma

    constante do tipo String. O println assim como writeln de Pascal, imprime a String na sada padro eposiciona o cursor na linha abaixo, analogamente print no avana linha. Por hora voc podeguardar esta linha de cdigo como o comando para imprimir mensagens na tela, onde o argumentoque vem entre aspas a String a ser impressa. O ; ponto e vrgula separa operaes.

    }Finalmente o fecha chaves termina com a declarao da classe HelloInternet.

    Concluso:

    4 main, do ingls: Principal.

  • 7/29/2019 Java Orientado a Objeto

    16/131

    Normalmente o volume de conceitos presentes num primeiro programa de uma linguagemorientada a objetos como Java ou Eiffel grande se comparado com o de um primeiro programa emC ou Pascal. Esses conceitos ainda sero aprofundados e so citados aqui apenas por curiosidade, normal que voc no tenha entendido tudo.

    De agora em diante no explicaremos mais como compilar os programas.

    Exerccios:1-

    Experimente fazer modificaes no programa HelloInternet. Imprima outras mensagens na tela,adicione comentrios.

    ATRIBUTOS

    No programa anterior, no observamos a criao de nenhum objeto5, apenas a declarao daclasse HelloInternet que continha o mtodo main. O nosso programa funcionou, porque o mtodo

    main no precisa de um objeto especfico para ser invocado.Este exemplo declara uma classe (Circulo) e em seguida cria um objeto deste tipo em main ealtera o contedo desta varivel. Uma classe parecida com um record de Pascal, a nossa representaum crculo com os atributos raio e x , y, que so coordenadas cartesianas. Note que este objeto nopossui mtodos ainda.

    A classe crculo especificada em um arquivo separado do arquivo da classe que contm omtodo main (incio do programa), um arquivo neste texto representado pelo retngulo envolvendoum trecho de cdigo, at o tpico ENCAPSULAMENTO DE CLASSES COM PACKAGES cadaclasse ser especificada em um arquivo.

    importante entender este exemplo, quando voc estudar interfaces grficas, poder usar aclasse crculo pr-definida na linguagem para desenhar crculos que se movem na tela. Embora no

    tenhamos explicado com detalhes os tipos bsicos da linguagem, usaremos neste exemplo o tipo float(real), e nas explicaes o tipo String e o tipo int (inteiro). No final deste tpico forneceremos umaexplicao detalhada sobre tipos.

    //Classe circulo, arquivo Circulo.Java

    public class Circulo {//so atributos entre as chaves

    public float raio; //atributo raio do circulo

    public float x;//posicoes em coordenadas cartesianaspublic float y;

    }

    //Classe principal, Arquivo Principal.Java

    5 Na verdade a string delimitada por aspas um valor literal compilado em um objeto da classe String de Java.

  • 7/29/2019 Java Orientado a Objeto

    17/131

    public class Principal {

    public static void main(String args[]) { Circulo umcirc; //declaracao de uma variavel circulo no metodo main. umcirc = new Circulo(); //alocacao dessa variavel

    System.out.println("(" + umcirc.x + "," + umcirc.y + "," + umcirc.raio + ")"); umcirc.x = umcirc.x + 17;System.out.println("(" + umcirc.x + "," + umcirc.y + "," + umcirc.raio + ")");

    }

    }

    (0,0,0)(17,0,0)

    Porque os matemticos no gostam de C, C++, Java e Basic:

    A declarao umcirc.x = umcirc.x + 17 presente em nosso programa deixa os matemticosdoidos pois de voc subtrairumcirc.x de cada um dos lados da igualdade a expresso se torna 0 =17. Ocorre que = no o operador de teste de igualdade e sim de atribuio, ele tem a mesma funodo := de Pascal a qual os matemticos adoram. O operador de teste de igualdade em Java : ==

    Mais sobre arquivos:

    Como pode ser observado, cada arquivo texto do programa est envolvido em uma moldura

    retangular. Neste caso as duas classes criadas: Circulo e Principal, esto em arquivos separados. Asequncia de alteraes em seu diretrio ou folder :

    Inicio: Apsjavac AsDuasJuntas.Java:

    O compilador deve ser chamado para ambos arquivos. Ou voc pode usar os chamadoswildcards6 javac *.java. Nesse caso a shell expande *.java em uma lista de strings contento todosos arquivos .java do diretrio e passa essa lista como argumentos para o compilador javac.

    Sem Includes:

    Se voc j programa em alguma outra linguagem provavelmente deve estar com a seguinte

    6 Wild-Card, do ingls: Coringa , carta de baralho. O * substitui os nomes de todos os arquivos, assim como o coringapode susbtituir todas as cartas em jogos de baralho.

  • 7/29/2019 Java Orientado a Objeto

    18/131

    dvida: Vocs usaram o nome da classe Circulo na classe Principal, ambas esto em arquivosseparados, como o compilador sabe em que diretrio est a classe Circulo? No preciso fazer umaespcie de include ou referncia para poder usar a classe Circulo em outro arquivo?

    A resposta no. O compilador sabe achar se ela estiver sob o diretrio de seu programa. Sevoc tiver que deixar esta classe em outro diretrio ento ela deve fazer parte de um package e vocter que importar explicitamente este package, veremos como faz-lo mais tarde.

    Classe Circulo e declarao de atributos:

    O primeiro arquivo deste exemplo contm o cdigo da classe Circulo, esta classe contm trsatributos . A declarao de atributos segue sintaxe semelhante a de C++ (havero acrscimos a estasintaxe):

    EspecificadorModoDeAcesso NomeTipo NomeAtributo;public float raio;public float x;public float y;

    Todos os atributos pertencentes a classe so do tipo float (Ponto flutuante 32-bit IEEE754, vejatabela de tipos bsicos). Esto especificados como public o que significa que podem ser modificadosa partir de uma classe que usa um objeto Circulo seja como varivel de mtodo ou como atributo(este tipo de modificao ser exemplificado na classe Principal).

    Existem outros especificadores que abordaremos mais adiante, por hora todos os mtodos eatributos que criarmos devero serpublic. Vale lembrar que na declarao de variveis simples emmtodos, no faz sentido usar o EspecificadorModoDeAcesso. Esta classe Circulo no possuimtodos.

    Como exemplo de declarao de variveis simples tome a declarao de uma varivel Circulono mtodo main. Seguida de sua alocao: umcirc = new Circulo(); //alocacao dessavariavel. Sem a alocao a varivel no pode ser usada. Note que os atributos so por defaultinicializados para zero.

    Classe Principal declarao e inicializao de atributos:

    A classe Principal no possui atributos, porque nenhum objeto desta classe criado ainda,apenas seu mtodo main chamado. O mtodo main declara uma referncia para objeto da classeCirculo: Circulo umcirc;. Note que diferentemente de C++ no so necessrios includes ouheader files para poder declarar essa varivel de um tipo definido pelo usurio e existente emoutro arquivo.

    Antes da referncia ao objeto ser usada, este precisa ser alocado na memria o que feitoatravs de umcirc = new Circulo();. Se voc tivesse declarado um objeto da classe String, jdefinida na linguagem, e depois fizesse sua alocao, o cdigo seria semelhante ao seguinte:

    String umastring;umastring = new String(Valor inicial);

    A diferena com a alocao do objeto Circulo que entre os parnteses incluem um argumentoValor inicial, isto ocorre porque a linguagem permite que voc aproveite a alocao de um objetopara inicializar alguns de seus atributos, isto ser explicado em CONSTRUTORES. Neste nossoprograma, os atributos contidos na rea de memria alocada pornew, so alterados de outra forma.

    Coleta automtica de lixo:

  • 7/29/2019 Java Orientado a Objeto

    19/131

    Coleta automtica de lixo a reciclagem de reas de memria no mais necessrias aoprograma/software. A desalocao do objeto feita pela linguagem, (automatic garbagecollection), voc no precisa se preocupar com ela como em C++. Aps o fecha chaves de main, amemria do objeto umcirc j pode ser liberada, o que normalmente no ocorre de imediato, pois oambiente da linguagem executa um tread em baixa prioridade que libera de tempos em tempos os

    espaos inutilizados de memria, tirando proveito por exemplo de eventuais pausas de iterao dousurio com o programa.

    Thread: Por executar em um tread entenda paralelamente ou quase paralelamente,

    voltaremos a este tpico mais adiante em Threads.

    Acesso aos atributos e mtodos e alteraes dos atributos:

    O acesso aos atributos da varivel (objeto) umcirc deve ser feito usando o nome do objeto e onome do atributo deste, separados por um ponto: umcirc.raio = 10.0; . Note que raio sozinho no fazsentido no programa, precisa-se especificar de que objeto se deseja alterar ou obter o raio.

    A sintaxe de chamadas de mtodos semelhante a sintaxe descrita acima, s que ao envs denome do atributo temos o nome do mtodo seguido dos parnteses que podem conter zero ou maisargumentos. Volte ao primeiro programa (HelloInternet) e verifique a declarao do mtodo main,onde chamamos o mtodo println()para o objeto System.out .

    Imprimindo variveis do tipo ponto flutuante (float) e inteiro (int) na tela:

    System.out.println("(" + umcirc.x + "," + umcirc.y + "," + umcirc.raio + ")");O argumento de println que conhecemos uma nica varivel do tipo String, no entanto o

    cdigo acima mistura nos argumentos desse mtodo os seguintes elementos: Strings: (,operadores : +, e variveis float: umcirc.y. Fica muito fcil de voc entender porque isto funciona sepensar que + tambm operador de concatenao de Strings e que os argumentos int ou float e deoutros tipos bsicos desse mtodo so convertidos para Strings.

    Importante aos que no programam em C ou C++, os operadores = e ==:

    Em Java, C, e C++ o operador = (igual) tem a funo de atribuio e o operador == (igualigual) tem a funo de comparao entre valores, retornando o valor booleano verdadeiro se estesvalores forem idnticos. Alguns podem no achar esta escolha de operadores sensata, principalmenteos matemticos, mas com um pouco de uso da linguagem ela se tornar automtica.

    CURIOSIDADE (s para programadores C e C++), eliminao do problema que ocorre em C eC++ com os operadores = e == :

    Em C, C++ e tambm em Java permitido escrever:int i,j,k;i=0;

    j=k=i+3; //final, j vale 3, k vale 3 e i continua valendo 0Essas atribuies em cadeia permitem escrever cdigo mais compacto, elas fazem sentido

    porque atribuies nessas linguagens possuem valores, assim k=i+3; no final tem o valor de k que igual a i+3. O valor dej=... .no nosso exemplo descartado, ignorado pois no h nada a esquerdadesta atribuio. Em C e C++ existe um problema grave que frequentemente uma cilada para os

  • 7/29/2019 Java Orientado a Objeto

    20/131

    programadores Pascal e outros.O problema que nessas duas linguagens (C e C++) no existe o tipo boolean, no lugar deste

    tipo usado o tipo int (inteiro), onde 1 significa verdadeiro e 0 falso. Assim em C e C++ (mas no emJava) a==a tem valor 1 com o significado dado pelo programador de true ou verdadeiro, masa=1+0; tambm tem como resultado o valor 1, mas agora com o significado inteiro, numrico. Ocompilador no sabe distinguir entre os significados numrico e booleano.

    Essa ambiguidade faz com que programadores (C ou C++) no acostumados com estaconveno de operadores = e ==, incorram no erro de escreverj=1 quando na verdade queriam dizerj==1, mas para o compilador ambas as expresses tem valor inteiro de modo que se esse enganoocorrer num teste de parada de um loop, pode ocorrer que ele nunca pare, pois 1 tem o mesmo valorde true.

    Java elimina este tipo de erro introduzindo o tipo boolean com os valores true e false, queno tem nenhuma relao com o tipo int e qualquer outros tipos.

    TIPOSBSICOS OU TIPOS PRIMITIVOS E CONSTANTES OU VALORES LITERAIS(para nossa sorte os tipos bsicos, tambm conhecidos como tipos primitivos, so os mesmos para

    qualquer ambiente de programao Java, porque a linguagem portvel):

    char Caractere UNICODE 16-bit

    O tipo char (caractere UNICODE) representado com 16-bits sem sinal, o que permiteenderear de 0 a 65535. O objetivo desta opo permitir internacionalizao da linguagem, bemcomo a padronizao. Constantes do tipo caractere aparecem entre apstrofes: a, 1, $.

    Tabela de caracteres especiais:(ao contrrio de C/C++, no existe um caractere especial para o som de beep ou bell )

    Representao visual: Funo, significado:\n Pula linha, linefeed

    \r Retorno de carro\b Backspace\t Tabulao\f Formfeed\ Apstrofe\ Aspas\\ Barra inversa\u223d Caractere unicode\gfa Octal\fff Hexadecimal

    boolean Valortrue ou false, diferente representao de C++, sem converso em outros tipos.

    O tipo boolean no tem relao nenhuma com outros tipos (coero). Eliminando problemasque surgiram por exemplo em C++ que usa inteiros para representar valores booleanos. Os possveisvalores so true e false que so os resultado dos testes lgicos.

    boolean pertenceAoConjunto; //declara variavelpertenceAoConjunto = true; //exemplo

  • 7/29/2019 Java Orientado a Objeto

    21/131

    byte Inteiro 8-bit , complemento de 2, faixa:-128 at 127short Inteiro 16-bit, complemento de 2, faixa:-32768 at 32767int Inteiro 32-bit, complemento de 2, faixa:-2147483648 at 2147483647long Inteiro 64-bit, compl. de 2, faixa:-9223372036854775808 at 9223372036854775807

    No existem especificadores de tipos como unsigned, todos os tipos inteiros tem sinal.

    Valores literais: O que voc v nem sempre o que voc tem : Um valor como 299792458 considerado int como padro, se voc quer atribuir esta constante a um long, faa o type castexplicitamente:

    long a;a = (long)299792458; //a recebe PI

    Ou ento use uma terminao em L para indicar que o nmero deve ser representado como long:long a = 299792458L; //ou L minusculo

    Para indicar valores octais anteceda-os com um zero: 0444 , j para valores hexadecimais anteceda-os com 0X ou 0x, exemplo: 0xBCD4

    float Ponto flutuante 32-bit IEEE754

    double Ponto flutuante 64-bit IEEE754

    Um valor como 3.14159265 considerado double como padro, se voc quer atribuir estaconstante a um float, faa o type cast explicitamente:

    float a;a = (float)3.14159265; //a recebe PI

    Ou ento usar uma terminao em f para indicar que o nmero deve ser representado como float:float a=3.14159265f //ou F maiusculo

    Expoentes podem ser escritos usando o caracter e ou E: 6,02E23 ou 1.380658e-23 . Onde e-1,significa multiplicado por dez elevado a menos 1 ou *0.1. O separador de casas decimais o ponto.Apesar de todas estas regras para uso de valores literais, quando dois nmeros de tipo diferentes

    como double e int so usados em um clculo do lado direito de uma atribuio, voc no precisafazer o type cast desses valores. O compilador promove o nmero do tipo mais fraco para o tipomais forte antes de fazer o clculo (seria bom se funcionasse assim em empresas tambm onde ofuncionrio mais fraco seria promovido ao nvel do mais forte no projeto e ento eles trabalhariamjuntos para expressar seu trabalho). Voc pode desejar fazer o type cast do resultado, para atribuir auma varivel long por exemplo.

    Exerccios:

    1-Repita o mesmo exemplo s que agora mova o crculo alterando as componentes x e y. Coloque

    o crculo na posio (1.0, 1.0), atravs de atribuies do tipo acirc.x = 1.0; . Acompanhe todas asmodificaes do objeto imprimindo seus atributos na tela.

    2-Simplifique o programa anterior retirando o atributo raio. Voc pode dar o nome de Pontoou

    PontoGeometrico para esta classe. No se esquea de compilar, use o compilador como ferramentapara verificar se voc aprendeu corretamente a sintaxe da linguagem. Agora escreva a classe Circulocontendo um ponto chamado centro.

  • 7/29/2019 Java Orientado a Objeto

    22/131

    3-Reescreva a classe Circulo para trabalhar com atributos do tipo int.

    ATRIBUTOS E MTODOS

    Os mtodos determinam o comportamento dos objetos de um classe. Quando um mtodo invocado, se diz que o objeto est recebendo uma mensagem (para executar uma ao). Comoexemplo se meu carro um objeto e desligar o alarme um mtodo poderiamos escrever em Java daseguinte forma a chamada para desligar o alarme: meuCarro.desligarAlarme() .

    Programas complexos formam conjuntos de objetos que trocam mensagens entre si gerenciandoinclusive os recursos do sistema.

    O programa a seguir exemplifica chamadas de mtodos, para tal define um objeto que servecomo contador, a implementao representa a contagem no atributo num que um nmero inteiro.Os mtodos so simples: incrementa adiciona um ao contador em qualquer estado e comecainicializa a contagem em zero. Decrementa faz o oposto de incrementa.

    //Classe Contador, arquivo Contador.Java

    public class Contador {

    public int num; //este o atributo//numero do contador

    public void incrementa() {num = num + 1; //acesso ao atributo

    }

    public void decrementa() {num = num - 1;}

    public void comeca(int n)//comeca a contar{num = n;}

    }

    //Classe principal, Arquivo Princ.Java

    public class Principal {

    public static void main(String args[]) {

  • 7/29/2019 Java Orientado a Objeto

    23/131

    Contador umcont;//declaracao de atributo contador

    umcont = new Contador();//alocacao

    umcont.comeca(0);System.out.println(umcont.num);

    umcont.incrementa();System.out.println(umcont.num);}

    }

    01

    Exerccios:

    1-Defina um mtodo chamado mostra para a classe contador. Este mtodo deve imprimir o estado

    do contador na tela. A implementao deste mtodo depende de onde voc est imprimindo o estadodo contador? Pense em programas de interfaces grficas e de linha de comando.

    2-

    Crie uma classe contador cclico, exemplo o contador de minutos de relgios digitais:0,1,2,...,57,58,59,0,1,2,... . A operao modulo ou resto da diviso inteira, tem sintaxe semelhante a deC++: a % b == a-((int)a/b)*b.No tente usar a estrutura de deciso ifainda.

    Mquinas de estados:

    Olhando para o desenho contido no canto direito superior do arquivo da Classe contador, vocconsegue imaginar este contador como uma mquina de estado? O uso de objetos como mquinas deestados um dos conceitos que exemplificaremos deste texto.

    Sintaxe de declarao de mtodos:

    A sintaxe simplificada para a declarao de mtodos de uma classe :especificadordeacessotipoderetorno nomedometodo(listaDeArgumentos) { /*codigo */ }.

    Uma diferena do uso de funes comuns em linguagens no orientadas a objetos e do uso demtodos que como o mtodo est definido na classe, ele ganha acesso direto aos atributos, semprecisar usar o ponto, exemplo um_objeto.atributo;. Lembre-se que as chamadas de mtodos emum programa j se referem a um objeto especfico, embora os mtodos sejam definidos de uma formageral e parametrizada para toda a classe. Volte agora ao mtodo main e verifique sua sintaxe.

  • 7/29/2019 Java Orientado a Objeto

    24/131

    this:

    this uma palavra chave usada num mtodo como referncia para o objeto corrente, ela tem osignificado de: o objeto para o qual este trecho de cdigo est sendo executado.

    Suponha uma classe que possui a seguinte declarao de atributo: public int qualquer; . Sequisermos em um mtodo desta classe alterar o atributo qualquer para o valor 3, basta escrever

    qualquer = 3; , mas este cdigo escrito dentro de um mtodo da classe que declara qualquer, totalmente equivalente a this.qualquer = 3; , sendo o ltimo uma opo mais clara e capaz deeliminar ambiguidades entre os nomes dos atributos de uma classe e os nomes dos argumentos de umdos mtodos desta (quando estes nomes forem iguais). O uso de this tambm vlido fazer parachamadas de mtodos para o objeto corrente.

    Sintaxe de chamada ou acesso a mtodos:

    A sintaxe de chamada ou acesso mtodos semelhante a sintaxe de acesso aos atributos, comexceo dos parnteses que contm a lista de argumentos da funo que implementa o mtodo,mesmo que a lista seja vazia eles devem estar presentes: umcontador.incrementa();. Primeiroinsere-se o nome do objeto e depois a chamada da funo, estes so separados por um ponto.Cuidado para no esquecer os parnteses em programas futuros, este um erro bastante comum.

    Nova verso do programa Circulo:

    Agora reapresentaremos o programa Circulo baseado no exemplo acima, porm um pouco maiscomplicado:

    Mtodo move:

    O mtodo move altera as coordenadas do objeto. O objeto tem suas coordenadas x e y somadas

    com os argumentos dessa funo. Note que este mtodo representa uma maneira mais segura, clara,elegante de alterar as coordenadas do objeto do que acess-las diretamente da seguinte forma: ac.x+= dx;. ac.y += dy;. Lembre-se que ac.x += dx uma abreviao para ac.x = ac.x+dx;.

    Mtodo mostra:

    O mtodo mostra imprime na tela, de forma compacta, os atributos do objeto.

    //Classe circulo

    public class Circulo {

    public float raio;

    public float x;//posicoes em coordenadas cartesianaspublic float y;

    public void move(float dx,float dy) {//move o circulo de lugar

  • 7/29/2019 Java Orientado a Objeto

    25/131

    this.x += dx;y += dy;

    }

    public void mostra()//imprime na tela estado do objeto

    {System.out.println("(" + x + "," + y + "," + raio + ")");}

    } //fim da declaracao da classe

    //Classe principal, Arquivo Principal.Java

    class Principal {

    public static void main(String args[]) {

    Circulo umcirc;//declaracao de atributo circuloumcirc = new Circulo();umcirc.x = 0;umcirc.y = 0;umcirc.raio = 12;

    umcirc.mostra(); umcirc.move(10,10);umcirc.mostra();umcirc.x = 100;

    umcirc.mostra();

    }

    }

    (0,0,12)(10,10,12)(100,10,12)

    Como funcionam no compilador as chamadas de mtodos:

    possvel imaginar que as definies de mtodos ocupam um grande espao na representaointerna dos objetos, mas lembre-se que elas so todas iguais para uma classe ento basta manter paracada classe uma tabela de mtodos que consultada no momento da chamada. Os objetos sprecisam ter uma referncia para esta tabela.

    Exerccios:

    1-Faa as seguintes modificaes no programa HelloInternet:

  • 7/29/2019 Java Orientado a Objeto

    26/131

    Adicione a declarao e inicializao de varivel String logo aps o abre chaves do mtodo main:String nomequalquer;nomequalquer = new String(Uma constante do tipo string);

    Modifique o argumento de println para nomequalquer. No use aspas em nomequalquer,temos uma varivel agora. Execute o programa, qual o resultado?

    2- No programa deste exemplo, crie um mtodo chamado inicializa para a classe Circulo. Estemtodo deve ter como argumentos um valor para x, um para y e outro para o raio, e deve alterar osatributos inicializando-os com os valores passados. Voc pode abstrair o uso desse mtodo como umamaneira de inicializar o objeto de uma s vez embora isto seja feito seqencialmente. Comente asvantagens desta abordagem, comparando com as outras opes, tenha sempre em mente a questo desegurana e consistncia de dados quando avaliar tcnicas diferentes de programao.

    3-No programa anterior, verifique que nada impede que voc acesse diretamente os valores de x ,

    y e raio e os modifique, como alis foi feito nos exemplos anteriores. Como se pode criar umnmero enorme de mtodos : alteraX(float a); moveRaio(float dr); seria desejvel que somenteessas mtodos pudessem modificar x, y e raio garantindo que as operaes executadas nocorrompem o estado do objeto. Voc ver que isso possvel em encapsulamento. Por hora, crieesses mtodos se preocupando em permitir atravs chamadas a eles tudo o que for possvel fazer comacesso direto aos atributos. Comente tambm as duas opes equivalentes de implementao abaixo(os nomes so auto explicativos), tenha em mente o nmero de mtodos a serem criados para garantirflexibilidade a classe:

    umcirculo.multiplicaAtributoX(10);ou

    umcirculo.setX(umcirculo.getX() * 10);//chamadas aninhadas de metodos//o resultado de uma chamada compoe o argumento da outra

    4-Teste o mtodo move com argumentos negativos, exemplo ac.move(-1.0,-1.5);. O resultado

    coerente?

    5-H uma tendncia em definir o maior nmero de mtodos em uma classe, porque nunca se

    pode prever exatamente o seu uso em programas futuros. Comente esta frase, tendo em vista oconceito de portabilidade. Voc j capaz de citar outras medidas que tornem suas classes maisportveis, flexveis e genricas? Leia o exerccio anterior e o exerccio 3.

    MTODOS QUE RETORNAM VALORES.

    At agora s havamos visto mtodos com valor de retorno igual a void. Um mtodo, assimcomo uma funo comum, pode retornar um nico elemento de qualquer tipo, inclusive os definidospelo usurio ou seja: objetos. Sendo assim, sua chamada no programa se aplica a qualquer lugaronde se espera um tipo igual ou equivalente ao tipo do seu valor de retorno, seja numa lista deargumentos de outro mtodo, numa atribuio ou num operador + em System.out.println( variavel+ chamada_de_metodo_que_retorna_valor);

  • 7/29/2019 Java Orientado a Objeto

    27/131

    Classe trava:

    O estado da trava representado no atributo public boolean travado; e pode ser obtido atravsde uma chamada ao mtodo estado(). Este exemplo bastante simples e no tem a pretenso de seruma implementao completa de uma classe que modele uma trava que possa ser usada para evitar o

    acesso a um arquivo, por exemplo.

    public class Trava {

    public String quem; //quem travou ou destravou por ultimo

    public boolean travado;

    public void trave(String q){

    this.travado = true;this.quem = q;}

    public void destrave(String q){this.travado = false;this.quem = q;}

    public boolean estado()

    //estado(true/false) do objeto{return travado;}

    }

    //Classe principal, Arquivo Principal.Java

    public class Principal {

    public static void main(String args[]) {Trava umatrava;

    umatrava=new Trava();umatrava.trave("ProgramaPrincipal");System.out.println(umatrava.estado());umatrava.destrave("ProgramaPrincipal");System.out.println(umatrava.estado());

  • 7/29/2019 Java Orientado a Objeto

    28/131

    }

    }

    truefalse

    //COMENTARIOSA classe trava demasiadamente simples, mas se no o fosse no estaria na parte introdutria

    deste tutorial. Esta classe acaba tendo a funcionalidade de uma varivel booleana e o custo de umobjeto, mas neste ponto cabe a voc melhorar este modelo para representar uma trava de arquivo(armazena o nome e path deste) ou uma trava de um objeto, evitando que este seja alterado.

    Exerccios:

    1- Melhore a classe Contadorde ATRIBUTOS E MTODOS, defina um mtodo que imprime ocontador na tela. Se voc estivesse fazendo um programa para funcionar em uma interface grficacom o usurio este mtodo para imprimir na tela seria o mesmo? Definir um mtodo que retorna umacpia do valor atual do contador garante maior portabilidade? Por qu? Para aprender a retornarvalores consulte este tpico.

    2-Insira um novo mtodo na classe Trava que tenha a funo de alternar entre os estados do

    objeto, independente do estado atual (travado ou destravado). No use a estrutura deciso ifainda, useo operador not que serve para negar um valor booleano: a = !valorbooleano; // !true==false ou

    true == !false.

    3-Implemente a checagem do estado de overflow no exemplo do contador, considere o uso de um

    mtodo retornando um valor do tipo boolean. Considere a adio de um atributo.

    COMPARAO COM UM PROGRAMA EM PASCAL

    Este exemplo de programa em Java semelhante ao exemplo da classe Circulo de ATRIBUTOS, ele ser comparado com um programa escrito em Pascal, alm disso introduzimos um

    novo mtodo chamado inicializa e mtodos public float getRaio(void); e void setRaio(float a).inicializa coloca o ponto nas coordenadas passadas como seus argumentos. A introduo destemtodo prepara a explicao sobre construtores dada no prximo tpico. Para melhor entendimentoleia os exemplos anteriores com a classe Circulo.

    Java: Programa exemplo crculo, baseado no exemplo de ATRIBUTOS://Classe circulo

    public class Circulo {

  • 7/29/2019 Java Orientado a Objeto

    29/131

    public float raio,x,y;

    public void inicializa(float ax,float ay,float ar)//garante o estado do objeto{

    this.x = ax; this.y = ay; this.raio = ar;}

    public void setRaio(float a){this.raio = a;}

    public float getRaio(){return this.raio;}

    public void move(float dx,float dy) {this.x += dx; this.y += dy;}

    public void mostra(){System.out.println("(" + this.x + "," + this.y + "," + this.getRaio()+")");}

    }

    //Classe principal, Arquivo Principal.Java

    public class Principal {

    public static void main(String args[]) {Circulo ac;ac = new Circulo();ac.inicializa(0,0,10);

    ac.mostra();ac.move(1,1);ac.mostra();ac.x = 100;ac.setRaio(12);ac.mostra();

    }

  • 7/29/2019 Java Orientado a Objeto

    30/131

    }

    Disposio dos mtodos e atributos na declarao de uma classe:

    Em uma declarao de uma classe normalmente se coloca a declarao de mtodos depois dadeclarao dos atributos, porm podemos fazer intercalaes ou adotar qualquer ordem que nos

    convenha.Uma boa tcnica de programao, que aconselhamos voc adotar em seus programas usarlinhas de comentrios para delimitar uma rea do cdigo de suas classes que englobe tudo o queinteressa a um usurio desta. Nestes programas exemplos praticamente tudo de interesse de umusurio (cliente) de sua classe, mas nos exemplos mais avanados isto no ser verdade.

    Comentrios:

    Observe que o mtodo mostra chama o mtodo public float getRaio() que da mesma classe.Fica claro da definio de mostra que this.getRaio() se aplica ao mesmo objeto instanciado querecebeu a chamada de mostra. Isto foi feito somente para revelar que chamadas aninhadas de

    mtodos tambm so permitidas, pois nesse caso esta chamada de mtodo poderia ser substituda peloprprio atributo raio, o que seria mais eficiente.

    Programao orientada a objetos e interfaces grficas com o usurio:

    Existem libraries de classes que permitem o programador C++ desenvolver aplicaes paraambientes como o Microsoft Windows de uma maneira bastante abstrata, este um exemplo clarode reuso de cdigo, afinal no preciso saber de detalhes da interface para programar nela.

    Na segunda parte falaremos sobre a Java Aplication Programming Interface que permiteprogramar de maneira bastante abstrata sistemas de interfaces grficas com o usurio seja paraaplicaes para a Internet (rodando em browsers) ou para sistemas como o Windows ou Mac/Os e X-

    Windows .(0,0,10)(1,1,10)(100,1,12)

    Pascal: Um programa parecido s que em Pascal:

    PROGRAM Comparacao;{COMPARACAO COM UM PROGRAMA Java}

    TYPE Circulo=RECORDx:real;{COORDENADAS X E Y}y:real;r:real;{somente dados}

  • 7/29/2019 Java Orientado a Objeto

    31/131

    END;

    var ac:circulo;leitura:integer;

    PROCEDURE Inicializa(var altereme:Circulo;ax,by,cr:real);

    {COLOCA O CIRCULO EM DETERMINADA POSICAO}BEGINaltereme.x:=ax;altereme.y:=by;altereme.r:=cr;

    END;

    PROCEDURE Altera_Raio(var altereme:Circulo;ar:real);{ALTERA O RAIO DO CIRCULO}BEGINaltereme.r:=ar;

    END;

    FUNCTION Retorna_Raio(copieme:Circulo):real;BEGINRetorna_Raio:=copieme.r;

    END;

    PROCEDURE Move(var altereme:Circulo;dx,dy:real);{MODE AS COORDENADAS X E Y ACRESCENTANDO DX E DY}BEGINaltereme.x:=altereme.x+dx;

    altereme.y:=altereme.y+dy;END;

    PROCEDURE Mostra(copieme:Circulo);{MOSTRA O CIRCULO NA TELA}BEGINwriteln('X:',copieme.x,' Y:',copieme.y,' R:',copieme.r);

    END;

    BEGIN{TESTES}Inicializa(ac,0.0,0.0,10.0);Mostra(ac);Move(ac,1.0,1.0);Mostra(ac);ac.x:=100.0;Altera_Raio(ac,12.0);Mostra(ac);read(leitura);

  • 7/29/2019 Java Orientado a Objeto

    32/131

    END.

    X: 0.0000000000E+00 Y: 0.0000000000E+00 R: 1.0000000000E+01X: 1.0000000000E+00 Y: 1.0000000000E+00 R: 1.0000000000E+01X: 1.0000000000E+02 Y: 1.0000000000E+00 R: 1.2000000000E+01

    //COMENTARIOS JAVA:

    As classes em Java so compostas de atributos e mtodos. Para executar uma ao sobre oobjeto ou relativa a este basta chamar um mtodo : ac.mostra(); O mtodo no precisa de muitosargumentos, porque prprio da classe e portanto ganha acesso aos atributos do objeto para ao qualela foi associado:

    public float getRaio(void){ return raio; //tenho acesso direto a raio. }

    { COMEntArios Pascal: }

    Em Pascal os procedimentos e os dados so criados de forma separada, mesmo que s tenhamsentido juntos. A juno entre os dados e procedimentos se d atravs de passagem de parmetros. Nocaso de uma linguagem procedural, o que normalmente feito se assemelha ao cdigo seguinte:Move(ac, 1.0,1.0);. Nesse caso AC um record, algo semelhante ao struct de C (no C++).Move, acessa os dados do record alterando os campos. O parmetro passado por referncia e oprocedimento definido a parte do registro, embora s sirva para aceitar argumentos do tipo Circuloe mover suas coordenadas.

    Segurana:

    Em ambos programas (Pascal, Java) o programador pode obter acesso direto aos dados do tipodefinido pelo usurio:ac.x := 100.0; (Pascal) ou ac.x = 100.0; (Java).

    Veremos em ENCAPSULAMENTO maneiras de proibir este tipo de acesso direto ao atributo,deixando este ser modificado somente pelos mtodos. Isto nos garante maior segurana e liberdadepois podemos permitir ou no o acesso para cada atributo de acordo com nossa vontade.

    Eficincia:

    Algum pode argumentar que programas que usam bastante chamadas de mtodos podem setornar pouco eficientes e que poderia ser melhor obter acesso direto aos dados de um tipo definido

    pelo usurio ao envs de passar por todo o trabalho de cpia de argumentos, insero de funo napilha, etc.Em verdade no se perde muito em eficincia, por que tal metodologia de programao nos leva

    a organizar o cdigo de maneira mais compacta. E alm disso muitas vezes no se deseja permitirsempre o acesso direto aos dados de um tipo definido pelo usurio por razes de segurana.

    Exerccios:

    1-

  • 7/29/2019 Java Orientado a Objeto

    33/131

    Implemente outros mtodos do estilo publicvoid setRaio(float a)e float getRaio() para osatributos X e Y. Mas leve o seguinte padro de programao Java em conta. Para uma data varivelou attributo X os mtodos altera e retorna devem ser chamados na verdade de setX() and getX().Veja o tpico anterior chamado Acessores de atributos para detalhes sobre esse padro ouconveno.

    2- Faa um programa simples para testar uma classe que representa um mouse e que fornece aposio na tela, os indicadores de estado dos botes e os mtodos: clica_botao( );move(float dx,float dy);. No preciso fazer a ligao do objeto com o mouse real, embora o leitor interessadopossa encontrar na segunda parte subsdios para esta tarefa.

    Seu mouse deve ser capaz de caminhar para qualquer lugar da tela atravs de chamadas demtodos, no deve ultrapassar os limites estabelecidos, deve indicar o boto est pressionado ou noatravs de um mtodo semelhante ao mostra( ) deste exemplo. O mouse deve ter de 1 boto. Vocpode substituir mtodo move(float dx, float dy) por combinaes de move_x(float dx); emove_y(float dy);

    Voc pode achar o fato de o mouse ser obrigado a ter um boto um tanto estranho, mas no . Osmouses dos machintoshes tm um boto, alguns mouses de pcs tm dois botes e mouses deworkstations tm trs botes. Para seu programa ser portvel ele deve contar apenas com a existnciade um boto e isso vale a pena quando se fala em portabilidade. O que tem sido usado em casosextremos a combinao de pressionamento dos botes e pressionamento de teclas para diferenciarcertas aes.

    3-Verifique que em main() voc pode modificar o atributo x do objeto da classe Circulo da

    seguinte forma: a.x = 12.2; . Isto pode no ser muito til, imagine-se criando uma library (em Javapackage) que implementa a classe Circulo e uma srie de mtodos relacionados, por certas razesvoc gostaria que o usurio se limitasse ao uso da interface do objeto, como faz-lo ser explicado emencapsulamento.Por hora, apenas crie mtodos que sirvam como alternativas a este tipo de acessodireto.

    CONSTRUTORES

    Construtores so mtodos especiais chamados pelo sistema no momento da criao de umobjeto. Eles no possuem valor de retorno, porque voc no pode chamar um construtor para umobjeto, voc s usa o construtor no momento da inicializao do objeto. Construtores representamuma oportunidade de inicializar seus dados de forma organizada, imagine se voc esquece deinicializar corretamente ou o faz duas vezes, etc.

    Um construtor tem sempre o mesmo nome da classe a qual pertence. Para a classe String, pr-definida na linguagem o construtor tem a forma String(Constante do tipo String); com oargumento entre aspas que especificado pelo programador como um valor literal de string. Ele seriachamado automaticamente no momento da criao, declarao de uma String, sem necessidade deuso do nome do construtor como mtodo, apenas dos argumentos:

    String a;a=new String(Texto); //alocacao e inicializacao atraves do construtora.mostra(); //mostra so pode ser chamada depois do construtor

    Nos exemplos anteriores tambm usvamos construtores no momento de inicializar nossosobjetos, s que eles no possuam argumentos.

  • 7/29/2019 Java Orientado a Objeto

    34/131

    Existem variaes sobre o tema que veremos mais tarde: sobrecarga de construtor, copyconstructor, construtor de corpo vazio. O exemplo a seguir simples, semelhante aos anteriores,preste ateno no mtodo com o mesmo nome que a classe, este o construtor:

    //Classe ponto

    public class Ponto {

    public float x,y;

    public Ponto(float ax,float ay) // sempre omita o valor de retorno!//garante o estado do objeto{this.x = ax; this.y = ay;}

    public void move(float dx,float dy){this.x += dx; this.y += dy;}

    public void mostra(){System.out.println("(" + this.x + "," + this.y + ")");}

    }

    //Classe principal, Arquivo Principal.java

    public class Principal {

    public static void main(String args[]) {Ponto ap;ap = new Ponto((float)0.0, (float)0.0);ap.mostra();

    ap.move(1,1);ap.mostra();ap.x = 100;ap.mostra();

    }

    }

  • 7/29/2019 Java Orientado a Objeto

    35/131

    (0,0)(1,1)(100,1)

    //COMENTARIOS:

    Note que com a definio do construtor, voc obrigado a passar os argumentos deste nomomento da alocao do objeto. Se voc precisa ter a opo de no passar esses valores ou passaroutros, as possveis solues sero dadas em POLIMORFISMO, CLASSES ABSTRATAS.

    (float)0.0 indica que para ser feita a converso de 1.0 para ponto flutuante. 1.0 sozinho considerado double. (int)1.0 igual a 1. (int) 2.3 igual a dois. Esta operao indicada por(nometipo)tipo_a_ser_convertido tambm chamada de type cast.

    A ocorrncia de rotinas de criao de objetos em diversos locais de um programa muitocomum. Objetos podem ser criados dentro de estruturas condicionais, armazenados em arquivos,passados como parmetros, inseridos em estruturas dinmicas dentro de outros objetos, etc.

    Exerccios:1-

    Um mtodo pode chamar outro mtodo da mesma classe. Parta do exemplo de e crie umconstrutor que chama o antigo mtodo inicializa(float a,float b) repassando os argumentos doconstrutor:

    ponto(float a, float b){ inicializa(a,b); }

    Na chamada de inicializa() fica implcito que ela se aplica ao objeto cujo construtor foichamado. Isto vlido tambm para outros mtodos que chamam mtodos, ou seja, no necessrioo operadoridentificador.inicializa(a,b); , veja o uso de this.

    Este exerccio til para mostrar outro recurso de Java, o ponteiro this. this uma palavrareservada e dentro de qualquer mtodo this um ponteiro para o objeto em questo, ento o cdigodescrito acima poderia tambm assumir a seguinte forma equivalente:

    ponto(float a, float b){ this.inicializa(a,b); } //Verifique!

    lgico que neste exemplo this no tem muita utilidade, mas existem casos onde um objetoprecisa passar seu ponteiro para alguma funo que o modifica, ou fica possuindo uma refernciapara ele, ento usa-se this. Veremos outras aplicaes mais adiante.

    2-Introduza mensagens no construtor tipo: System.out.println(Objeto instanciado); introduza

    trechos parecidos em outros pontos de seu programa. O objetivo acompanhar visualmente aseqncia de criao e modificao dos objetos.

    3-Esta classe Ponto pode ser adaptada para funcionar como representao de vetores em duas

    dimenses, para tal fornea outros mtodos teis: mtodos para tornar o vetor unitrio, retornar omdulo do vetor, a componente x e y. Para tal voc ter que fazer uso de Math.cos(double a);Math.sin(double a); e Math.sqrt(double a); , respectivamente o cosseno, o seno e a raiz quadradade um ponto flutuante de dupla preciso. No necessrio fazer nada semelhante a um include de C+

  • 7/29/2019 Java Orientado a Objeto

    36/131

    + para usar esses mtodos, basta adicion-los ao seu cdigo, outro mtodo til Math.max(a,b); queretorna o maior valor entre a e b (float, double, int. long, etc). Use type cast explicado noscomentrios deste exemplo.

    4-Crie uma classe reta que tem como atributos dois objetos da classe ponto. Dica: No use

    construtores, use funes do tipo inicializa(), j apresentadas. Quando seu programa ficar prontoacrescente mtodos para esta reta tais como inclinao, coeficiente linear, etc. Para acrescentarconstrutores leia mais adiante. Existem maneiras mais eficientes e compactas de representar umareta, porm faa como foi sugerido, neste caso o objetivo no eficincia.

    CONSTRUTORES E AGREGAO

    Este exemplo o resultado do exerccio anterior (exerccio 4 tpico CONSTRUTORES), elecria uma classe Reta com dois atributos da classe Ponto. Ou seja voc estar reutilizando a classePonto na classe que representa uma Reta, a forma como essa reutilizao de cdigo ocorre

    chamada de agregao.O nome reutilizao de cdigo bastante apropriado, pois a classe Reta estar utilizando todosos mtodos escritos para a classe Ponto. Em casos como este comum dizer que a classe Reta cliente da classe Ponto em uma analogia com as relaes comerciais.

    Este programa busca chamar sua ateno para o fato de que objetos so alocados dinamicamentee que caso voc se esquea de aloc-los, eles ficam possuindo o valor null. Obter acesso a umavarivel com valornull um erro que geralmente verificado em tempo de execuo.

    Nos programas anteriores alocar os objetos era fcil, mas agora que temos objetos funcionandodentro de outros objetos h necessidade de adotar tcnicas melhores. Veremos a seguir duasalternativas para alocar os atributos Ponto presentes na classe Reta:

    Alternativa 1:Primeiro aloca-se o objeto da classe Reta, depois chama-se para cada atributo da classe Ponto arotina de alocao:

    Reta r1;r1 = new Reta();r1.ponto1 = new Ponto((float)1.0, (float)2.0);r1.ponto2 = new Ponto((float)3.0, (float)4.0);

    Esta alternativa em muitos casos pior que a seguinte.

    Alternativa 2:Passamos para o construtor da classe Reta a tarefa de alocar e inicializar os atributos de forma

    coerente. Os argumentos do construtor da classe Reta passam a conter valores teis para a chamadados construtores de seus atributos. Esta alternativa executada pelo programa a seguir:

    //Reutilize o arquivo da classe Ponto definida anteriormente.//Classe Reta

    class Reta {

  • 7/29/2019 Java Orientado a Objeto

    37/131

    public Ponto a,b;

    public Reta(float ax, float ay, float bx, float by) //construtor com argumentos{a = new Ponto(ax, ay); //chamadas dos contrutores da classe Pontob = new Ponto(bx, by);

    }

    public void mostra(){a.mostra();b.mostra();

    }

    }

    //Classe principal, Arquivo Principal.java

    class Principal {

    public static void main(String args[]) {Reta ar;

    ar=new Reta((float)0.0,(float)0.0,(float)1.0,(float)1.0);ar.mostra();}

    }

    Alguns podem argumentar que esta maneira de representar uma reta no muito eficiente, masno do escopo deste texto tratar de problemas dessa natureza, o que alis complicaria muito ocdigo, desviando-nos do objetivo principal: simplicidade na apresentao de conceitos de orientaoa objetos. O leitor deve ampliar os modelos aqui sugeridos em aplicaes na sua rea de interesse.Como ainda faltam conceitos importantes para serem apresentados este tipo de aplicao deve serfeita em paralelo com a leitura.

    Exerccios:

    1-

    Implemente um programa que use a mesma lgica do exemplo anterior para criar uma classecomposta de outras . Voc estar usando agregao. Por exemplo um tringulo precisa de trs pontospara ser definido ou uma pessoa possui um endereo residencial.

    2-Uma implementao mais eficiente da classe Reta seria feita armazenando apenas um

    coeficiente angular e um linear, mas esta reta deveria prover tambm um construtor que aceitasse doispontos como argumentos. Como voc no aprendeu sobrecarga de construtores (definir vriosconstrutores), use s um construtor que tem coeficiente angular e linear como argumentos e

  • 7/29/2019 Java Orientado a Objeto

    38/131

    implemente esta nova classe reta (sem usar agregao agora).

    3-Defina um mtodo para a classe Reta que retorna o ponto de intercesso com outra reta: public

    Ponto intercessao(Reta a);. No se esquea de tratar os casos degenerados, tais como retasparalelas e coincidentes, use por exemplo mensagens de erro ou valor de retorno igual a null.

    Verifique que um mtodo de uma reta recebe outra reta (mesmo tipo) como argumento. Dentro domtodo os atributos do argumento a devem ser acessados do seguinte modo:ap1.x;

    Mais tarde, em tratamento de excees, veremos maneiras melhores de lidar com esses casosdegenerados.

    4-Defina um mtodo chamado move para a classe Reta, lembre-se de mover os dois pontos

    juntos (a inclinao no deve mudar).

    5-Defina um mtodo publicvoid gira(tipox angulo); para a classe Reta. Este mtodo recebe um

    ngulo como argumento, voc pode optar por representar o ngulo em radianos (float) ou criar aclasse ngulo (graus, minutos, segundos). Resolva tambm o problema da escolha do ponto em tornodo qual a reta deve ser girada (voc pode usar mais de um argumento). Use funes matemticas(seno cosseno) e outras descritas no exerccio 3 anterior.

    DESTRUTORES OU finalizers

    A presena de coleta automtica de lixo torna o conceito de destrutores um pouco diferente deseus equivalentes em outras linguagens orientadas a objetos. Em Java destrutores so mtodos

    chamados pelo sistema quando a memria de um objeto est para ser liberada pelo coletor automticode lixo (no quando est para ser coletada).A sintaxe dos destrutores a seguinte:

    protected void finalize() {//codigo para arrumar a casa, antes que o objeto seja apagado

    }Note que o que caracteriza o construtor ter o mesmo nome da classe, j o destrutor

    caracterizado por possuir o nome finalize. Voc pode chamar o destrutor, mas isso no implica que oobjeto ser deletado. Ao contrrio dos construtores, os destrutores no tem argumentos, mas possuemvalor de retorno que igual a void.

    Os destrutores so muito teis para limpar a casa quando um objeto deixa de ser usado. Umexemplo bastante comum do uso de destrutores o de um objeto que lida com arquivos que devemser fechados quando o objeto for destrudo. Existem outros casos onde um objeto deve comunicar aosoutros objetos que ser inutilizado, destrudo, ou seja : sair do programa.

    Em Java, que possui coleta automtica de lixo, um objeto passa ano existir mais no programa quando nenhuma varivel faz referncia aele. Nesse ponto, ele armazenado no coletor automtico de lixo, ondereceber o tratamento adequado. Um n de uma lista ligada pode serapagado simplesmente fazendo o n anterior apontar para o posterior aele. Os programadores no acostumados com esse conceito precisamouvir a seguinte frase: Voc no obrigado a liberar explicitamente a

  • 7/29/2019 Java Orientado a Objeto

    39/131

    memria de um objeto como feito em C++ e outras linguagens.Se estivssemos por exemplo em C++, que no possui coleta automtica de lixo, o destrutor

    seria chamado sempre que a memria de um objeto fosse desalocada, o que feito pelo programadoratravs de uma chamada a delete nomedoobjeto(); .

    Em Java a liberao de memria que feita pelo coletor automtico de lixo que executado demodo assncrono com o restante do programa, ou seja voc no pode contar com o fato de que o

    destrutor ser chamado imediatamente aps o momento em que seu objeto sai de escopo, a no serque o programa seja executado com o modo assncrono do coletor automtico de lixo desligado (java-noasyncgc NomePrograma).

    PONTEIROS, POINTERS, REFERNCIAS E OBJETOS

    Algum pode ter achado estranho que no foram discutidos ponteiros em Java, ocorre que elesno existem nessa linguagem. Existem estudos que afirmam que erros com ponteiros so um dosprincipais geradores de bugs em programas, alm disso com todos os recursos que temos noprecisaremos deles.

    Os programadores acostumados ao uso de ponteiros (e aos erros decorrentes desse uso), acharomuito natural e segura a transio para Java onde passaro a usar principalmente vetores e classes. Aestruturao de seu cdigo dever agora ser feita em um modelo que se baseia no uso de objetos(vetores e Strings tambm so objetos). Objetos superam a representatividade obtida com records,funes isoladas e ponteiros.

    De certo modo voc estar usando referncias, mas de forma implcita. Por exemplo: objetos soalocados dinamicamente com new, eles so referncias ou ponteiros para posies na memria, masa linguagem mascara este fato por razes de segurana. Como objetos so ponteiros (s quetransparentes para voc), nos depararemos com o problema de reference aliasing quando discutirmoscpia de objetos com outros objetos como atributos.

    PASSAGEM POR REFERNCIA

    Linguagens como Pascal ou C criam meios de passar parmetros por valor ou por referncia.Como Java no possui ponteiros, a passagem por referncia deve ser feita atravs de objetos. Se oparmetro j um objeto, ento a passagem dele obrigatoriamente por referncia.

    No caso de tipos simples, podemos pass-los dentro de vetores que so objetos, ou ento criarclasses para embalar, empacotar estes tipos. Dada a necessidade destas classes, elas j foramdefinidas na linguagem. So classes definidas para conter cada tipo bsicos e permitir certasconverses entre eles, falaremos destas classes conforme necessitarmos de seu uso. As vezes estasclasses so chamadas de wrappers.

    Exerccios:

    1-class X {

    public void troca(X valores){

    int a;

  • 7/29/2019 Java Orientado a Objeto

    40/131

    a = val;val = valores.val;valores.val = a;

    }//imprima os atributos de um objeto OBJ da classe X//chame o metodo troca de outro objeto, usando OBJ como argumeto

    //verifique a alteracao nos atributos desse argumentoO cdigo acima mostra como definir um mtodo que usa a existncia implcita de ponteiros nalinguagem para criar um mtodo que troca os atributos de dois objetos da mesma classe. Implementeeste mtodo e faa os testes sugeridos nos comentrios desse cdigo.

    VETORES E MATRIZES

    Vetores so objetos, eles possuem papel importante no estilo de programao desta linguagemque exclui ponteiros. Por serem objetos, vetores so obrigatoriamente alocados de maneira dinmica.O exemplo a seguir aloca um vetor de inteiros com trs posies, seguindo uma sintaxe semelhante a

    de alocao de objetos:

    class VetorTest {public static void main (String args[]) {

    int vetor[] = new int[3]; vetor[0] = 0; //indexacao semelhante a C , C++ vetor[1] = 10; vetor[2] = 20; System.out.println(vetor[0] + " " + vetor[1] + " " + vetor[2] + " ");

    }

    }

    0 10 20

    Resumo da sintaxe de vetores:int a[]; //declara vetor de inteiros aa = new int[10]; //aloca vetor a com dez posicoes//as duas linhas anteriores podem ser abreviadas por:

    int a[] = new int[10];//alem disso se voce quiser inicializar o vetor a, ja na declaracao:int a[3] = {0,10,20};

    O anlogo para matrizes :int a[][]; //declara matriz de inteiros aa = new int[3][3]; //aloca matriz 3x3, 9 celulas//as duas linhas anteriores podem ser abreviadas por:int a[] = new int[3][3];

  • 7/29/2019 Java Orientado a Objeto

    41/131

    //alem disso se voce quiser inicializar a matriz a ja na declaracao:int a[3][3] = {{0,10,20},{30,40,50},{60,70,80}};

    Em mtodos, argumentos e valores de retorno que so vetores, so escritos da seguinte forma:int[] , ou tipo[] nomedavariavel //no caso de argumentos.

    Diagrama do vetor:

    Perceba que a faixa til do vetor vai de 0 at (n-1) onde n o valor dado como tamanho dovetor no momento de sua criao, no nosso caso 3. O mesmo ocorre com matrizes. Esta convenopode confundir programadores Pascal onde a indexao vai de 1 at n.

    Java checa se voc usa corretamente os ndices do vetor. Se ocorrer um acesso ao vetor[i]onde i um ndice invlido (fora da faixa de valores permitidos), voc receber uma mensagem

    parecida com: java.lang.ArrayIndexOutOfBoundsException: #. Retornaremos ao assunto destamensagem mais adiante, ela uma exceo gerada pelo cdigo que acompanha a linguagem.

    Existe um atributo muito til quando se trabalha em um vetor de dados:a.length; //armazena o numero de elementos do vetor a

    Declarar um vetor de objetos, por exemplo objetos da classe Ponto, no implica que osobjetos de cada posio do vetor j estaro inicializados, para inicializar os elementos, siga seguintesintaxe:

    Ponto a[]; //declaracao, todas as posicoes com nulla = new Ponto[3]; //alocacaofor (int i = 0; i < a.length(); i++) { a[i] = new Ponto(0,0); } //inicializacao

    (o cdigo acima representa um dos usos de vetores no lugar de ponteiros)

    Exerccios:

    1-Escreva um programa simples que toma um vetor de preos e um de descontos (50%=.5), e

    altera o vetor de preos de modo que estes produtos j incluam os descontos no seu valor de venda.Exemplo:

    Preos : 40,5 30,3 12,6 100Descontos: .5 .3 .2 .5Vetor calculado: 20.25 9.09 2.52 50

    A linguagem Java ser muito usada no comrcio da internet, tabelinhas assim, usadas paraclculos de preos de produtos j esto se tornando comuns. Os nomes que voc pode dar as classes emtodos so:Classe: TabelaPrecos

    Atributo: boolean ComDesconto;

    Atributo: double[] Precos;

    Mtodo: void AplicaDescontos(int[] descontos);

  • 7/29/2019 Java Orientado a Objeto

    42/131

    COPIA , COMPARAO E DETERMINAO DA CLASSE EM OBJETOS

    Objetos so implicitamente referncias, portanto sua cpia (atravs do operador =) est sujeitaao problema de reference aliasing e efeitos colaterais. A comparao de objetos atravs do operador== tem o significado da comparao de referncias, ou seja ela verifica se os objetos7 compartilham omesmo espao alocado na memria.

    Observe que com as operaes conhecidas at agora, no conseguimos comparar dois objetosquanto ao contedo a no ser que comparemos atributo por atributo, o mesmo vale para a cpia.Seria til dispor de um conjunto de operaes de igualdade, desigualdade e copia que se

    aplicasse ao contedo dos objetos e no ao endereo de memria de suas variveis. Uma outranecessidade seria verificar a classe de um objeto em tempo de execuo. Antes de ver a soluoprocure sentir o problema no exemplo a seguir:

    Usaremos o arquivo da classe Ponto, j apresentado em CONSTRUTORES, mas com umamodificao no mtodo mostra. No lugar de mostra criaremos um mtodo chamado public StringtoString(). Este mtodo padro em muitas classes e deve ser definido de modo a retornar umaString descritiva do objeto. Fazendo isto voc pode concatenar uma varivel Ponto com uma Stringno argumento do mtodo System.out.println(meuPonto1 + Na vizinhanca de +

    meuPonto2);. Esta deciso de implementao certamente mais genrica que mostra, visto quenem sempre estaremos imprimindo atravs de System.out.println(), por exemplo na segunda parteocorrero casos em que temos que pintar Strings em reas especiais na tela.

    Apresentao do problema

    //Classe ponto

    class Ponto {

    public float x,y;

    public Ponto(float ax,float ay) { //omita o valor de retorno! garante o estado do objetothis.x = ax; this.y = ay;

    }

    public void move(float dx,float dy) {this.x += dx; this.y += dy;

    }

    public String toString() {return "(" + this.x + "," + this.y + ")"; //(x,y)

    }

    }

    //Classe principal, Arquivo Principal.java

    class Principal {

    7 Strings e vetores so objetos de classes pr definidas na linguagem, portanto as afirmaes feitas aqui se aplicam a elestambm.

  • 7/29/2019 Java Orientado a Objeto

    43/131

    public static void main(String args[]) {

    //preparacao das variaveis copia de objetosPonto pOriginal, pAlias, pCopia;pOriginal = new Ponto((float)0.0,0.0f); //(float)0.0 ou 0.0f; 0.0 eh doublepAlias = pOriginal; //copiando atraves de atribuica

    pCopia = new Ponto(pOriginal.x, pOriginal.y); //copiando atributo por atributo

    //resultadosSystem.out.println("Original:" + pOriginal);System.out.println("Alias:" + pOriginal);System.out.println("Modificando Alias.x para 2");pAlias.x = 2.0f;System.out.println("Veja como o original ficou:" + pOriginal);System.out.println("pCopia nao se modifica:" + pCopia);

    //comparacao de objetos

    System.out.println("Original==Alias:" + (pOriginal == pAlias) );System.out.println("Copia==Original:" + (pCopia == pOriginal) );System.out.println("Deixando atributos de Copia iguais aos de Original");pCopia.x = 2;System.out.println("Copia==Original:" + (pCopia == pOriginal) );System.out.println("Original.x==Copia.x:" + (pCopia.x == pOriginal.x) );System.out.println("Original.y==Copia.y:" + (pCopia.y == pOriginal.y) );

    }

    Original:(0,0)Alias:(0,0)Modificando Alias.x para 2Veja como o original ficou:(2,0)pCopia nao se modifica:(0,0)Original==Alis:trueCopia==Original:falseDeixando atributos de copia iguais aos de OriginalCopia==Original:falseOriginal.x==Copia.x:trueOriginal.y==Copia.y:true

    //COMENTARIOS

    //preparacao das variaveis, copia de objetos:pAlias e uma referncia para o mesmo local de memria que pOriginal, por este motivo

    quando pAlias alterado, pOriginal se altera por efeito colateral, eles compartilham o mesmoobjeto pois a atribuio pAlias = pOriginal, copia o endereo de pOriginal.

    J pCopia, o resultado de uma nova alocao de memria, portanto um novo endereo, umobjeto independente dos outros.

    //comparacao de objetos:

  • 7/29/2019 Java Orientado a Objeto

    44/131

    pOriginal == pAlias e outras comparaes equivalentes tm o significado de comparao doendereo de memria e no do contedo.

    pOriginal.x == pCopia.x tem o significado de comparao do valor desses atributos, assimcomo uma comparao entre inteiros. Se esses atributos por sua vez fossem objetos (tipo Integeraoenvs de int), esta operao teria o significado de comparao entre endereos de memria dosobjetos.

    As possveis solues, comentadas incluindo verificao da classe dos objetos

    //Classe Ponto

    class Ponto {

    public float x,y;

    public Ponto(float ax,float ay) { //omita o valor de retorno!//ga