Você está na página 1de 71

TUTORIAL: "A LINGUAGEM DE PROGRAMAO JAVA"

ORIENTAO A OBJETOS Instituto de Computao junho, 96 Andr Augusto Cesta. aacesta@dcc.unicamp.br Orientadora: Profa Dra Ceclia Mary Fischer Rubira 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 (URL's) , texto ou do cdigo reutilizado nos programas exemplo. Para obter a ltima verso deste texto consulte http://www.dcc.unicamp.br/~aacesta ou http://www.dcc.unicamp.br Marcas Registradas: Sun , o logotipo da Sun, Sun Microsystems, Solaris, HotJava e Java so marcas registradas de Sun 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 Conpany, Ltd.. Netscape Navigator marca registrada de: "Netscape Communications Corporation". Prefcio: Este texto faz parte de um estudo comparativo de linguagens de programao orientadas a objetos. O contedo deste estudo tambm est disponvel na "World Wide Web", rea multmidia da internet, sob o endereo http://www.dcc.unicamp.br/~aacesta . Neste endereo, voc pode complementar seu aprendizado, rodando exerccios iterativos, acessando "links" para outros hipertextos sobre linguagens de programao, vendo exemplos de programas e interagindo com aplicaes para a internet. 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 detalhes normalmente ignorados em livros, tornaro seu aprendizado mais fcil, principalmente na segunda parte onde tratamos da construo de aplicaes para a internet. No inicio, os exemplos podem ser considerados fceis, mas eles vo se complicando cada vez mais de modo que importante que o leitor acompanhe o texto fazendo os exerccios. Forneceremos uma srie de idias de programas simples para que voc possa testar seu conhecimento. Estes programas simples sero melhorados no segundo volume, atravs do uso de interfaces grficas. 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 (poca do seu lanamento) 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 as pginas encontradas na WWW, frequentemente voc encontrar diagramas como o seguinte:

TUTORIAL

http://www.dcc.unicamp.br/~aacesta "Homepage:tutorial" "Estudo

comparativo de linguagens de programao orientadas a objetos". Nesta pgina voc encontrar tutoriais sobre diversas linguagens orientadas a objetos, dentre elas: C++, Modula-3, Java. Quanto a Java, voc ter a oportunidade de ver cdigo 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 seu estudo. A parte escrita em letra maior o endereo, o texto em itlico faz um resumo do contedo desta 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 encontre alguma palavra desconhecida, basta usar o ndice remissivo para obter sua

O diagrama acima aparecer toda vez que introduzirmos uma palavra nova. Caso voc encontre alguma palavra desconhecida, basta usar o ndice remissivo para obter sua definio. importante lembrar que os hipertextos citados neste tutorial, no so de nossa responsabilidade. Como eles esto sujeitos a mudanas, contamos com a sua ajuda para efetuarmos atualizaes, conte voc tambm com a nossa ajuda na internet. 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 aparecem desmembrados de seus arquivos, tem fundo cinza claro. Todos os arquivos presentes dentro dos retngulos, so arquivos "text-only", qualquer formatao (negrito) tem apenas funo didtica.

Os resultados dos programas so indicados pelo diagrama ao lado:

DIVISO DO TUTORIAL Apresentao do modelo de objetos da linguagem e conceitos relacionados tais como polimorfismo, tratamento de excees , etc. Ao longo dessa apresentao, em segundo plano, voc aprender os aspectos bsicos da linguagem tais como "loops", desvios condicionais, etc. Este tutorial no cobre a parte de interfaces grficas e nem de networking da linguagem. Vale lembrar que Java uma linguagem de pro psito geral e que saber orientao a objetos nela vai torna-lo um programador mais eficiente, organizado, etc. A maioria dos leitores fica ansiosa para aprender como criar aplicaes para a internet, mas depois de satisfeita esta ansiedade voltam para o ponto onde aprendem como programar na linguagem e no apenas experimentar com a criao de botes, caixas de dilogo, imagens, etc. Se esse o seu caso, recomendvel um "tour" pela WWW antes de comear a programar, um bom "site" para comear a pesquisar com um "browser" compatvel com Java (Netscape Navigator 2.0 ou superior) :

APPLETS

http://www.Javasoft.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 em documentos 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"Applets:definio".

ADQUIRINDO O SOFTWARE NECESSRIO, PLATAFORMAS SUPORTADAS Um ambiente de programao Java normalmente composto de um kit de desenvolvimento de aplicaes Java e um "browser compatvel com esta linguagem (recomendvel). Se voc no tem acesso a esse ambiente de programao, tente estes endereos:

http://Java.sun.com"Homepage:Sun" . Raiz do hipertexto montado pelos "DOWNLOAD" JAVA criadores da linguagem. Sob este endereo voc pode obter o compilador e outras ferramentas de desenvolvimento de aplicaes Java para a sua plataforma de programao. Fique atento! Outros desenvolvedores esto criando ambientes de programao Java.

http://www.netscape.com"Homepage:Netscape" "DOWNLOAD" "BROWSERS"

Raiz do hipertexto montado pelos

criadores do Netscape Navigator. Sob este endereo voc pode obter o browser "Java compatible" da "Netscape Comunications INC'.. Outros desenvolvedores esto lanando "browsers" compatveis com Java.

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. "Browsers"

CARACTERSTICAS DA LINGUAGEM Parecida com C, C++:

Parecida com C, C++: Java tem a aparncia de C ou de C++, embora a filosofia da linguagem seja diferente. Por este motivo estaremos frequentemente fazendo comparaes alguma destas linguagens. O leitor que programa em qualquer uma delas, ou em uma linguagem orientada a objetos, se sentir mais a vontade e se tornar um bom programador Java 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 so totalmente novas. Java uma feliz unio de tecnologias testadas por vrios centros de pesquisa e desenvolvimento de software. Compilada: Um programa em Java compilado para o chamado "byte-code", que prximo as instrues de mquina, mas no de uma mquina real. O "byte-code" um cdigo de uma mquina virtual idealizada pelos criadores da linguagem. Por isso Java pode ser mais rpida do que se fosse simplesmente 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 2.3, Windows-NT, Windows-95, Mac/Os etc) . No necessrio recompilar um programa para que ele rode numa mquina e sistema diferente, ao contrrio do que acontece por exemplo com programas escritos em C e outras linguagens. Esta portabilidade importante para a criao de aplicaes para a heterognea internet. Muitos d os programas exemplo deste tutorial foram escritos e compilados numa plataforma Windows-95 e rodaram perfeitamente quando simplesmente copiados para uma plataforma Solaris 2.3. Em Java um inteiro por exemplo, tem sempre 32 bits, independentemente da arquitetura. O prprio compilador Java escrito em Java, de modo que ele portvel para qualquer sistema que possua o interpretador de "bytecodes". Um exemplo de programa escrito em Java o browser hotjava. Orientada a Objetos: A portabilidade uma das caractersticas que se inclui nos objetivos almejados por uma linguagem orientada a objetos. Em Java ela foi obtida de maneira inovadora com relao ao grupo atual de linguagens orientadas a objetos. Java suporta herana, mas no herana mltipla. A ausncia de herana mltipla pode ser compensada 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 classes abstratas. Outra caracterstica importante em linguagens orientadas 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 cometem quando so obrigados a gerenciar diretamente a memria (C , C++, Pascal ). A eliminao do uso de ponteiros, em favor do uso de vetores, objetos e outras estruturas substitutivas traz benefcios em termos de segurana. O programador proibido de acessar a memria que no pertence ao seu programa, alm de no ter chances de cometer erros comuns tais como "reference aliasing" e uso indevido de aritmtica de ponteiros. Estas medidas so particularmente teis quando pensarmos em aplicaes comerciais desenvolvidas para a internet, objeto do segundo volume deste texto. Ser "strongly typed" tambm uma vantagem em termos de segurana, que est aliada a eliminao de converses implcitas de tipos de C++. A presena de mecanismos de tratamento de excees torna as aplicaes mais robustas, no permitindo que elas abortem, mesmo quando rodando sob condies anormais. O tratamento de excees ser til na segunda parte para modelar situaes tais como falhas de transmisso e formatos incompatveis de arquivos. Suporta concorrncia: A linguagem permite a criao de maneira fcil, de vrios "threads" de execuo. Este tpico ser abordado em animaes (segundo volume) , e particularmente til nos ambientes em que aplicaes Java so suportadas, ambientes estes que geralmente podem mapear os threads da linguagem em processamento paralelo real. 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 "scripting" existentes, embora seja cerca de 20 vezes mais lenta que C, o que no um marco definitivo. Com a evoluo da linguagem, sero criados geradores de "bytecodes" cada vez mais otimizados que traro as marcas de performance da linguagem mais prximas das de C++ e C. Alm disso um dia Java permitir a possibilidade de gerar cdigo executvel 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. Estes tpicos sero abordados em um terceiro volume desta srie.

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:

http://www.dcc.unicamp.br/~aacesta/java/group.html (Clique em brewing Java "DOWNLOAD" "BROWSERS" tutorial) "Brewing Java: A Tutorial", Um tutorial de Java que segue o estilo do livro inicial sobre "C", escrito por Kernighan & Ritchie [2], a

referncia bsica para este volume. 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 algum hipertexto para aprofundamento ou para ler em paralelo com esta introduo sobre classes e objetos e use:

classes e objetos e use:

http://www.dcc.unicamp.br/~aacesta/java/group.html "Esta a homepage do "TUTORIAIS" grupo de estudos em Java". Voc vai encontrar links atualizados para diversos lugares na internet onde se estuda Java.

1. CLASSES E OBJETOS
Uma classe um tipo definido pelo usurio que contm o molde, a especificao para os objetos, algo mais ou menos como o tipo inteiro contm o molde para as variveis declaradas como inteiros. A classe envolve, associa, funes e dados, controlando o acesso a estes, defin-la implica em especificar os seus atributos (dados) e seus mtodos (funes). Um programa que utiliza uma interface controladora de um motor eltrico provavelmente definiria 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 desta classe 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 objeto contendo as informaes particulares do novo texto. Isto se chama instanciao ou criao do objeto.

1.1. 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 e passam 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 valores de retorno devem ter os mtodos? Representao da velocidade: A velocidade do motor ser representada por um atributo inteiro (int). Usaremos a faixa de bits que precisarmos, caso o valor de bits necessrio no possa ser fornecido pelo tipo , usaremos ento o tipo 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 nome para 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 o mtodo: public void altera_velocidade(int novav);. O cdigo anterior corresponde ao cabealho do mtodo ele definido junto com a classe motor, associado a ela. O valor de retorno da funo que "implementa" o mtodo void, poderia ser criado um valor de retorno (boolean) que indicasse se o valor 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 que est executando este mtodo. No faz sentido usar, chamar, este mtodo separado de uma varivel do tipo motor, mas ento porque na lista de argumentos da funo no se encontra um motor? Este pensamento reflete a maneira de associar dados e cdigo (funes) das linguagens procedurais. Em linguagens orientadas a objetos o cdigo e os dados so ligados de forma diferente, a prpria declarao de um tipo definido pelo usurio j engloba as declaraes das funes inerentes a este tipo, isto ser explicado em 1.2. 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 sua interface deve ser flexvel de modo a no apresentar entraves para a criao do cdigo que seria feita numa outra etapa. Nesta etapa teramos que imaginar que o valor numrico da velocidade deve ir para o conversor onde ir se transformar numa diferena de potencial a ser aplicada nos terminais do motor, 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] Exerccios: 1Lembre-se de algum programa em que voc trabalhou, cite que tipos de classes seriam criadas se esse programa fosse escrito em Java, que atributos e que mtodos estariam associados a esses objetos?

associados a esses objetos? Exemplo: "Eu trabalhei em um programa de contas a pagar e contas a receber. Se esse programa fosse escrito em Java eu definiria a classe conta_bancaria. Os atributos seriam: saldo, taxa_de_juros, limite_de_saque, etc. Minha opo seria por represent-los como variveis do tipo double (no se preocupe em usar os tipos da linguagem inda)". "Dentre os mtodos desta classe estariam funes para efetuar saques, depsitos e computar juros. "

1.2. OBJETOS EM JAVA


Objetos so instncias de uma classe. Quando um objeto criado ele precisa ser inicializado, ou seja para uma nica classe de nome EstudanteDeGraduacao podemos ter vrios objetos durante a execuo de um programa. Estudante de graduao Andre; Identificao 940718; Curso Computacao | Estudante de graduao Luiza , Identificao 893249, Curso Medicina... A classe representa somente o molde para 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 Estudantes de 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 mesma classe ou no. Objetos podem ser passados pela rede, armazenados em meio fsico. Objetos possuem um estado e um comportamento. Mtodos podem receber objetos como argumentos, podem declarar objetos como variveis locais, podem chamar outros mtodos. Voc pode chamar um mtodo (mandar uma mensagem) para objetos em outras mquinas atravs de sua rede. Um objeto pode ser visto como um RECORD, s que com uma tabela de 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. Na verdade podemos fazer com objetos muito mais do que fazemos com records e procedimentos em Pascal. 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 pelo menos 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 com procedimentos, 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 com "C", mas Java no. Quando neste texto usarmos o termo funo no lugar de mtodos estaremos mais interessados em enfatizar a parte de implementao em detrimento da interface, voc pensar que em Java toda funo implementa um mtodo de uma classe. O leitor no acostumado com o paradigma de orientao a objetos, pode achar estranhas as afirmaes acima, e a pergunta mais comum neste momento : "Mas ento como voc sabe aonde vai comear 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].

1.2.1. PROGRAMA HELLO INTERNET!


Este exemplo visa apresentar um programa simples para imprimir uma mensagem na tela, este provavelmente ser seu primeiro programa em Java. COMPILANDO UM PRIMEIRO PROGRAMA: 1-Certifique-se de ter adicionado a sua lista de path's o path do compilador e interpretador Java. Javac e Java respectivamente. "Compilao" 2-Crie o arquivo abaixo 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 arquivo aps essa compilao: HelloInternet.class 5-Chame o interpretador Java para este arquivo (omita a extenso .class de arquivo): Java HelloInternet 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", bem provvel que ele no compile, se isto ocorrer, leia atentamente o programa. Voc no esqueceu o ponto e vrgula? E as chaves? Hellointernet comea com letra maiscula, e isso faz diferena, voc 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 voc precisar 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 linha

Comentrios 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 de cdigo. 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. Toda classes sero declaradas assim at o tpico ENCAPSULAMENTO DE ATRIBUTOS E MTODOS COM 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 um mtodo, ao contrrio de C++, s pode ser declarado {internamente} a classe a qual pertence, evitando as confuses sobre "escopo". Desta forma, todo pedao de cdigo em Java deve pertencer ao abre chaves, 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 declare todos os mtodos como public. Voltaremos a este assunto em 1.5. ENCAPSULANDO MTODOS E ATRIBUTOS
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, mesmo quando no foi criado nenhum objeto para a classe, para tal deve-se seguir a sintaxe: <NomeClasse>.<NomemetodoStatic>(argumentos);. Retornaremos a esta explicao mais tarde, por hora voc precisa saber que particularmente o mtodo main precisa ter essa qualificao porque ele chamado sem que se crie nenhum objeto de sua classe (a classe HelloInternet). Curiosidade: Se voc gosta de paradoxos e j conhece um pouco de orientao a objetos, pense que se o mtodo main tivesse que ser chamado para um objeto (o que no o caso) este objeto teria que ter sido criado em algum outro lugar ento este lugar seria o incio do programa e main deixaria de ter esta 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 de inicializao, construtor do objeto, que o incio do cdigo do programa.
void

Semelhante 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.
main

Este 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 nele que 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 na linha 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 em 1.3.
{ ... }

"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 de cdigo. Os programadores Pascal notaro que variveis locais dos mtodos podem ser declaradas em qualquer local entre as chaves. Mas por motivos de clareza do cdigo declararemos todas no incio do abre 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. println assim como writeln de Pascal, imprime a String e posiciona o cursor na linha abaixo , analogamente print no avana linha. Por hora voc pode guardar esta linha de cdigo como o comando para imprimir mensagens na tela, onde o argumento que 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: Normalmente o volume de conceitos presentes num primeiro programa de uma linguagem orientada a objetos como Java ou Eiffel grande se comparado com o de um primeiro programa em C 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:

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

1.2.2. ATRIBUTOS
No programa anterior, no observamos a criao de nenhum objeto, apenas a declarao da classe 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 e altera o contedo desta varivel. Uma classe parecida com um record de Pascal, a nossa representa um crculo com os atributos raio e x , y, que so coordenadas cartesianas. Note que este objeto no possui mtodos ainda. A classe crculo especificada em um arquivo separado do arquivo da classe que contm o mtodo main (incio do programa), um arquivo neste texto representado pelo retngulo envolvendo um trecho de cdigo, at o tpico ENCAPSULAMENTO DE CLASSES COM PACKAGES cada classe ser especificada em um arquivo. importante entender este exemplo, no segundo volume deste texto usaremos a classe 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 uma explicao detalhada sobre tipos.

//Classe circulo, arquivo Circulo.Java public class Circulo { //so atributos entre as chaves //atributo raio do circulo public float raio;

public float x; //posicoes em coordenadas cartesianas public float y; }

//Classe principal, Arquivo Principal.Java

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 matemticos doidos pois de voc subtrair umcirc.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 funo do := 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. A sequncia de alteraes em seu diretrio ou folder :
Inicio: Aps Javac AsDuasJuntas.Java:

O compilador deve ser chamado para ambos arquivos. Ou voc pode usar os chamados "wildcards": javac *.java. Sem Includes: Se voc j programa em alguma outra linguagem provavelmente deve estar com a seguinte dvida: "Vocs usaram o nome da classe Circulo na classe Principal, ambas esto em arquivos separados, como o compilador sabe em que diretrio est a classe Circulo? No preciso fazer uma espcie de include 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. Se voc tiver que deixar esta classe em outro diretrio ento ela deve fazer parte de um package e voc ter 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 trs atributos . A declarao de atributos segue sintaxe semelhante a de C++ (havero acrscimos a esta sintaxe):
EspecificadorModoAcesso 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, veja tabela de tipos bsicos). Esto especificados como public o que significa que podem ser modificados a 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 e atributos que criarmos devero ser public. Vale lembrar que na declarao de variveis simples em mtodos, no faz sentido usar o EspecificadorModoAcesso. Esta classe Circulo no possui mtodos. Como exemplo de declarao de variveis simples tome a declarao de uma varivel Circulo no mtodo main. Seguida de sua alocao: umcirc=new Circulo(); //alocacao dessa variavel. Sem a alocao a varivel no pode ser usada. Note que os atributos so por default inicializados para zero. Classe Principal declarao e inicializao de atributos: A classe Principal no possui atributos, porque nenhum objeto desta classe criado, apenas seu mtodo main chamado. O mtodo main declara uma referncia para objeto da classe Circulo: Circulo umcirc;. Note que diferentemente de C++ no so necessrios "includes" ou "header files" para poder declarar essa varivel de um "tipo" definido pelo usurio e existente em outro arquivo. Antes da referncia ao objeto ser usada, este precisa ser alocado na memria o que feito atravs de umcirc=new Circulo();. Se voc tivesse declarado um objeto da classe String, j definida 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 argumento "Valor inicial", isto ocorre porque a linguagem permite que voc aproveite a alocao de um objeto para inicializar alguns de seus atributos, isto ser explicado em 1.2.6.CONSTRUTORES. Neste nosso programa, os atributos contidos na rea de memria alocada por new, so alterados de outra forma. Coleta automtica de lixo: A desalocao do objeto feita pela linguagem, ("automatic garbage collection"), voc no precisa se preocupar com ela. Aps o fecha chaves de main, a memria do objeto umcirc j pode ser liberada, o que normalmente no ocorre de imediato, pois o ambiente 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 do usurio com o programa. Por executar em um "tread" entenda paralelamente ou quase paralelamente, voltaremos a este tpico mais adiante. 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 o nome do atributo deste, separados por um ponto: umcirc.raio=10.0; . Note que raio sozinho no faz sentido no programa, precisa-se especificar de que objeto se deseja acessar o raio. A sintaxe de chamadas de mtodos semelhante a sintaxe descrita acima, s que ao envs de nome do atributo temos o nome do mtodo seguido dos parnteses que podem conter zero ou mais argumentos. 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 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 se pensar que + tambm operador de concatenao de Strings e que os argumentos int ou float e de outros 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 == (igual igual) tem a funo de comparao entre valores, retornando o valor booleano verdadeiro se estes valores forem idnticos. Alguns podem no achar esta escolha de operadores sensata, principalmente os 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 e C++ 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 0

Essas 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 de j=... .no nosso exemplo descartado, ignorado pois no h nada a esquerda desta atribuio. Em C e C++ existe um problema grave que frequentemente uma cilada para os 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 em Java) a==a tem valor 1 com o significado dado pelo programador de true ou verdadeiro, mas a=1+0; tambm tem como resultado o valor 1, mas agora com o significado inteiro, numrico. O compilador no sabe distinguir entre os significados numrico e booleano. Essa ambiguidade faz com que programadores (C ou C++) no acostumados com esta conveno de operadores = e ==, incorram no erro de escrever j=1 quando na verdade queriam dizer j==1, mas para o compilador ambas as expresses tem valor inteiro de modo que se esse engano ocorrer num teste de parada de um loop, pode ocorrer que ele nunca pare, pois 1 tem o mesmo valor de true. Java elimina este tipo de erro introduzindo o tipo boolean com os valores true e false, que no tem nenhuma relao com o tipo int e qualquer outros tipos. TIPOS BSICOS E CONSTANTES OU VALORES LITERAIS (para nossa sorte os tipos bsicos 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 permite enderear de 0 a 65535. O objetivo desta opo permitir internacionalizao da linguagem, bem como 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 \r \b \t \f \' \" \\ \u223d \gfa \fff

Pula linha, linefeed Retorno de carro Backspace"Backspacecaractereespecial" Tabulao"Tabulaocaractereespecial" Formfeed"Formfeedcaractereespecial" Apstrofe Aspas Barra inversa Caractere unicode"CaracteresUNICODE" Octal Hexadecimal

boolean

Valor true ou false, diferente representao de C++, sem converso em outros tipos.

tipos.

O tipo boolean no tem relao nenhuma com outros tipos (coero). Eliminando problemas que surgiram por exemplo em C++ que usa inteiros para representar valores booleanos. Os possveis valores so true e false que so os resultado dos testes lgicos .
boolean pertenceAoConjunto; //declara variavel pertenceAoConjunto=true; //exemplo

byte short int long

Inteiro 8-bit ,

complemento de 2, faixa:-128 at 127

Inteiro 16-bit, complemento de 2, faixa:-32768 at 32767 Inteiro 32-bit, complemento de 2, faixa:-2147483648 at 2147483647 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 cast" explicitamente:
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 double Ponto flutuante 32-bit IEEE754 Ponto flutuante 64-bit IEEE754

Um valor como 3.14159265 considerado double como padro, se voc quer atribuir esta constante 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 calculo do lado direito de uma atribuio, voc no precisa fazer o type cast desses valores. O compilador promove o nmero do tipo mais fraco para o tipo mais forte antes de fazer o calculo. Voc pode desejar fazer o type cast do resultado, para atribuir a uma varivel long por exemplo. Exerccios: 1Repita 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 as modificaes do objeto imprimindo seus atributos na tela. 2-

2Simplifique o programa anterior retirando o atributo raio. Voc pode dar o nome de Ponto ou Ponto_geometrico para esta classe. No se esquea de compilar, use o compilador como ferramenta para verificar se voc aprendeu corretamente a sintaxe da linguagem. 3Reescreva a classe Circulo para trabalhar com atributos do tipo int.

1.2.3. 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). Programas complexos formam conjuntos de objetos que trocam mensagens entre si gerenciando inclusive os recursos do sistema. O programa a seguir exemplifica chamadas de mtodos, para tal define um objeto que serve como 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 comeca inicializa a contagem em zero. Decrementa faz o oposto de incrementa. Esta classe Contador ser usada no segundo volume do tutorial, e na verso hipertexto do tutorial, para construir applets que lidam com tempo. Um dos exemplos: um applet que permite que sua pgina seja lida por X segundos e depois carrega outra pgina www. Este applet til para elaborar questes com tempo de resposta em hipertextos, o que voc acha de fazer alguns exerccios deste texto s que sob presso? Outra aplicao deste applet: contar uma histria na forma de desenho animado, frequentemente necessrio depois de um tempo mudar de pgina, alterando assim o pano de fundo das animaes. Dentre as aplicaes comerciais, que so as mais rentveis, podemos citar apresentaes com tempo programado de pginas com recursos multimdia.

//Classe Contador, arquivo Contador.Java public class Contador { public int num; //este o atributo //numero do contador public void incrementa() { num=num+1; } public void decrementa() //decrementa contador { num=num-1; } //acesso ao atributo //incrementa contador

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

//Classe principal, Arquivo Princ.Java

public class Principal {

public static void main(String args[]) {

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);

0 1

Exerccios: 1Defina 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 estado do contador? Pense em programas de interfaces grficas e de linha de comando. 2Crie 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 de C++: a % b==a-((int)a/b)*b. No tente usar a estrutura de deciso if ainda. Mquinas de estados: Olhando para o desenho contido no canto direito superior do arquivo da Classe contador, voc consegue imaginar este contador como uma mquina de estado? O uso de objetos como mquinas de estados um dos conceitos que exemplificaremos deste texto. Sintaxe de declarao de mtodos: A sintaxe simplificada para a declarao de mtodos de uma classe :
especificadordeacesso tipoderetorno nomedometodo(lista_de_argumentos) { /*codigo */ }.

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

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

executado". Suponha uma classe que possui a seguinte declarao de atributo: public int qualquer; . Se quisermos 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 de eliminar ambiguidades entre os nomes dos atributos de uma classe e os nomes dos argumentos de um dos mtodos desta (quando estes nomes forem iguais). O uso de this tambm vlido fazer para chamadas 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, com exceo 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();. Primeiro insere-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 1.2.2, porm um pouco mais complicado: 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; public float y; public void move(float dx,float dy) { this.x+=dx; y+=dy; } //move o circulo de lugar //posicoes em coordenadas cartesianas

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 circulo umcirc=new Circulo(); umcirc.x=0; umcirc.y=0; umcirc.raio=12; umcirc.mostra(); umcirc.move(10,10);

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 representao interna dos objetos, mas lembre-se que elas so todas iguais para uma classe ento basta manter para cada classe uma tabela de mtodos que consultada no momento da chamada . Os objetos s precisam ter uma referncia para esta tabela. Exerccios: 1Faa as seguintes modificaes no programa HelloInternet: 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? 2No programa deste exemplo, crie um mtodo chamado inicializa para a classe Circulo. Este mtodo deve ter como argumentos um valor para x, um para y e outro para o raio, e deve alterar os atributos inicializando-os com os valores passados. Voc pode abstrair o uso desse mtodo como uma maneira de inicializar o objeto de uma s vez embora isto seja feito seqencialmente. Comente as vantagens desta abordagem, comparando com as outras opes, tenha sempre em mente a questo de segurana quando avaliar tcnicas diferentes de programao. 3No programa anterior, verifique que nada impede que voc acesse diretamente os valores de x , y e raio e os modifique, como alias foi feito nos exemplos anteriores. Como se pode criar um nmero enorme de mtodos : altera_x(float a); move_raio(float dr); seria desejvel que somente essas funes pudessem modificar x, y e raio. Voc ver que isso possvel em encapsulamento 1.5. Por hora, crie esses mtodos se preocupando em permitir atravs chamadas a eles tudo o que for possvel fazer com acesso 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 garantir flexibilidade a classe:
umcirculo.multiplica_atributo_x(10);

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

4Teste 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 o conceito de portabilidade. Voc j capaz de citar outras medidas que tornem suas classes mais portveis, flexveis e genricas? Leia o exerccio anterior e o

tendo em vista o conceito de portabilidade. Voc j capaz de citar outras medidas que tornem suas classes mais portveis, flexveis e genricas? Leia o exerccio anterior e o exerccio 3.

1.2.4. MTODOS QUE RETORNAM VALORES.


At agora s havamos visto mtodos com valor de retorno igual a void. Um mtodo, assim como uma funo comum, pode retornar um nico elemento de qualquer tipo, inclusive os definidos pelo usurio ou seja: objetos. Sendo assim, sua chamada no programa se aplica a qualquer lugar onde se espera um tipo igual ou equivalente ao tipo do seu valor de retorno, seja numa lista de argumentos de outro mtodo , numa atribuio ou num operador+ em System.out.println( variavel+chamada_de_metodo_que_retorna_valor); Classe trava: O estado da trava representado no atributo public boolean travado; e pode ser obtido atravs de uma chamada ao mtodo estado(). Este exemplo bastante simples e no tem a pretenso de ser uma 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; public boolean travado; atrave(String q) public void

//move o circulo de lugar

{ this.travado=true; this.quem=q; } public void adestrave(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.atrave("ProgramaPrincipal"); System.out.println(umatrava.estado()); umatrava.adestrave("ProgramaPrincipal"); System.out.println(umatrava.estado()); } }

true false

//COMENTARIOS A 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 um objeto, mas neste ponto cabe a voc estender 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:

Exerccios: 1Melhore a classe Contador de ATRIBUTOS E MTODOS, defina um mtodo que imprime o contador na tela. Se voc estivesse fazendo um programa para funcionar em uma interface grfica com o usurio este mtodo para imprimir na tela seria o mesmo? Definir um mtodo que retorna uma cpia do valor atual do contador garante maior portabilidade? Por qu? Para aprender a retornar valores consulte este tpico. 2Insira 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 if ainda, use o operador not que serve para negar um valor booleano: a=!valorbooleano; // !true==false ou true==!false. 3Implemente 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.

1.2.5. COMPARAO COM UM PROGRAMA EM PASCAL


Este exemplo de programa em Java semelhante ao exemplo da classe Circulo de 1.2.2 ATRIBUTOS, ele ser comparado com um programa escrito em Pascal, alm disso introduzimos um novo mtodo chamado inicializa e mtodos public float retorna_raio(void); e void altera_raio(float a). inicializa coloca o ponto nas coordenadas passadas como seus argumentos. A introduo deste mtodo prepara a explicao sobre construtores dada no prximo tpico: 1.2.6. Para melhor entendimento leia os exemplos anteriores com a classe Circulo.

Java:

Programa exemplo crculo, baseado no exemplo de 1.2.2 ATRIBUTOS:

//Classe circulo public class Circulo { public float raio,x,y; public void inicializa(float ax,float ay,float ar) //garante o estado do objeto quando criado { this.x=ax; this.y=ay; this.raio=ar; } public void altera_raio(float a) { this.raio=a; }

public float retorna_raio() { 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.retorna_raio()+")"); } }

//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.altera_raio(12);

ac.mostra();

Disposio dos mtodos e atributos na declarao de uma classe: Em uma declarao de uma classe normalmente se coloca a declarao de mtodos depois da declarao 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 usar linhas de comentrios para delimitar uma rea do cdigo de suas classes que englobe tudo o que interessa a um usurio desta. Nestes programas exemplos praticamente tudo de interesse de um usurio (cliente) de sua classe, mas nos exemplos mais avanados isto no ser verdade. Comentrios: Observe que o mtodo mostra chama o mtodo public float retorna_raio(void) que da mesma classe. Fica claro da definio de mostra que this.retorna_raio() se aplica ao mesmo objeto instanciado que recebeu 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 pelo prprio 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 para ambientes como o Microsoft Windowsreg. de uma maneira bastante abstrata, este um exemplo claro de 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 permite programar de maneira bastante abstrata sistemas de interfaces grficas com o usurio seja para aplicaes 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=RECORD

x:real;

{COORDENADAS X E Y}

y:real;

r:real;

{somente dados}

END;

var ac:circulo;

leitura:integer;

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

{COLOCA O CIRCULO EM DETERMINADA POSICAO}

BEGIN

altereme.x:=ax;

altereme.y:=by;

altereme.r:=cr;

END;

PROCEDURE Altera_Raio(var altereme:Circulo;ar:real);

{ALTERA O RAIO DO CIRCULO}

BEGIN

altereme.r:=ar;

END;

FUNCTION Retorna_Raio(copieme:Circulo):real;

BEGIN

Retorna_Raio:=copieme.r;

END;

PROCEDURE Move(var altereme:Circulo;dx,dy:real);

{MODE AS COORDENADAS X E Y ACRESCENTANDO DX E DY}

BEGIN

altereme.x:=altereme.x+dx;

altereme.y:=altereme.y+dy;

END;

PROCEDURE Mostra(copieme:Circulo);

{MOSTRA O CIRCULO NA TELA}

BEGIN

writeln('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);

END.

X: 0.0000000000E+00 Y: 0.0000000000E+00 R: 1.0000000000E+01 X: 1.0000000000E+00 Y: 1.0000000000E+00 R: 1.0000000000E+01 X: 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 o objeto ou relativa a este basta chamar um mtodo : ac.mostra(); O mtodo no precisa de muitos argumentos, porque prprio da classe e portanto ganha acesso aos atributos do objeto para ao qual ela foi associado:
public float retorna_raio(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 tenham sentido juntos. A juno entre os dados e procedimentos se d atravs de passagem de parmetros. No caso 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 o procedimento definido a parte do registro, embora s sirva para aceitar argumentos do tipo Circulo e mover suas coordenadas. Segurana: Em ambos programas (Pascal, Java) o programador pode acessar diretamente os dados do tipo definido pelo usurio: ac.x:=100.0; (Pascal) ou ac.x=100.0; (Java). Veremos em 1.5 ENCAPSULAMENTO maneiras de proibir este tipo de acesso direto ao atributo, deixando este ser modificado somente pelos mtodos. Isto nos garante maior segurana e liberdade pois 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 se tornar pouco eficientes e que poderia ser melhor acessar diretamente os dados de um tipo definido pelo usurio ao envs de passar por todo o trabalho de cpia de argumentos, insero de funo na pilha, 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 permitir sempre o acesso direto aos dados de um tipo definido pelo usurio por razes de segurana. Exerccios: 1Implemente outros mtodos do estilo public void altera_raio(float a) e float retorna_raio(void) para os atributos X e Y. 2Faa um programa simples para testar uma classe que representa um mouse e que fornece a posio 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 interessado possa encontrar na segunda parte subsdios para esta tarefa. 8 Seu mouse deve ser capaz de caminhar para qualquer lugar da tela atravs de chamadas de mtodos, no deve ultrapassar os limites estabelecidos, deve indicar o boto est pressionado ou no atravs de um mtodo semelhante ao mostra( ) deste exemplo. O mouse deve ter de 1 boto. Voc pode substituir mtodo move(float dx,float dy) por combinaes de move_x(float dx); e move_y(float dy); Voc pode achar o fato de o mouse ser obrigado a ter um boto um tanto estranho, mas no . Os mouses dos machintoshes tm um boto, alguns mouses de pc's tm dois botes e mouses de workstations tm trs botes. Para seu programa ser portvel ele deve contar apenas com a existncia de um boto e isso vale a pena quando se fala em portabilidade. O que tem sido usado em casos extremos a combinao de pressionamento dos botes e pressionamento de teclas para diferenciar certas aes. 3Verifique 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 Java package) que implementa a classe Circulo e uma srie de mtodos relacionados, por certas razes voc gostaria que o usurio se limitasse ao uso da interface do objeto, como faz-lo ser explicado em 1.5 encapsulamento. Por hora, apenas crie mtodos que sirvam como alternativas a este tipo de acesso direto.

1.2.6. CONSTRUTORES
Construtores so mtodos especiais chamados pelo sistema no momento da criao de um objeto. Eles no possuem valor de retorno, porque voc no pode chamar um construtor para um objeto, voc s usa o construtor no momento da inicializao do objeto. Construtores representam uma oportunidade de inicializar seus dados de forma organizada, imagine se voc esquece de inicializar 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 o argumento entre aspas que especificado pelo programador. Ele seria chamado automaticamente no momento da criao, declarao de uma String, sem necessidade de uso do nome do construtor como mtodo, apenas dos argumentos:
String a; a=new String("Texto"); //alocacao e inicializacao atraves do construtor

a.mostra(); //mostra so pode ser chamada depois do construtor

Nos exemplos anteriores tambm usvamos construtores no momento de inicializar nossos objetos, s que eles no possuam argumentos. Existem variaes sobre o tema que veremos mais tarde: sobrecarga de construtor, "copy constructor", 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! { this.x=ax; this.y=ay; } public void move(float dx,float dy) { this.x+=dx;

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(); } }

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

//COMENTARIOS: Note que com a definio do construtor, voc obrigado a passar os argumentos deste no momento da alocao do objeto. Se voc precisa ter a opo de no passar esses valores ou passar outros, as possveis solues sero dadas em 3. (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 muito comum. Objetos podem ser criados dentro de estruturas condicionais, armazenados em arquivos, passados como parmetros, inseridos em estruturas dinmicas dentro de outros objetos, etc. Exerccios: 1Um mtodo pode chamar outro mtodo da mesma classe. Parta do exemplo de 1.2.5 e crie um construtor que chama o antigo mtodo inicializa(float a,float b) repassando os argumentos do construtor:
ponto(float a, float b) { inicializa(a,b); }

Na chamada de inicializa() fica implcito que ela se aplica ao objeto cujo construtor foi chamado. Isto vlido tambm para outros mtodos que chamam mtodos, ou seja, no necessrio o operador identificador.inicializa(a,b); , veja 1.2.4 uso de this. Este exerccio til para mostrar outro recurso de Java, o ponteiro this. this uma palavra reservada e dentro de qualquer mtodo this um "ponteiro" para o objeto em questo, ento o cdigo descrito 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 objeto precisa passar seu "ponteiro" para alguma funo que o modifica, ou fica possuindo uma referncia para ele, ento usa-se this. Veremos outras aplicaes mais adiante. 2Introduza mensagens no construtor tipo: System.out.println("Objeto instanciado"); introduza trechos parecidos em outros pontos de seu programa. O objetivo acompanhar visualmente a seqncia de criao e modificao dos objetos. 3Esta 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 o mdulo 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 quadrada de um ponto flutuante de dupla preciso. No necessrio fazer nada semelhante a um include de C++ para usar esses mtodos, basta adicion-los ao seu cdigo, outro mtodo til Math.max(a,b); que retorna o maior valor entre a e b (float, double, int. long, etc). Use "type cast" explicado nos comentrios deste exemplo. 4Crie 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 pronto acrescente mtodos para esta reta tais como inclinao, coeficiente linear, etc. Para acrescentar construtores leia 1.2.7. Existem maneiras mais eficientes e compactas de representar uma reta, porm faa como foi sugerido, neste caso o objetivo no eficincia.

1.2.7. CONSTRUTORES E AGREGAO


Este exemplo o resultado do exerccio anterior (exerccio 4 tpico CONSTRUTORES), ele cria uma classe Reta com dois atributos da classe Ponto. Ou seja voc estar reutilizando a classe Ponto 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 todos os 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 dinamicamente e que caso voc se esquea de aloc-los, eles ficam possuindo o valor null. Acessar uma varivel com valor null um erro que geralmente verificado em tempo de execuo. Nos programas anteriores alocar os objetos era fcil, mas agora que temos objetos funcionando dentro de outros objetos h necessidade de adotar tcnicas melhores. Veremos a seguir duas alternativas 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 a rotina 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 chamada dos construtores de seus atributos. Esta alternativa executada pelo programa a seguir:

//Reutilize aqui o arquivo da classe Ponto definida anteriormente.

//Classe Reta class Reta { public Ponto a,b; public Reta(float ax,float ay,float bx,float by) { a=new Ponto(ax,ay); //chamadas dos contrutores da classe Ponto

b=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, mas no do escopo deste texto tratar de problemas dessa natureza, o que alis complicaria muito o cdigo , desviando-nos do objetivo principal: simplicidade na apresentao de conceitos de orientao a 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 ser feita em paralelo com a leitura. Exerccios: 1Implemente um programa que use a mesma lgica do exemplo anterior para criar uma classe composta de outras . Voc estar usando agregao. Por exemplo um tringulo precisa de trs pontos para ser definido. 2Uma 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 dois pontos como argumentos. Como voc no aprendeu sobrecarga de construtores (definir vrios construtores), use s um construtor que tem coeficiente angular e linear como argumentos e implemente esta nova classe reta (sem usar agregao agora). 3Defina 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 retas paralelas 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 do mtodo os atributos do argumento a devem ser acessados do seguinte modo:
ap1.x;

Mais tarde, em 4.3 tratamento de excees, veremos maneiras melhores de lidar com esses casos degenerados. 4-

4Defina um mtodo chamado move para a classe Reta, lembre-se de mover os dois pontos juntos (a inclinao no deve mudar). 5Defina um mtodo public void 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 a classe ngulo (graus, minutos, segundos). Resolva tambm o problema da escolha do ponto em torno do qual a reta deve ser girada (voc pode usar mais de um argumento). Use funes matemticas (seno cosseno) e outras descritas no exerccio 3 de 1.2.6

1.2.8. DESTRUTORES OU "finalizers"


A presena de coleta automtica de lixo torna o conceito de destrutores um pouco diferente de seus 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 automtico de 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 o objeto ser deletado. Ao contrrio dos construtores, os destrutores no tem argumentos, mas possuem valor de retorno que igual a void. Os destrutores so muito teis para "limpar a casa" quando um objeto deixa de ser usado. Um exemplo bastante comum do uso de destrutores o de um objeto que lida com arquivos que devem ser fechados quando o objeto for destrudo. Existem outros casos onde um objeto deve comunicar aos outros objetos que ser inutilizado, destrudo, ou seja : sair do programa.

Em Java, que possui coleta automtica de lixo, um objeto passa a no existir mais no programa quando nenhuma varivel faz referncia a ele. Nesse ponto, ele armazenado no coletor automtico de lixo, onde receber o tratamento adequado. Um n de uma lista ligada pode ser apagado simplesmente fazendo o n anterior apontar para o posterior a ele. Os programadores no acostumados com esse conceito precisam ouvir a seguinte frase: "Voc no obrigado a liberar explicitamente a 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 programador atravs de uma chamada a delete nomedoobjeto(); . Em Java a liberao de memria que feita pelo coletor automtico de lixo que executado de modo 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 ser que o programa seja executado com o modo assncrono do coletor automtico de lixo desligado (java -noasyncgc NomePrograma). Na verso beta, voc no pode nem mesmo contar com a chamada do destrutor pelo garbage collector, de modo que ele deve ser usado apenas para otimizaes do cdigo.

1.3. PONTEIROS, "POINTERS", REFERNCIAS E OBJETOS


Algum pode ter achado estranho que no foram discutidos ponteiros em Java, ocorre que eles no existem nessa linguagem. Existem estudos que afirmam que erros com ponteiros so um dos principais geradores de "bugs" em programas, alm disso com todos os recursos que temos no precisaremos deles. Os programadores acostumados ao uso de ponteiros (e aos erros decorrentes desse uso), acharo muito natural e segura a transio para Java onde passaro a usar principalmente vetores e classes. A estruturao 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 so alocados dinamicamente com new, eles so referncias ou ponteiros para posies na memria, mas a linguagem mascara este fato por razes de segurana. Como objetos so ponteiros (s que transparentes para voc), nos depararemos com o problema de reference aliasing quando discutirmos cpia de objetos com outros objetos como atributos.

1.3.1. 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 o parmetro 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 criar classes para embalar, empacotar estes tipos. Dada a necessidade destas classes, elas j foram definidas na linguagem. So classes definidas para conter cada tipo bsicos e permitir certas converses entre eles, falaremos destas classes conforme necessitarmos de seu uso. As vezes estas classes so chamadas de "wrappers". Exerccios : 1-

class X {

public void troca(X valores)

int a;

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 argumento

O cdigo acima mostra como definir um mtodo que usa a existncia implcita de ponteiros na linguagem para criar um mtodo que troca os atributos de dois objetos da mesma classe. Implemente este mtodo e faa os testes sugeridos nos comentrios desse cdigo.

1.3.2. VETORES E MATRIZES


Vetores so objetos, eles possuem papel importante no estilo de programao desta linguagem que 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]+" ");

System.out.println(vetor[0]+" "+vetor[1]+" "+vetor[2]+" ");

0 10 20

Resumo da sintaxe de vetores:


int a[]; //declara vetor de inteiros a a=new int[10]; //aloca vetor a com dez posicoes //as duas linhas anteriores int a[]=new int[10]; //alem disso se voce quiser inicializar o vetor a, ja' na declaracao: int a[3]={0,10,20}; podem ser abreviadas por:

O anlogo para matrizes :


int a[][]; //declara matriz de inteiros a a=new int[3][3]; //aloca matriz 3x3, 9 celulas //as duas linhas anteriores int a[]=new int[3][3]; //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}}; podem ser abreviadas por:

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 do vetor no momento de sua criao, no nosso caso 3. O mesmo ocorre com matrizes. Esta conveno pode 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 desta mensagem 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 os objetos de cada posio do vetor j estaro inicializados, para inicializar os elementos, siga seguinte sintaxe:
Ponto a[]; a = new Ponto[3]; for (int i = 0; //declaracao, todas as posicoes com null //alocacao 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: 1Escreva 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 .5 20.25 30,3 .3 9.09 12,6 .2 2.52 100 .5 50

Descontos: Vetor calculado:

A linguagem Java ser muito usada no comrcio da internet, tabelinhas assim, usadas para clculos de preos de produtos j esto se tornando comuns. Os nomes que voc pode dar as classes e mtodos so:
Classe: Atributo: Atributo: Mtodo: TabelaPrecos boolean ComDesconto; double[] Precos; void AplicaDescontos(int[] descontos);

1.3.3. COPIA , COMPARAO E DETERMINAO DA CLASSE EM OBJETOS


Este tpico ainda no est completo, devido a indefinies sobre o que estar contido nas packages e interfaces da Java API. Objetos so implicitamente referncias, portanto sua cpia (atravs do operador =) est sujeita ao 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 objetos compartilham o mesmo espao alocado na memria. Observe que com as operaes conhecidas at agora, no conseguimos comparar dois objetos quanto 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 outra necessidade seria verificar a classe de um objeto em tempo de execuo. Antes de ver a soluo procure sentir o problema no exemplo a seguir: Usaremos o arquivo da classe Ponto, j apresentado em CONSTRUTORES 1.2.6., mas com uma modificao no mtodo mostra. No lugar de mostra criaremos um mtodo chamado public String toString(). Este mtodo padro em muitas classes e deve ser definido de modo a retornar uma String descritiva do objeto. Fazendo isto voc pode concatenar uma varivel Ponto com uma String no argumento do mtodo System.out.println(meuPonto1+ " Na vizinhanca de "+meuPonto2);. Esta deciso de implementao certamente mais genrica que mostra, visto que nem sempre estaremos imprimindo atravs de System.out.println(), por exemplo na segunda parte ocorrero 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! { this.x=ax; this.y=ay; }

public void move(float dx,float dy)

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

public String toString() { }

//Classe principal, Arquivo Principal.java class Principal { public static void main(String args[]) { //preparacao das variaveis copia de objetos Ponto pOriginal,pAlias,pCopia; pOriginal=new Ponto((float)0.0,0.0f); //(float)0.0 ou 0.0f; 0.0 eh double pAlias=pOriginal; //copiando atraves de atribuica

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

//resultados System.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 2 Veja como o original ficou:(2,0) pCopia nao se modifica:(0,0) Original==Alias:true Copia==Original:false Deixando atributos de copia iguais aos de Original Copia==Original:false Original.x==Copia.x:true

Original.x==Copia.x:true Original.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 mesmo objeto pois a atribuio pAlias=pOriginal, copia o endereo de pOriginal. J pCopia, o resultado de uma nova alocao de memria, portanto um novo endereo, um objeto independente dos outros. //comparacao de objetos: pOriginal==pAlias e outras comparaes equivalentes tm o significado de comparao do endereo de memria e no do contedo. pOriginal.x==pCopia.x tem o significado de comparao do valor desses atributos, assim como uma comparao entre inteiros. Se esses atributos por sua vez fossem objetos, esta operao teria o significado de comparao entre endereos de memria dos objetos.

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! //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 String toString() { return "("+this.x+","+this.y+")"; //(x,y) } public boolean igual(Ponto outro) { return ((outro.x==this.x) && (outro.y==this.y)); //this==outro? } }

//Classe principal, Arquivo Principal.java

class Principal {

public static void main(String args[]) {

//preparacao das variaveis

Ponto pOriginal,pCopia1,pCopia2;

pOriginal=new Ponto((float)0.0,0.0f); //(float)0.0 ou 0.0f; 0.0 eh double

pCopia1=new Ponto(0.0f,0.0f);

pCopia1.Copy(pOriginal); //pCopia1 copia conteudo de pOriginal nele mesmo

pCopia2=(Ponto) pOriginal.Clone();

//copia de objetos

System.out.println("Original:"+pOriginal);

System.out.println("Copia1:"+pCopia1);

System.out.println("Copia2:"+pCopia2);

System.out.println("Modificando Copia1.x para 2");

pCopia1.x=2.0f;

System.out.println("Veja como o original ficou:"+pOriginal);

System.out.println("Copia2 nao se modifica:"+pCopia2);

//comparacao de objetos

System.out.println("Original==Copia2:"+(pOriginal==pCopia2)

);

System.out.println("Original.igual(Copia2):"+pOriginal.igual(pCopia2) );

System.out.println("Deixando atributos de Copia iguais aos de Original");

//verificacao da classe dos objetos

System.out.println("Obtendo a

classe dos objetos");

System.out.println(pOriginal.getClass().getName());

System.out.print("Original e da classe String?");

boolean result=(pOriginal instanceof String);

System.out.println(result);

Este programa exemplo no opera corretamente, isto se deve a no implementao destes mtodos na verso beta (a disponvel atualmente).

1.4. OBTENDO VALORES DO USURIO


Este tpico foi introduzido porque os programas seguintes so mais complexos e precisam ser testados iterativamente. Mesmo que voc s v fazer programas em interfaces grficas interessante saber como testar certas classes via teclado ou linha de comando, sem contar que sem o contedo deste tpico os programas seguintes no sero possveis. Alm do que voc pode desejar fazer algum programa de linha de comando (batch) em Java, por exemplo um programa de comunicao entre as diversas mquinas de uma rede ou um programa que receba argumentos via linha de comando.

1.4.1. LENDO DO TECLADO


Este tpico contm dois exemplos que ensinam como ler Strings do teclado, como convert-las para nmeros, e como controlar melhor a entrada e sada de dados. 1.4.1.1. LEITURA DE STRINGS USANDO UM VETOR DE BYTES. Em Java praticamente um padro ler dados em bytes, seja do teclado, da rede, do disco ou de qualquer outro lugar. Por este motivo o primeiro exemplo l em um vetor de bytes. Como sabemos que voc quer mais do que isso( ex. ler outros tipos da linguagem ), o segundo exemplo tratar desse caso.

import java.io.*; class EntraDados { public static void main (String args[]) { byte vetortexto[] = new byte[200]; //declaracao de um vetor de bytes int byteslidos = 0; System.out.println("Escreva algo:"); try { byteslidos = System.in.read(vetortexto); System.out.print("Voce escreveu:"); System.out.write(vetortexto,0,byteslidos); } catch (IOException e) { // Alguma acao de recuperacao da falha } } }

Escreva algo: Como assim escreva algo? Voce escreveu:Como assim escreva algo?

//COMENTARIOS:

Este programa usa o mtodo System.in.read(vetortexto); para ler do teclado. Este mtodo precisa de um vetor de bytes como argumento(onde
sero lidos os caracteres) e alm disso retorna o nmero de bytes lidos, para que voc possa usar o vetor corretamente.

Para descarregar o vetor no vdeo use o mtodo System.out.write(vetortexto,0,byteslidos); que imprime na tela as posies de 0 at byteslidos do vetor de bytes passado como o primeiro argumento. Voc deve estar se perguntando qual a funo dos blocos de cdigo try {} catch {} deste programa exemplo. Eles so importantes no tratamento de excees, tpico que ser abordado no final deste volume. Por enquanto apenas veja estes blocos de cdigo como necessrios para escrever dentro do bloco try{} as operaes de leitura de teclado, que so operaes que podem gerar excees. 1.4.1.2. UMA VISO GERAL SOBRE PACKAGES E STREAMS A maneira ensinada nos tpicos anteriores (leitura de bytes) suficiente para que voc leia do teclado, mas aproveitaremos agora que voc j est mais experiente para ensinar uma outra maneira elegante que serve para ler do teclado, de um arquivo ou de uma conexo da rede que aceita por exemplo a leitura direta para uma String e outros tipos desta linguagem e no s para um vetor de bytes. Nestes exemplos usaremos um conceitos que somente sero explicados a fundo nos prximos tpicos, so os conceito de packages e Streams. Packages so conjuntos de classes. At agora s tnhamos utilizados elementos da package java.lang que importada implicitamente em todos os programas, permitindo por exemplo escrever na tela (System.out uma classe presente em java.lang). A package java.io fornece a abstrao de streams para lidar com a complexidade de entrada e sada de dados. Esta abstrao poderosa e ser utilizada aqui para ler do teclado. Um stream como um cano por onde passam os bytes, a vantagem deste cano que no precisamos nos preocupar de onde vem esses bytes, para ns eles vem do cano. Para quem escreve no stream tambm vale a mesma idia do que agora do outro lado, empurrando os bytes para dentro.

Neste exemplo usamos um stream para ler do teclado, esta poderosa abstrao ser estendida mais tarde para tratar a entrada e sada de dados atravs de portas de comunicao e programao cliente servidor, explorando as capacidades de "networking" da linguagem, alm da leitura e escrita em arquivos, no tpico adequado.

Este programa simplesmente l uma linha do teclado e a imprime novamente.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

import java.io.DataInputStream; //classe DataInputStream para a entrada de dados

public class ReadString { public static void main(String args[]) { String linha="";

DataInputStream meuDataInputStream; meuDataInputStream = new DataInputStream(System.in); try{ linha = meuDataInputStream.readLine(); } catch (Exception erro) { System.out.println("Erro de leitura"); } //antes de imprimir ou armazenar a string, e' obvio que voce poderia executar algum //processamento, mas nao estudamos a classe string ainda, por isso tenha paciencia. System.out.println(linha); } }

Voce pode andar rapido com paciencia Voce pode andar rapido com paciencia

//COMENTARIOS O cano de nosso exemplo mais parecido com uma mangueira de jardim, ns ficamos com a ponta de onde sai a gua. 1:Nesta linha dizemos que desejamos usar, importar, um stream de entrada de dados de nome DataInputStream presente na package java.io 8: Nesta linha declaramos o que seria o balde para recolher a gua da mangueira (Uma String). O balde comea vazio (""). 9:Esta linha diz para pegar a mangueira (DataInputStream) do depsito (package java.io). 10:Esta linha conecta a outra ponta da mangueira na torneira (System.in a torneira, que significa teclado em quase todos os computadores). 12:Encha o balde com o que sair da torneira at haver uma interrupo no fornecimento. (Leia o que puder do stream at encontrar um caractere de nova linha `\n'. Da o nome readline que significa leia linha). 16:Esvazie o balde no cano de sada (Copie o valor da String lida na entrada do stream System.out, que significa vdeo na maioria das mquinas). As linhas 11,13 e 14,15,16,17 so necessrias para escrever line = myDataInputStream.readLine();. Essas linhas permitem aes de recuperao de falhas que possam ocorrer no processo de leitura, abordaremos este tpico bem mais adiante, de modo que aqui apenas daremos uma viso geral s a ttulo de curiosidade: No bloco try { }, deve-se inserir as operaes passveis de falhas. Este bloco deve ser seguido por catch (Exception erro) { /* nao faco nada */ }. No lugar de /* nao faco nada */ deveriam estar as possveis aes de recuperao de falhas como no caso adotamos: System.out.println("Erro de leitura");. line = myDataInputStream.readLine(); o mtodo que faz com que o Stream leia da entrada de dados em que foi associado uma linha. Este mtodo obviamente bloqueia a execuo do programa at que se digite "carriage return", o que no problemtico pois isto poderia ser feito paralelamente, usando "threads". Como converter Strings para inteiros: Se voc inserir o seguinte mtodo na nossa classe ReadString, poder ler valores inteiros do teclado .
static int leInteiro() {

String line;

DataInputStream in = new DataInputStream(System.in);

try {

line = in.readLine();

int i = Integer.valueOf(line).intValue();

return i;

catch (Exception e) {

return -1;

int i = Integer.valueOf(line).intValue();

um exemplo de chamadas consecutivas ou aninhadas de mtodos. Olhe da esquerda para a direita. Primeiro o mtodo valueOf(line) chamado para a classe Integer retornando um objeto da classe Integer. Depois o objeto da classe Integer tem seu mtodo intValue() invocado retornando um valor do tipo int que correspondente a String line. Voc se lembra que ns falamos que a linguagem fornece uma auxiliar("wrapper") para cada tipo bsico da linguagem? A classe Integer uma classe que mapeia em termos de objetos o tipo bsico int de 32 bits. Agora que voc j conhece o nome da classe, pesquise mais sobre ela na JAVA API. Exerccios: 1Voltaremos a falar sobre Strings, porm por hora, voc j tem condies de ler as bibliografias adicionais sobre eles.

1.4.2. ARGUMENTOS DE LINHA DE COMANDO


Na segunda parte veremos que os programas Java que rodam embebidos em hipertextos podem receber parmetros iniciais de funcionamento do hipertexto. Os programas que estamos descrevendo nesta parte so aplicaes executadas via linha de comando. De modo anlogo, essas aplicaes podem receber argumentos de linha de comando. Exemplo de passagem de trs argumentos de linha de comando para um programa Java:
java teste "Texto" 2 Nome Interrompa sua leitura agora e experimente passar argumentos para um dos programas criados anteriormente, os argumentos obviamente sero ignorados pelo programa e este se comportar da mesma forma que antes.

O vetor de Strings o argumento do mtodo main que normalmente chamvamos de String args[]:
public static void main (String args[]) ...

class MostraArgumentos {

public static void main(String args[]) {

for (int i=0; i < args.length; i++) {

System.out.println("Argumento" + i+": "+ args[i]);

Resultado do programa para a chamada: java MostraArgumentos Passando 3 "argumento s"

Argumento0: Passando Argumento1: 3 Argumento2: argumento s

args.length; Retorna o comprimento do vetor de Strings, este valor usado para iterar sobre os argumentos que so Strings armazenadas em args[i]. Perceba que as aspas fazem com que nomes separados por espaos sejam considerados s um argumento. Os argumentos passados para seu programa so gravados em um vetor de Strings, para usar o argumento 3 que ficou guardado como String, na forma de inteiro, preciso primeiro convert-lo para inteiro. Isto pode ser feito no caso do nosso exemplo atravs de uma chamada a:
Integer.parseInt(args[1]); A classe Integer usada no cdigo acima um dos "wrappers" que descrevemos em 1.3.1. A operao contrria a que foi feita Integer.toString(int a);. O mtodo parseInt aceita tambm um segundo argumento que a base em que o nmero est representado na String.

Exerccios: 1Mude o primeiro programa em Java (HelloInternet) para imprimir "Hello" seguido do primeiro argumento de linha de comando (se existir: args.length>0 ). 2Construa um programa simples que recebe argumentos da linha de comando e os imprime atravs de cout. Normalmente isso que deve ser feito antes de usar um recurso da linguagem pela primeira vez, experiment-lo em programas simples.

1.5. ENCAPSULAMENTO COM PRIVATE, PUBLIC, "PACKAGE" e PROTECTED


Encapsulamento, "data hiding" um conceito bastante importante em orientao a objetos. Neste tpico vamos falar das maneiras de restringir o acesso as declaraes de uma classe e a prpria classe, isto feito atravs do uso das palavras reservadas public, private e protected que so qualificadores. Algum pode estar se perguntando o porqu de se restringir o acesso a certas partes de uma classe. A idia simples, devemos fornecer ao usurio, cliente de uma classe, o necessrio e somente o necessrio para que ele tire proveito da funcionalidade desta classe. Os detalhes devem ser omitidos, somente a lista de operaes a qual uma classe deve atender fica visvel. Os benefcios so muitos: clareza do cdigo, minimizao de erros, facilidade de extenso. Talvez a facilidade de modificao seja o mais importante dos benefcios. Como a classe conhecida pela sua interface, muito fcil mudar a representao interna sem que o cliente, usurio, perceba a diferena Estaremos preocupados em separar design de implementao, Java uma linguagem boa de se programar em termos de design e em termos de implementao. Programar tendo em vista o design tambm chamado de "programming in the large", enquanto que programar tendo em vista implementao, codificao chamado de "programming in the small". Alguns programadores experientes afirmam que Java se parece com C quando estamos preocupados com codificao, mas quando estamos preocupados com design, Java se assemelha a Smalltalk. Com encapsulamento voc ser capaz de criar componentes de software reutilizveis, seguros, fceis de modificar.

1.5.1. ENCAPSULANDO MTODOS E ATRIBUTOS


At agora no nos preocupvamos com o modo de acesso de declaraes de uma classe pois, mesmo sem saber porque, voc foi avisado para qualificar todos os atributos e mtodos de suas classes como public o que significa que eles so acessveis, visveis, em qualquer local de seu cdigo. Por visvel entenda o seguinte: se o atributo x do objeto UmPonto no visvel por exemplo fora de sua classe, ento no faz sentido escrever em main: UmPonto.x=0; . Mas ento como controlar o acesso de atributos e mtodos em uma classe? Simples, atravs das palavras reservadas private, public e protected cujos significados quando qualificando mtodos e atributos (private e public podem tambm qualificar classes) so descritos abaixo:
public Estes atributos e mtodos so sempre acessveis em todos os mtodos de

todas as classes. Este o nvel menos rgido de encapsulamento, que equivale a no encapsular.

private

Estes atributos e mtodos so acessveis somente nos mtodos(todos) da prpria classe. Este o nvel mais rgido de encapsulamento.

protected

Estes atributos e mtodos so acessveis nos mtodos da prpria classe e suas subclasses, o que ser visto em Herana 2.

Nada especificado, equivale "package" ou "friendly"

Estes atributos

e mtodos so acessveis somente nos mtodos das

classes que pertencem ao "package" em que foram criados. Este modo de acesso tambm chamado de "friendly".

(existem outros qualificadores, no relacionados com encapsulamento que sero explicados depois)

Package e friendly: Aparecem entre aspas porque no so palavras reservadas

Package e friendly: Aparecem entre aspas porque no so palavras reservadas da linguagem, so apenas nomes dados para o tipo de encapsulamento padro (default), que ocorre quando no existe um especificador. So nomes fceis de memorizar. Friendly significa amigvel, no sentido de que as classes que permitem este tipo de acesso possuem um encapsulamento mais relaxado com relao as classes do mesmo package (amigas). Package um grupo de classes relacionadas.

Protected ser explicada em 2.1 pois est relacionada com herana, por hora vamos focalizar nossa ateno em private e public que qualificam os atributos e mtodos de uma classe quanto ao tipo de acesso (onde eles so visveis) . Public, private e protected podem ser vistos como qualificadores ou "specifiers". Para facilitar a explicao suponha a seguinte declarao de uma classe: 1)
class Ponto { private float x private float y public void inicializa(float a,float b) {x=a; y=b;}; public void move (float dx,float dy); }

Fica fcil entender essas declaraes se voc pensar no seguinte: esses qualificadores se aplicam aos mtodos e atributos que vem imediatamente aps eles. Os elementos da classe qualificados como private aparecem com fundo cinza escuro indicando que sua "visibilidade" mais limitada que os atributos qualificados como public (cinza claro). Agora vamos entender o que private e o que public. Vamos supor que voc instanciou (criou) um objeto do tipo Ponto em seu programa:
Ponto meu; //instanciacao

meu=new Ponto();
Segundo o uso da definio da classe Ponto dada acima voc no pode escrever no seu programa:

meu.x=(float)5.0; //erro !

,como fazamos nos exemplos anteriores, a no ser que x fosse declarado como public na definio da classe o que no ocorre aqui. Mas voc pode escrever x=5.0; na implementao (dentro) de um mtodo porque enquanto no for feito uso de herana, pode-se dizer que um mtodo tem acesso a tudo que de sua classe, veja o programa seguinte. Voc pode escrever: meu.move(5.0,5.0); ,porque sua declarao (move) est como public na classe, em qualquer lugar se pode escrever meu.move(5.0,5.0);.
Visibilidade das declaraes de uma classe, fora dela ,de sua hierarquia e de seu package. Veja que s a parte public visvel neste caso:

A visibilidade das declaraes de uma classe, dentro dela mesma total.

1.5.1.1. ATRIBUTOS PRIVATE, MTODOS PUBLIC Aplicando encapsulamento a classe ponto definida anteriormente, deixando os atributos encapsulados e definindo a interface publica da classe somente atravs de mtodos.

//Classe ponto

public class Ponto {

private

float x,y;

//atributos private

public Ponto(float ax,float ay)

//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 float retorna_x()

return x;

public void mostra()

System.out.println( "(" + this.x + "," + this.y + ")" );

//Classe principal, Arquivo Principal.java

class Principal {

public static void main(String args[]) {

Ponto ap;

ap=new Ponto((float)0.0,(float)0.0);

ap.mostra();

(0,0)

//COMENTARIOS: Este programa no deixa voc tirar o ponto de (0,0) a no ser que seja chamada inicializa novamente. Fica claro que agora, encapsulando x e y precisamos de mais mtodos para que a classe no tenha sua funcionalidade limitada. Novamente: escrever ap.x=10; em main um erro! Pois x est qualificada como private. Sempre leia os exerccios, mesmo que no v faze-los. O que ocorre em classes mais complicadas, que ao definir mais mtodos na interface da classe, estamos permitindo que a representao interna possa ser mudada sem que os usurios tomem conhecimento disto. Exerccios: 1Implemente os mtodos public void altera_x(float a) , public float retorna_x(void), public void move (float dx,float dy ); .Implemente outros mtodos que achar importantes exemplo public void distancia(ponto a) { return dist(X,Y,a.X,a.Y); }, onde dist representa o conjunto de operaes matemticas necessrias para obter a distncia entre (X,Y) (a.X,a.Y). Voc provavelmente usar a funo Math.sqrt() que define a raiz quadrada de um double, no preciso fazer nenhum import para usar Math.sqrt(), mas preciso converter os argumentos de float para double e o valor de retorno de double para float. Veja que no mtodo distancia, podemos acessar os atributos private X e Y do argumento a, isto permitido porque distancia um mtodo da mesma classe de a, embora no do mesmo objeto, uma maneira de prover este tipo de acesso para outras classes (distancia de reta a ponto) dotar a classe Ponto de mtodos do tipo float retorna_x(void);. 2Escolha um programa implementado anteriormente e aplique encapsulamento, analise a funcionalidade de sua classe. Voc teve que implementar mais mtodos? Quais?

1.5.1.2. UM ATRIBUTO PUBLIC Neste tpico pedimos que o leitor faa uma variante do programa anterior, a nica diferena que Y deve ser colocado na parte public da definio da classe podendo ser acessado diretamente. Para escrever a variante, tome o cdigo do programa anterior e substitua
private float x,y;

por
private float x; public float y; //y pode ser acessado

Comentrios: Observe que agora nada impede que voc acesse diretamente y: ap.y=100.0, porm ap.x=10.00 um erro. Observe em que parte (rea) da classe cada um desses atributos foi declarado. Exerccios: 1Crie os mtodos float retorna_x(void), void altera_x(float a); que devem servir para retornar o valor armazenado em x e para alterar o valor armazenado em x respectivamente. Crie tambm os respectivos mtodos retorna e altera para o atributo y. 2Qual das seguintes declaraes permite que se acesse em main somente os mtodos move e inicializa, encapsulando todos os outros elementos da classe? Obs.: A ordem das declaraes private e public pode estar invertida com relao aos exemplos anteriores. a)
public class Ponto {

public float x; public float y; public void inicializa(float a, float b) {x=a; y=b;}; public void move(float dx, float dy) ; {x+=dx; y+=dy; }; };

b)
public class Ponto {

public void inicializa(float a, float b) {x=a; y=b;}; public void move(float dx, float dy) ; {x+=dx; y+=dy; }; private float x; private float y; };

c)
public class Ponto {

public void inicializa(float a, float b) {x=a; y=b;}; private void move(float dx, float dy) ; {x+=dx; y+=dy; }; public float x; private float y; };

1.5.2. ENCAPSULAMENTO E "PACKAGES"

1.5.2. ENCAPSULAMENTO E "PACKAGES"


Neste tpico explicaremos o recurso de packages com nfase nas opes de encapsulamento relacionadas , em herana explicaremos este recurso com nfase no reuso de cdigo das packages oferecidas com a linguagem. Packages so conjuntos de classes relacionadas, estes conjuntos so determinados incluindo uma linha no topo de cada arquivo indicando a qual package pertencem as classes ali declaradas. Se nenhuma linha inserida assume-se que todas as classes pertencem a uma package s. 1.5.2.1. ENCAPSULAMENTO DE ATRIBUTOS E MTODOS COM PACKAGES O encapsulamento de atributos e m atingido com o uso de packages muito semelhante ao encapsulamento com private e public, s que agora o "limite de visibilidade" mais amplo do que a classe. A questo aqui levantada se a classe visvel fora do "package" ou no. S para lembrar, a questo que do item anterior: 1.5.1, era se os mtodos e atributos eram visveis fora da classe ou no.
Visibilidade das declaraes de uma classe, dentro de seu package:

Quando explicarmos protected forneceremos um diagrama completo dos modos de encapsulamento de mtodos e atributos, este diagrama muito til para a memorizao. "Packages" um recurso da linguagem que permite formar grupos de classes relacionadas entre si de forma que elas ofeream facilidades umas as outras. Facilidades estas que nem sempre so oferecidas ao usurio. Vamos montar uma package de nome Geometria contendo classes que representam elementos grficos tais como retas, crculos e pontos. A estrutura de diretrio abaixo descreve a disposio dos arquivos deste exemplo:
Inicio:

Aps Javac:

Note que a package Geometria est toda sob um diretrio ou folder de mesmo nome, isto ocorre porque a estrutura de packages deve ser mapeada em uma estrutura de diretrios para que suas classes possam ser achadas. Assim a classe java.awt.Color est dois nveis, portanto dois diretrios abaixo na hierarquia de packages fornecida com a linguagem.

//Classe ponto

package Geometria;

public class Ponto {

float x,y; //nenhu especificador, default=package

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

//garante o estado do objeto

this.x=ax; this.y=ay;

public float retornaX()

return x;

public void move(float dx,float dy)

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

public void mostra()

System.out.println("("+this.x+","+this.y+")");

//Classe circulo

package Geometria;

public class Circulo {

float raio,x,y;

//nenhum especificador, defaul=package

public Circulo(float ax,float ay,float ar)

//garante o estado do objeto

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

public void altera_raio(float a)

this.raio=a;

public float retorna_raio()

return this.raio;

public void move(float dx,float dy)

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

public float distancia(Ponto ap)

float dcp; //distancia do centro do circulo ao ponto

dcp=(float)Math.sqrt((double) ); //acesso direto

((x-ap.x)*(x-ap.x)+(y-ap.y)*(y-ap.y))

); //acesso direto

//aos atributos de ap, isto porque as classes pertencem ao mesmo package

if (dcp<raio) {return raio-dcp; }

else {return dcp-raio; }

public void mostra()

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

//Arquivo Reta.java

//Classe Reta

package Geometria;

public class Reta {

Ponto a,b;

//idem , sao encapsulados como package

public Reta(float ax,float ay,float bx,float by)

a=new Ponto(ax,ay);

b=new Ponto(bx,by);

public float distancia(Ponto ap)

//metodo nao implementado

//acesse livremente os atributos do argumento Ponto

//de modo a calcular sua distancia a esta reta, ex copia=ap.x;

return 0.0f;

public void mostra()

a.mostra();

b.mostra();

//Classe principal, Arquivo Principal.java

import Geometria.*;

public class Principal {

public static void main(String args[]) {

Circulo acirc;

//acirc.x=(float)10.0; erro! atributo encapsulado (modo package)

Ponto apto;

acirc=new Circulo((float)0.0,(float)0.0,(float)1.0);

acirc.mostra();

apto=new Ponto((float)4.0,(float)3.0);

apto.mostra();

System.out.println("Dist:" + acirc.distancia(apto));

(0,0,1) (4,3) Dist:4

(0,0,1) (4,3) Dist:4

As declaraes em negrito dos arquivos acima: package Geometria.*; e import Geometria.* devem ser inseridas logo no incio do arquivo, s podendo ser precedidas por comentrios. Existe uma quantidade grande de "packages", j definidas na linguagem, as quais abordaremos na segunda parte. Por hora basta saber que j estamos usando declaraes da "package" java.lang , mesmo sem especificar import java.lang.*; no incio de nossos arquivos. Isto ocorre porque este package importado implicitamente em todos os programa Java. O .* usado em import Geometria.*; tem o significado de todas as classes da package Geometria, o asterisco usado como um coringa, um valor que pode substituir todos os demais, assim como em alguns sistemas operacionais. Embora de fcil utilizao, este conceito constitui uma inovao com relao a C++. Em Modula-3 pode-se obter um efeito semelhante utilizando declaraes de classes (tipos objetos) no mesmo mdulo e interfaces que no exportam tudo o que existe no mdulo, assim as classes declaradas no mesmo mdulo oferecem facilidades umas as outras. O modo de acesso de atributos e mtodos chamado "friendly" ou package proporcionado pelo uso de "packages" e permite programar de maneira eficiente (sem muitas chamadas de mtodos) e segura (com encapsulamento). Se os tributos da classe Ponto forem especificados como "friendly" ou package (equivale a nenhum especificador), eles podero ser acessados diretamente (sem chamadas do tipo ap.retorna_x(); ) pela classe Reta que pertence a mesma "package", mas continuam encapsulados para as classes externas ao "package" ou seja para o usurio. Enfatizamos o termo "diretamente" porque acessar um atributo via mtodo bem mais custoso do que acess-lo diretamente, mas se voc programar usando packages, ganhar o beneficio da eficincia sem perder o do encapsulamento. 1.5.2.2. ENCAPSULAMENTO DE CLASSES COM PACKAGES At agora, tnhamos declarado todas as classes como public (public class Nomeclasse {}), embora sem explicar exatamente porque. Este tpico trata da possibilidade de o programador desejar criar uma classe para seu uso prprio e no fornec-la para o usurio. O que a linguagem Java permite neste sentido : 1- A criao de classes que s podem ser usadas dentro de packages, ou seja, voc no pode declarar um objeto desta classe externamente ao package. 2- A criao de classes que podem ser usadas somente pelas classes presentes no mesmo arquivo, embora no tenhamos mostrado, um arquivo pode conter a declarao de mais de uma classe desde que somente uma delas seja public. O encapsulamento de classes segue uma sintaxe semelhante ao encapsulamento de mtodos e atributos, ou seja: atravs de qualificadores ou modificadores:
QualificadorDaClasse class NomeDaClasse { /*Atributos e metodos */ }

Os qualificadores so:
public Estas classes so sempre acessveis em todos os packages do seu cdigo. Somente uma classe publica permitida por arquivo, e o arquivo deve ter o mesmo nome da classe.

private

Estas classes so acessveis somente pelas classes declaradas no mesmo arquivo. Um arquivo pode possuir vrias classes private, mas uma nica classe public.

Nada especificado "package"

Estas classes podem ser acessadas no package que elas pertencem, se nenhum package especificado, elas pertencem ao programa.

(existem outros qualificadores, no relacionados com encapsulamento que sero explicados depois) Seus programas no precisam necessariamente fazer uso destes recursos de encapsulamento, mas todo cdigo escrito para terceiros deve utiliz-los intensamente. Voc teve ter notado que sempre definimos uma classe por arquivo, isto feito porque a linguagem s permite uma classe public por arquivo, as outras tem que ser private ou package. Um exemplo de utilizao: ao criar uma classe lista ligada algum pode achar conveniente definir uma classe n para ser usada somente pela classe listaligada. Uma opo definir a classe n com modo de encapsulamento: package. O cliente de sua classe lista ligada no precisa saber que esta classe se baseia em uma classe No. Vamos implementar esta idia no exemplo a seguir, tomarei o cuidado de faz-lo bem simples pois estamos no comeo do tutorial:
Inicio:

Aps Javac:

package listas;

//classe Lista, classe No arquivo Lista.java

class No { //sem especificador de modo de acesso na classe

private char info; //se eu ja tivesse ensinado protected usaria em lugar de private

private No prox;

//"ponteiro" para o proximo no

No(char i,No p)

//construtor

info=i;

p=prox;

char retorna_info()

//retorna valor do campo

return info;

void altera_info(char i)

//altera valor do campo

info=i;

void altera_prox(No p)

//altera valor do proximo no

prox=p;

No retorna_prox()

//retorna referencia ao proximo no

return prox;

public class Lista {

private No cabeca;

//inicio da lista

private int elementos; //numero de nos na lista

public Lista()

//construtor

cabeca=null;

elementos=0;

public void insere(char a)

{ //realizada em muitos

mais pacos para facilitar apredizado

elementos++;

No temp;

if (cabeca==null) cabeca=new No(a,null);

else{

temp=new No(a,null);

temp.altera_prox(cabeca);

cabeca=temp;

//se cabeca == null tambem funciona

public char remove()

No removido;

if (cabeca==null) return '0'; //elementos==0

else

elementos--;

removido=cabeca;

cabeca=cabeca.retorna_prox();

return removido.retorna_info();

public int retorna_elementos()

return elementos;

public void mostra() //nao deveria estar aqui, e so para debugar

No temp=cabeca;

while (temp!=null)

System.out.print(

"[" + temp.retorna_info()

"]-"

);

temp=temp.retorna_prox();

System.out.print("null");

System.out.println();

Agora voc pode escolher entre duas verses do programa principal, a verso da esquerda implementa um loop de entradas do teclado que permite testar iterativamente a classe Lista, no explicaremos ainda detalhes deste loop, apenas como us-lo. D uma olhada no cdigo desta verso de programa principal, se voc acha-lo complicado pode usar a segunda verso presente a direita deste arquivo e em uma segunda leitura retornar a verso da esquerda. Na verso com o loop (1) a letra `i' indica o comando insero, se voc digitar i<enter> inserir o caractere <enter> na sua lista, o que normalmente no desejado, digite ic<enter> para inserir o caractere c. `r' indica remoo, e `m' indica que a lista deve ser mostrada na tela. Pelo resultado do programa voc entender melhor esses comandos rudimentares de teste. Voc pode achar rudimentar programar assim, mas um bom mtodo, ver como esta mesma lista depois de testada assim pode ficar bonita se inserida em um applet e mostrada graficamente.
Escolha uma implementao para entender e compilar:

//Classe principal, Arquivo Principal.java versao 1 import java.io.DataInputStream; import listas.*; class Principal {

public static void main(String args[]) { Lista ml=new Lista(); //ml=minhalista char o,e; DataInputStream try{ do { o=(char)meuDataInputStream.read(); //o=opcao, e=temporario meuDataInputStream =new DataInputStream(System.in);

switch (o) {

case 'i': e=(char)meuDataInputStream.read(); ml.insere(e); break; case 'r': e=ml.remove(); System.out.println(e); //System.out.flush(); break;

case 'm': ml.mostra(); System.out.println(); //System.out.flush(); break;

default: ; } } while (o!='q'); } catch (Exception erro) { /* nao faco nada */ }

} //main } //class

ia

[a]-null

iviaij

//insere v, insere a, insere ...

//mostra

[j]-[a]-[v]-[a]-null

//remove

//sai j

[a]-[v]-[a]-null

null

//quit

//Classe principal, Arquivo Principal.java versao 2 import java.io.DataInputStream; import listas.*; class Principal { public static void main(String args[]) { char e; Lista ml=new Lista(); //ml=minhalista ml.insere('a'); //mesma sequencia da versao com menu

//de programa principal ml.mostra(); ml.insere('v'); ml.insere('a'); ml.insere('j'); ml.mostra();

e=ml.remove(); System.out.println(e); ml.mostra(); ml.remove(); //embora o metodo //remove retorne um valor ml.remove(); //nestas chamadas, //este valor de retorno e' ml.remove(); //ignorado ml.mostra(); } }

[a]-null [j]-[a]-[v]-[a]-null j [a]-[v]-[a]-null null

//COMENTARIOS Os programadores que no esto acostumados com coleta automtica de lixo podem achar estranho que retiramos o primeiro elemento da lista simplesmente perdendo propositalmente a referncia para ele ao emendar o n cabea com o restante:

No se preocupem, a linguagem cuida da desalocao.

1.6. TIPO ABSTRATO DE DADOS


Tipo abstrato de dados, TAD, se preocupa em proporcionar uma abstrao sobre uma estrutura de dados em termos de uma interface bem definida. O encapsulamento mantm a integridade do objeto evitando acessos inesperados. O fato de o cdigo estar armazenado em um s lugar cria um programa modificvel, legvel, coeso. A idia criar classes que ocultem a sua representao interna as quais podem geralmente ser modeladas atravs de "shopping list approach". Por "shopping list approach" entenda que voc pode modelar sua classe atravs das operaes que ela suporta, ou seja, antes de comear a implementar recomendvel que se faa uma lista (semelhante a uma lista de compras) das operaes desejadas para a classe e depois se escolha a representao interna adequada. Completando este conceito amplo podemos dizer que uma classe implementa um tipo abstrato de dados. So exemplos de tipos abstratos de dados: Uma rvore binria com as operaes usuais de insero, remoo, busca ... Uma representao para nmeros racionais (numerador, denominador) que possua as operaes aritmticas bsicas e outras de converso de tipos. Uma representao para ngulos na forma (Graus, Minutos, Segundos). Tambm com as operaes relacionadas, bem como as operaes para converter para radianos, entre outras. Tipo abstrato de dados um conceito muito importante em programao orientada a objetos e por este motivo logo apresentado neste tutorial. Os exemplos seguintes so simples por no podermos usar todos os recursos da linguagem ainda. Dada esta importncia, a medida em que formos introduzindo novos conceitos exemplificaremos com aplicaes na implementao tipos abstratos de dados.

aplicaes na implementao tipos abstratos de dados. Exerccios: 1Use a estratgia da lista de compras ("shopping list approach") para modelar a interface do tipo abstrato de dados Ponto, tente pensar nas operaes que geralmente se aplicam a pontos em geometria, tais como distncia a outros elementos, rotao em torno de outro ponto. Reimplemente este TAD adicionando as inmeras alteraes.

1.6.1. TAD FRAO


Neste exemplo implementaremos o tipo abstrato de dados frao. Baseado no conceito de nmero racional do campo da matemtica. Algumas operaes no foram implementadas por serem semelhantes s existentes. Uma aplicao deste TADs consiste em alguns clculos onde pode ocorrer muita perda de preciso ao longo do programa devido ao uso de aritmtica de ponto flutuante. Por exemplo: faa exatamente o seguinte em sua calculadora: 5 / 3 * 3 , qual o resultado? Ao terminar este programa teste a seguinte operao com fraes (5/3)*(3/1), qual ser o resultado? No segundo volume criaremos um applet para ensinar contas com fraes para crianas. Sero sugeridos exerccios para a criao de applets com funes educacionais, relacionando fraes e ngulos. RESUMO DAS OPERAES MATEMTICAS ENVOLVIDAS: Simplificao de frao: (a/b)=( (a/mdc(a,b)) / (b/mdc(a,b)) ) Onde mdc(a,b) retorna o mximo divisor comum de ab. Soma de frao: (a/b)+(c/d)=( (a.d+c.b) / b.d ) simplificada. Multiplicao de frao: (a/b) * (c/d)= ( (a*c) / (b*d) ) simplificada. Igualdade: (a/b)== (c/d) se a*d == b*c. No igualdade: (a/b) != (c/d) se a*d != b*c Maior ou igual que: (a/b)(c/d) se a*d b*c "SHOPPING LIST APPROACH" PARA O TAD FRAO: (O conjunto de operaes implementadas esta marcado com . A finalizao dessa shopping list bem como do programa deixada como exerccio, o qual no deve ser difcil pois vendo a implementao da soma, o leitor obtm quase que de maneira direta a implementao da subtrao, o mesmo ocorre para as demais operaes): Construtor (recebe dois argumentos numricos inteiros) Simplificao da frao (diviso do numerador e denominador por mximo divisor comum) Soma de frao (mtodo recebendo argumento do prprio tipo frao) Subtrao de frao Multiplicao Diviso Teste de igualdade Teste de desigualdade Teste de maior ou igual que Teste de menor ou igual que Teste de maior que Teste de menor que Impresso na tela Rotina de criao com entrada de numerador e denominador pelo teclado Converso para double Converso para long Operao de alterao do numerador Operao de alterao do denominador Retorno do valor do numerador e denominador Outras operaes que o leitor julgar necessrias TPICOS ABORDADOS: Construtores em geral, criao de mtodos de converso de tipos, chamadas de mtodos do mesmo objeto, operador % que retorna o resto da diviso de dois inteiros. CONSIDERAES DE PROJETO: A representao escolhida para o numerador e o denominador da frao ser baseada no tipo int. O formato escolhido para os mtodos que implementam as operaes :
TipoDoValorDeRetorno NomedaOperacao(TipoDoOperando ValorDoOperando);

Nesse formato um dos operandos a prpria frao que est recebendo a chamada de mtodo o outro passado como argumento. Outros formatos equivalentes poderiam ter sido adotados. Um dos possveis formatos faz com que os dois operandos sejam passados como argumentos e a frao que est recebendo a chamada de mtodo executa a operao para esses argumentos retornando o valor. Voltaremos a discutir essas alternativas de implementao.

operao para esses argumentos retornando o valor. Voltaremos a discutir essas alternativas de implementao. Se durante o processo de construo de seu programa, ocorrer a repetio de um certo trecho de cdigo nos diversos mtodos (repetio da rotina de simplificao nos mtodos de soma, subtrao), considere a opo de definir este trecho de cdigo como um mtodo em separado. Se este mtodo no for um mtodo que deva compor, participar, da interface, mas que ainda assim tem seu padro muito repetido, considere a possibilidade de defini-lo como private (mtodo mdc). No existe uma regra de ouro que diga exatamente como projetar as suas classes para que elas preencham requisitos de portabilidade, robustez, flexibilidade. Todavia uma recomendaes importantes podem ser feitas para evitar reformulaes durante o processo de programao: "No economize tempo na fase de projeto. Procure antes de programar, simular o uso de uma classe, seja mentalmente ou atravs de um prottipo." O clculo do mximo divisor comum (mdc) de dois inteiros no tem nada a ver com as operaes a serem oferecidas por fraes, teria a ver com as operaes oferecidas por um objeto facilidades de clculos (mdc(a,b) , fatorial(b) , fibonaci(x), combinacoes(n,k) ). No entanto a classe frao precisa da operao mdc. Ocorre que j estudamos uma maneira de implementar um mtodo em uma classe e no oferec-lo atravs da interface, o qualificador private. Em C++ provavelmente o programador implementaria mdc como uma funo isolada.

IMPLEMENTAO:

//TAD fracao. //File Fracao.java class Fracao { private int num,den; //numerador, denominador private int mdc(int n,int d) //metodo private maximo divisor comum //metodo de Euclides +- 300 anos AC. { if (n<0) n=-n; if (d<0) d=-d; while (d!=0) { int r=n % d; n=d; d=r; } return n; } public Fracao(int t,int m) { num=t; den=m; this.simplifica(); //chamada para o mesmo objeto. } public void simplifica() //divide num e den pelo mdc(num,den) { int commd; commd=mdc(num,den); num=num/commd; den=den/commd; if (den<0) { den=-den; num=-num;}; } //operacoes matematicas basicas //move sinal para cima //divisor comum //construtor comum //%=MOD=Resto da divisao inteira.

public Fracao soma (Fracao j) { Fracao g; g=new Fracao((num*j.den)+(j.num*den),den*j.den); return g; }

public Fracao multiplicacao(Fracao j) { Fracao g; g=new Fracao(num*j.num,den*j.den); return g; } //operacoes de comparacao

//operacoes de comparacao

public boolean igual(Fracao t) { return ((num*t.den)==(den*t.num)); }

public boolean diferente(Fracao t) { return ((num*t.den)!=(den*t.num)); } public boolean maiorouigual(Fracao t) { return ((num*t.den)>=(t.num*den)); } //operacoes de input output //exibe fracao no video

public void mostra() {

System.out.println("(" + num + "/" + den + ")"); }

//operacoes de conversao de tipos

public double convertedbl() //converte para double { double dbl; dbl=((double)num/(double)den); return dbl; }

public int converteint() //converte para int { int itng; itng=num/den; return itng; } public void altera_num(int nn) { num=nn; } public void altera_den(int nd) { den=nd; } public int retorna_num() { return num; }

public int retorna_den() { return den; } }

class Principal {

public static void main(String args[])

Fracao a,b,c;

a=new Fracao(5,3);

b=new Fracao(2,6);

System.out.print("Esta e' a fracao a: ");

a.mostra();

System.out.print("Esta e' a fracao b: ");

b.mostra();

c=a.soma(b);

System.out.print("c de a+b: "); //c(a+b)

c.mostra();

System.out.print("a*b: ");

c=a.multiplicacao(b);

c.mostra();

System.out.print("a+b: ");

c=a.soma(b);

c.mostra();

System.out.print("a>=b: ");

System.out.println(a.maiorouigual(b));

System.out.print("a==b: ");

System.out.println(a.igual(b));

System.out.print("a!=b: ");

System.out.println(a.diferente(b));

System.out.print("(int)a ");

System.out.println(a.converteint());

System.out.print("(double)a ");

System.out.println( a.convertedbl());

Esta e' a fracao a: (5/3) Esta e' a fracao b: (1/3) c de a+b: (2/1) a*b:(5/9) a+b: (2/1) a>=b: true a==b: false a!=b: true (int)a 1 (double)a 1.66667

//COMENTARIOS: Uma implementao completa do tipo de dados frao tem que checar por "overflow" do numerador e denominador o que ocorre frequentemente quando se trabalha com nmeros primos entre si (no podem ser simplificados), uma possvel soluo para este problema fazer uma aproximao e/ou alterar a representao interna da frao para um tipo com maior numero de bits (de int para long). De qualquer forma estas extenses so exerccios avanados pois a ltima delas envolve uso de herana. Exerccios: 1Complete o tipo frao com os mtodos faltantes da "shopping list approach"
long retorna_den(void) {return den;} long altera_den(int a) {den=a;}

Considerando que os atributos declarados em private no so acessveis fora da classe, descreva a utilidade desses mtodos. Eles so teis se usados pelos prprios mtodos de fra? *2-

*2Implemente o tipo abstrato de dados nmero complexo com as operaes matemticas inerentes. Faa antes um projeto dos mtodos que sero implementados, descreva (detalhadamente) as operaes matemticas necessrias. Que forma de representao voc escolher: coordenadas polares ou retangulares? 3Pesquise sobre matrizes em Java: 1.3.2. Crie um tipo abstrato de dados matriz que suporte atribuies e leituras de clulas contendo elementos do tipo float. Crie outros mtodos para este tipo abstrato de dados como multiplicao por uma constante. 4Implemente o tipo abstrato de dados relgio, pesquise as operaes normalmente oferecidas por relgios reais, o nico objetivo marcar as horas. Se voc precisar de inspirao para este exerccio, consulte o exemplo da classe Contador e seus exerccios.

1.6.2. STRINGS, UM MODELO DE CLASSE


Agora que j estamos programando alguns tipos abstratos de dados, est na hora de apresentar um exemplo que mostre como comportamento importante para um TAD. S que desta vez ficaremos do lado do cliente, do usurio desse tipo abstrato de dados e no do lado do programador. Estudaremos a classe String oferecida pela linguagem. Nos tutoriais desta srie, feitos para outras linguagens (C++, Modula-3), recomendvamos como exerccio a implementao do tipo abstrato de dados string, que deveria suportar operaes de concatenao, substring, acesso a elemento, etc. Este exerccio no faz sentido em Java porque o tipo String, fornecido com a linguagem como uma classe da package java.lang que importada implicitamente em todos os programas alm disso a sua implementao desta classe bastante completa. A declarao de Strings se d da mesma forma que os outros objetos: String minhaString; . O compilador oferece uma facilidade sinttica para a inicializao com valores literais:
String teste="Ola meu amigo"; //objeto instanciado com valor Ola meu amigo

Para concatenar Strings use o operador +. Os operandos podem no ser Strings, nesse caso sero convertidos para objetos desta classe, por exemplo se um dos argumentos for um inteiro, o objeto String correspondente conter o valor literal deste inteiro.
System.out.println(teste + " Andre!"); //Ola meu amigo Andre! teste+=" Andre!"; Andre!" System.out.println(teste); //totalmente equivalente a primeira //atalho para concatenacao seguida de atribuicao: teste=teste+"

Para obter o comprimento em nmero de caracteres de uma String, chame o mtodo length() para a String em questo. Para obter o caractere presente na posio 6 da String, chame o mtodo charAt(); . Note que o primeiro caractere da String est na posio zero:
char umChar=teste.charAt(6); //um char recebe `u'

Para obter uma substring, chame o mtodo substring(int a,int b); onde o primeiro argumento o ndice do incio da substring e o segundo o ndice do fim da substrings, os caracteres em a e b tambm so includos:
String aStr=teste.substring(0,2); //aStr recebe ola

Para transformar todos os caracteres de uma String em letras maisculas basta chamar o mtodo toUpperCase();
teste=teste.toUpperCase(); //teste fica igual a OLA MEU AMIGO

Um mtodo interessante para usar em checagem de padres em texto indexOf(String busque); . Este mtodo retorna o ndice posio inicial de ocorrncia de busque na String para a qual foi chamado o mtodo:
teste.indexOf("MEU"); //retorna 4 Analogamente, lastIndexOf(String busque), retorna o ndice de ocorrncia da substring, s que agora do procurando do fim para o comeo. teste.indexOf("M"); //resulta em 9 (logo a seguir do ultimo A que esta na posicao 8) Para comparao de igualdade use: test.equals("OLA MEU AMIGO"); //retorna valor booleano Alm disso, a classe String define mtodos para converso dos tipos bsicos para seus valores na forma de String, voc pode achar esses mtodos um pouco estranhos, pois eles tem todos os mesmos nomes e no precisam de um objeto para serem chamados, eles so chamados para a classe: String.valueOf(3); //argumento e naturalmente um inteiro, retorna "3"

String.valueOf(3.1415); //argumento e double, retorna "3.1415"

Os mtodos de nome valueOf so uma padronizao de mtodos de converso entre tipos encontrados em algumas das classes pr-definidas na linguagem, principalmente nas classes "wrappers" que foram exemplificadas com a classe Integer.

class StringTest {

public static void main (String args[]) {

String teste="Ola meu amigo";

System.out.println(teste + " Andre!"); //Ola meu amigo Andre!

teste+=" Andre!";

//atalho para concatenacao seguida de atribuicao

System.out.println(teste); //totalmente equivalente a primeira

char umChar=teste.charAt(5); //um char receber `e'

System.out.println("Andre "+umChar+teste.substring(3,13));

teste=teste.toUpperCase(); //teste fica igual a OLA MEU AMIGO ANDRE!

for (int i=0;i<teste.length();i++) //imprimindo caracteres um a um

System.out.print(teste.charAt(i));

System.out.println(); //pula uma linha

System.out.println(); //pula uma linha

System.out.println(teste.indexOf("AMIGO")); //retorna 8

System.out.println(teste.indexOf("biba")); //nao acha, retorna -1

System.out.println(teste.lastIndexOf("AMIGO")); //retorna 8

System.out.println(String.valueOf(3.1415f)); //Metodo chamado para a classe

Ola meu amigo Andre! Ola meu amigo Andre! Andre e meu amigo OLA MEU AMIGO ANDRE! 8 -1 8 3.1415

//COMENTARIOS O cdigo fonte disponvel com o compilador constitui uma tima fonte de aprendizado sobre como construir componentes de software reutilizveis no estilo de programao orientada a objetos, leia-o sempre que estiver disponvel e quando no estiver, preste ateno na sua interface. Voc deve ter notado que exceto pelo mtodo toUpperCase() a classe String no permite alteraes no seu estado depois de ter sido criada. Isto decorre da deciso do "Java team" de implementar duas classes para garantir a funcionalidade e segurana no uso de strings, so elas: String e StringBuffer. StringBuffer permite ser modificada, abaixo apresentamos uma tabela de seus principais mtodos, para maiores informaes consulte a documentao de java.lang.* Tabela de mtodos da classe StringBuffer
StringBuffer endereco="http://www.java.com"; //Erro! Esta facilidade para instanciao no permitida para a classe StringBuffer, ao envs disso use o construtor descrito abaixo.

StringBuffer endereco=new StringBuffer("http://www.java.com"); //agora sim esta' correto endereco.append("/fim.html"); //concatena e atribui, forma: "http://www.java.com/fim.html" endereco.charAt(5); //retorna o caractere `/' System.out.println(endereco + "/outro.html"); //o operador+ tambem funciona para

StringBuffer endereco.insert(15,"soft"); //forma "http://www.javasoft.com/fim.html" endereco.setCharAt(25,'O'); //forma "http://www.javasoft.com/fOm.html" System.out.println(endereco.toString()); //retorna objeto String equivalente Exerccios : 1Melhore um dos exerccios anteriores introduzindo um nome para o objeto. Este nome pode ir nas sadas de tela executadas pelo objeto e o nome dado para o construtor como uma String. No se esquea de prover mtodos como String get_name(). *2Este um exerccio avanado. Busca de padres em texto uma operao bastante comum em editores. A busca de informaes na internet quando feita por palavras chave, executada por aplicativos que podem ter como estratgia a contagem do nmero de ocorrncias de certas palavras nos textos cadastrados. Neste exerccio voc far parte desse trabalho de busca de informaes, eu vou te orientar como: Crie um mtodo que aceita como argumento uma String grande que pode ter vindo de vrias fontes (no importa quais). Este mtodo pode pertencer a uma classe de nome EstatisticasDeTexto e deve quebrar o argumento String em palavras separadas por espaos (voc j pode fazer isso com os mtodos conhecidos, mas talvez queira usar a classe StreamTokenizer). Para cada uma destas palavras este mtodo faz uma busca na estrutura de armazenamento de palavras da classe, se a palavra no constar, deve ser includa com multiplicidade 1, caso ela conste na estrutura, apenas sua multiplicidade deve ser incrementada. Um problema pode surgir. A estrutura deve ser capaz de crescer de tamanho durante as vrias chamadas de mtodos com Strings para serem processadas. Se voc usar vetor uma opo realocar o vetor com o dobro de espaos. Outra opo usar uma lista ligada. 3Crie uma classe que agrega um stream de entrada de dados ligado ao teclado. Coloque esta classe como intermediria na recepo dos dados de modo que ela testa para todo caractere lido se ele igual ao caractere `\n'. Se o caractere lido for igual a `\n' ele deve ser retirado da String lida (use os mtodos substring e concatenao ensinados). Faa com que a chamada do mtodo readline de sua classe dispare o a chamada do mtodo readline do stream agregado nela. Resumindo : sua classe atuar como um filtro de dados do teclado. Mantendo a analogia do exemplo introdutrio sobre Streams, estaremos lidando com conexes entre canos, ou seja para os dados chegarem do teclado ao seu programa eles devem passar pela sua classe filtro.

1.6.3. TAD E ALOCAO DINMICA.


Este exemplo cria um tipo abstrato de dados matriz bidimensional de inteiros (int). O leitor pode achar estranho que para representar esta matriz usamos um vetor, mas que isto traz algumas vantagens: Representao linear de uma matriz: Pode-se representar uma matriz de qualquer dimenso em um vetor. Veja o exemplo de uma matriz bidimensional de inteiros mostrada no formato indiceLinear:valorArmazenado. Os ndices lineares vo de 1 at n2. Matriz:
1:3 4:23 7:21 2:32 5:90 8:08 3:1 6:12 9:32

Vetor equivalente:
1:3 2:32 3:1 4:23 5:90 6:12 7:21 8:08 9:32

Vantagem da representao linear (vetor): para referenciar uma posio gasta-se somente um inteiro contra dois da representao matriz. Pode-se considerar posies que apontam para outras posies, basta interpretar o contedo do vetor como um ndice linear. Este tipo de construo pode ser til em Java, pois a linguagem no possui ponteiros este um dos motivos de estarmos ensinando esta tcnica. Desvantagem da representao linear (vetor): necessrio criar funes de converso de ndice na forma (linha,coluna) para (ndice linear) e de (ndice linear) para (coluna) ou (linha). So as funes lin e col e linear deste exemplo. Em uma primeira leitura, no preciso entender os clculos com ndices, apenas o uso dos mtodos que oferecem estes clculos. Para ns, clientes da classe Matriz2DInt, os elementos sero indexados de 1 at m (arbitrrio) em termos de ndice linear. Em termos de linhas e colunas, eles sero indexados de (1,lmax) e de (1,cmax). O fato da linguagem adotar ndices de 0 at m-1 para matrizes e vetores no importa, ns construmos em volta dessa representao para que nosso objeto fornea, trabalhe na conveno mais natural de indexao para humanos: 1 at m. Quanto as operaes de ndices, apenas verifique a veracidade para valores arbitrrios de uma matriz como a desenhada anteriormente tentar entend-las leva tempo e eu sei que voc capaz de programa-las. Dentre os objetivos de um programador de uma linguagem orientada a objetos podemos citar: escrever pouco cdigo, escrever cdigo correto, tornar o seu cdigo reutilizvel. A criao de componentes de software reutilizveis, enormemente facilitada pela portabilidade da linguagem Java. Programas exemplo posteriores (segunda parte) mostraro como reutilizar esta classe matriz para a criao de um jogo de quebra cabea de quadradinhos deslizantes. Os quadradinhos devem ser movidos na moldura de modo a formar uma imagem onde um dos quadrados vazio. "SHOPPING LIST APPROACH" PARA O TAD MATRIZ2DInt:

(As operaes implementadas esto marcadas com . As operaes marcadas com devem ser implementadas como exerccio avanado cujo objetivo completar um de seus primeiros componentes de software reutilizvel, estamos incluindo desta vez os atributos tambm).
private int linhas; //numero de linhas da matriz

private int colunas; //numero de colunas da matriz private int tam; //=linhas*colunas private int lc[]; //=new int[linhas*colunas]=vetor[0..(tam-1)]=~matriz[l][c]
Construtor (recebe dois argumentos numricos inteiros, nmero de linhas e de colunas) Converso de linha e coluna para ndice linear Converso de ndice linear para coluna. Converso de ndice linear para linha. Operao de troca de elementos da matriz com dois argumentos do tipo ndice linear. Operao de troca de elementos da matriz com argumentos do tipo (linha e coluna). Operao de atribuio a elemento da matriz indicado por ndice linear. Operao de atribuio a elemento da matriz indicado por linha e coluna. Operao de retorno do contedo de posio da matriz indicada por um ndice linear. Operao de retorno do contedo de posio da matriz indicada por linha e coluna. Representao do nmero de colunas, permitindo acesso de leitura ao cliente. Representao do nmero de linhas, permitindo acesso de leitura ao cliente.

Programa exemplo da classe Matriz2DInt.

class Matriz2DInt {

private int linhas; //numero de linhas da matriz

private int colunas; //numero de colunas da matriz

private int tam;

//=linhas*colunas

private int lc[]; //=new int[linhas*colunas]=vetor[0..(tam-1)]=~matriz[l][c]

public Matriz2DInt(int l,int c)

//cria matriz LxC

lc=new int[l*c];

//l,c dimensoes ; lc vetor[l*c]

linhas=l;

colunas=c;

tam=linhas*colunas;

//qualquer uma das funcoes abaixo retorna int negativo se nao obteve sucesso

public int linear(int alin,int acol)

//ind linear a partir de linha e coluna

//nao modifica nenhum atributo

int result;

//valor de retorno para todos os metodos ...

if ( (0<alin) && (alin<=linhas) && (0<acol) && (acol<=colunas) )

{ result=(alin-1)*colunas+acol; }

else

{ result=-1; }

return result;

public int col(int indlin)

//coluna a partir do indice linear

//nao modifica nenhum atributo da classe

int result;

if ( (0<indlin) && (indlin<=tam) )

{ result=(indlin % colunas);

if (result==0)

{ result=colunas; }

else

{ result=-1; }

return result;

public int lin(int indlin)

//linha a partir do indice linear

//nao modifica nenhum atributo da classe

int result;

if ( (0<indlin) && (indlin<=tam) )

{ result=(int)(

( (indlin-1)/colunas )+1

); }

else

{ result=-1; }

return result;

public boolean trocaindlin(int i,int j)

//argumentos: 2 indices lineares

// retorna se conseguiu,ou nao conseguiu(false)

int aux; //auxiliar na troca

if ( (0<i) && (i<=tam) && (0<j) && (j<=tam) )

aux=lc[i-1];

//efetua a troca

lc[i-1]=lc[j-1]; //embora para usuario a matriz vai de 1 ate l*c

lc[j-1]=aux;

//para mim vai de o ate l*c-1

return true; //sucesso

else

{ return false; }

//falhou

public boolean atribuiindlin(int i,int v)

//atribui v ao indice i

//retorna true se conseguiu, false nao conseguiu

if ( (0<i) && (i<=tam) )

lc[i-1]=v;

//efetua a atribuicao

return true;

else

{ return false; } //falhou

public int retornaindlin(int indlin)

//retorna conteudo do indice i

//retorna -1 se nao conseguiu

int result;

if ( (0<indlin) && (indlin<=tam) )

{ result=lc[indlin-1]; }

else

{ result=-1; }

return result;

public int getl()

//retorna numero de linhas

return linhas;

public int getc()

//retorna numero de colunas

return colunas;

public int gett()

//retorna tamanho

return tam;

//Classe principal, Arquivo Principal.java

class Principal {

public static void main(String args[]) {

Matriz2DInt teste;

teste=new Matriz2DInt(5,10); //5 linhas 10 colunas

for(int i=1;i<teste.gett();i++) {teste.atribuiindlin(i,0); }

System.out.println("linear(5,5)="+ teste.linear(5,5) );

System.out.println("Atribuindo 2 a posicao (5,5)");

teste.atribuiindlin(teste.linear(5,5),2);

System.out.println("Atribuindo 4 a posicao (4,2)");

teste.atribuiindlin(teste.linear(4,2),4);

System.out.println("Trocando estas posicoes");

teste.trocaindlin(teste.linear(5,5),teste.linear(4,2));

System.out.println("Conteudo da posicao (5,5):"+teste.retornaindlin(teste.linear(5,5)));

linear(5,5)=45 Atribuindo 2 a posicao (5,5) Atribuindo 4 a posicao (4,2) Trocando estas posicoes Conteudo da posicao (5,5):4

Matrizes definidas na linguagem:

As matrizes definidas pela linguagem seguem uma sintaxe de

declarao e uso semelhante a sintaxe de vetores:

int custos[][]=new int [20,30]; qual e coluna

//vinte por trinta, nao importa qual e linha

custos[0][0]=145;

int a=custos[0][0];

Curiosidade:

Houve um caso de vrus na internet que se baseava no acesso a ndices fora de um vetor para gravar por cima de instrues do sistema operacional o cdigo que garantisse a sua multiplicao. No por acaso, Java, impede o acesso a posies fora do vetor.

Dica de programao:

Saiba que uma prtica bastante til na fase de testes de um programa introduzir mensagens informativas em pontos convenientes. Quando trabalhando com objetos tal prtica pode ser usada de vrios modos, por exemplo pode-se inserir uma mensagem no construtor de uma classe para verificar quando os objetos so criados e se so criados corretamente.

Informaes tcnicas:

Usaremos no segundo volume deste tutorial, uma matriz idntica a esta, s que ao envs de ser uma matriz de inteiros ser uma matriz de imagens. Se estivssemos em C++ teramos recursos para parametrizar (templates) o tipo desta matriz de modo que ela no necessitasse ser recompilada. Na ausncia de tal parametrizao o que fizemos foi substituir no cdigo fonte int por java.awt.image e recompilar.

Exerccios:

1-

1-

Melhore a classe matriz para aceitar nas suas funes argumentos do tipo (linha,coluna) e no s ndices lineares.

2-

Note que no foram impostas restries para ndices invlidos da matriz de modo que nosso componente de software falha se no usado corretamente. Adote uma estratgia de deteco de ndices invlidos e use-a de modo a evitar o travamento do programa. Veremos como fazer esta checagem de ndices de forma segura e uniforme em "4.3 Exception handling".

3-

Implemente um mtodo chamado ordena para o tipo abstrato de dados matriz definido acima. Use qualquer algoritmo de ordenao para deixar a matriz ordenada como um vetor quebrado em vrias linhas. De que forma a facilidade que a interface oferece de enxergar a matriz como um vetor facilita este processo?

Ser que este mtodo ordena realmente imprescindvel para esta classe? Os mtodos criados at o momento j no formam um modelo computacional suficiente para que o cliente desta classe possa definir em seu cdigo os mtodos de ordenao de matrizes que desejar? A dvida sobre a necessidade ou no de um mtodo em uma classe bastante frequente.

Guardadas as devidas propores, programao orientada a objetos como brincar com blocos de encaixar, ou legos. Existem blocos que no se encaixam, existem blocos que podem ser construdos atravs de outros menores, mas que ainda sim existem

porque so bastante usados, e a tarefa de compo-los a partir de outros blocos torna-se inconveniente. Existem blocos sem os quais no se pode construir praticamente nada.

4-

Crie um mtodo de nome preenche, que inicializa todas as posies da matriz com o valor de um de seus argumentos. Este mtodo pode ser composto pelos mtodos j implementados?

*5-

Defina um programa chamado grandes que implementa o tipo abstrato de dados nmeros grandes e inteiros, este tipo deve usar um vetor do tipo numrico que voc achar conveniente para representar os algarismos. Talvez estudar circuitos lgicos (somadores, multiplicadores) o ajude a implementar as quatro operaes matemticas bsicas para estes tipo em termos de "look ahead carrier" e outras tcnicas de performance de implementao de operaes. Se sua preocupao com eficincia e espao, voc pode usar cada posio do vetor para representar mais de um dgito, mas haver muito trabalho em termos de tratar overflow e underflows.

6-

Note que na alocao da matriz:

public Matriz2DInt(int l,int c)

, no checado se os valores passados so maiores faa este teste.

que 0,

Quando explicarmos "exception handling" voc ter mtodos melhores de lidar com esses "erros".

PRXIMO MDULO DO TUTORIAL: HERANA