Tutorial de Java

TUTORIAL:

"A LINGUAGEM DE PROGRAMA��O JAVA"

ORIENTA��O A OBJETOS

Instituto de Computa��o

Agosto, 96

Para obter a �ltima vers�o deste texto consulte http://www.dcc.unicamp.br/~aacesta ou http://www.dcc.unicamp.br

Pref�cio:

Este texto faz parte de um estudo comparativo de linguagens de programa��o orientadas a objetos. O conte�do deste estudo tamb�m est� dispon�vel na "World Wide Web", �rea mult�midia da internet, sob o endere�o http://www.dcc.unicamp.br/~aacesta . Neste endere�o, voc� pode complementar seu aprendizado, rodando exerc�cios iterativos, acessando "links" para outros hipertextos sobre linguagens de programa��o, vendo exemplos de programas e interagindo com aplica��es para a internet.

A diferen�a entre este estudo e outros textos que voc� possa encontrar sobre o mesmo assunto � o car�ter pr�tico. Exemplos completos, dicas de programa��o, explica��es sobre detalhes normalmente ignorados em livros, tornar�o seu aprendizado mais f�cil, principalmente na segunda parte onde tratamos da constru��o de aplica��es para a internet. No inicio, os exemplos podem ser considerados f�ceis, mas eles v�o se complicando cada vez mais de modo que � importante que o leitor acompanhe o texto fazendo os exerc�cios. Forneceremos uma s�rie de id�ias de programas simples para que voc� possa testar seu conhecimento. Estes programas simples podem ser melhorados atrav�s do uso de interfaces gr�ficas, assunto que n�o � coberto neste tutorial.

QUEM DEVERIA LER ESTE TUTORIAL

Qualquer leitor que tenha experi�ncia com pelo menos uma linguagem de programa��o.

DIAGRAMA��O DESTE TEXTO

Apesar de Java ser uma linguagem que serve para v�rios prop�sitos, o seu sucesso atual (�poca do seu lan�amento) se deve a possibilidade de elabora��o de aplica��es para a internet. Dada a import�ncia deste aspecto da linguagem, este texto est� organizado de maneira semelhante as p�ginas encontradas na WWW, frequentemente voc� encontrar� diagramas como o seguinte:

TUTORIAL

http://www.dcc.unicamp.br/~aacesta

"Estudo comparativo de linguagens de programa��o orientadas a objetos". Nesta p�gina voc� encontrar� tutoriais sobre diversas linguagens orientadas a objetos, dentre elas: C++, Modula-3, Java. Quanto a Java, voc� ter� a oportunidade de ver c�digo de programas e test�-los, al�m de poder adquirir a vers�o mais nova deste texto.Encontrar� tamb�m links para sites sobre orienta��o a objetos.

Este diagrama representa um hipertexto que pode ser acessado de modo a complementar seu estudo. A parte escrita em letra maior � o endere�o, o texto em it�lico faz um resumo do conte�do desta p�gina. Usando estes "links" ou diagramas voc� encontrar� uma maneira ordenada de aprender sem se perder no mar de informa��es da internet.

URL: "Uniform Resource Locator", � o endere�o 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 defini��o.

� importante lembrar que os hipertextos citados neste tutorial, n�o s�o de nossa responsabilidade. Como eles est�o sujeitos a mudan�as, contamos com a sua ajuda para efetuarmos atualiza��es, conte voc� tamb�m com a nossa ajuda na internet.

Os programas exemplo deste texto s�o apresentados em caixas retangulares, e todo c�digo � escrito em fonte diferente da usada neste texto comum. O trechos de c�digo que aparecem desmembrados de seus arquivos, tem fundo cinza claro.

Todos os arquivos presentes dentro dos ret�ngulos, s�o arquivos "text-only", qualquer formata��o (negrito) tem apenas fun��o did�tica.

Os resultados dos programas s�o indicados pelo diagrama ao lado:

DIVIS�O DO TUTORIAL

Este tutorial cont�m uma sequ�ncia de t�picos que permite apresentar a linguagem sob a �tica da teoria de orienta��o a objetos. A apresenta��o do modelo de objetos da linguagem e conceitos relacionados tais como polimorfismo, tratamento de exce��es est� em primeiro plano. Ao longo dessa apresenta��o, em segundo plano, voc� aprender� os aspectos b�sicos da linguagem tais como "loops", desvios condicionais, etc.

Estes t�picos s�o frequentemente retomados, cada vez de maneira mais aprofundada. Quando terminamos o assunto m�todos, voc� j� est� pronto para saber o que s�o contrutores, e � exatamente isto que ensinamos. Por�m o assunto contrutores n�o � esgotado, voc� ainda vai aprender a usar construtores em conjunto com agrega��o e depois em conjunto com heran�a.

A maioria dos leitores fica ansiosa para aprender como criar aplica��es para a internet, mas depois de satisfeita esta ansiedade voltam para o ponto onde aprendem como programar na linguagem e n�o apenas experimentar com a cria��o de bot�es, caixas de di�logo, imagens, etc. Se esse � o seu caso, � recomend�vel um "tour" pela WWW antes de come�ar a programar, um bom "site" para come�ar a pesquisar com um "browser" compat�vel com Java (Netscape Navigator 2.0( ou superior) � :

APPLETS

http://www.Javasoft.com/applets

"Links" para v�rios applets, divididos por categorias: games, sound, busines, animation... Divirta-se...

APPLETS: S�o pequenos programas escritos em Java que podem ser embebidos em documentos hipetextos. S�o exemplos de applets: anima��es, imagens, bot�es, etc. Applets podem suportar efeitos de multimidia como sons, itera��es com o usu�rio (mouse, teclado), imagens, anima��es, gr�ficos, etc.

Ao longo do texto,voc� perceber� que Java � excelente para desenvolver aplica��es comerciais e para ser usada em universidades. Java pode ser vista como uma fus�o de v�rias t�cnologias que v�m sendo desenvolvidas na �rea de computa��o, de modo que estudantes dessa linguagem tem a oportunidade de tomar contato com v�rios t�picos recentes: programa��o concorrente, sitemas distribu�dos, orienta��o a objetos, protocolos da internet, e uma s�rie de outros assuntos f�ceis de praticar nessa linguagem.

� claro que os resultados depender�o de seu esfor�o, portanto depois de ler esta introdu��o, descanse um pouco, tome um cafezinho1. Pois durante o restante do texto esperaremos que voc� se envolva com a linguagem, reuse programas encontrados na W.W.W, se comunique com colegas programadores, participe de listas de discuss�es, newsgroups (comp.lang.Java & alt.www.hotJava), e o mais importante: PROGRAME, PROGRAME, RE-PROGRAME! ADQUIRINDO O SOFTWARE NECESS�RIO, PLATAFORMAS SUPORTADAS

Um ambiente de programa��o Java � normalmente composto de um kit de desenvolvimento de aplica��es Java e um "browser compat�vel com esta linguagem (recomend�vel). Se voc� n�o tem acesso a esse ambiente de programa��o, tente estes endere�os:

"DOWNLOAD"

JAVA

http://Java.sun.com

Raiz do hipertexto montado pelos criadores da linguagem. Sob este endere�o voc� pode obter o compilador e outras ferramentas de desenvolvimento de aplica��es Java para a sua plataforma de programa��o. Fique atento! Outros desenvolvedores est�o criando ambientes de programa��o Java.

"DOWNLOAD"

"BROWSERS"

http://www.netscape.com

Raiz do hipertexto montado pelos criadores do Netscape Navigator(. Sob este endere�o voc� pode obter o browser "Java compatible" da "Netscape Comunications INC'.. Outros desenvolvedores est�o lan�ando "browsers" compat�veis com Java.

"DOWNLOAD"

"BROWSERS"

http://www.microsoft.com

A microsoft( licenciou a tecnologia Java e a incorporou em seu novo browser: Internet Explorer vers�o 3.0 ou superior.

BROWSERS: S�o uma categoria de programas que permitem voc� visualizar um documento criado em um certo padr�o, no caso html (hipertext markup language). Atualmente os browsers tem se tornado complexos devido a quantidade de padr�es existentes (ex. imagens .gif .jpg, etc). A linguagem Java pode contribuir para minimizar esta complexidade.

CARACTER�STICAS DA LINGUAGEM

Parecida com C, C++:

Java tem a apar�ncia de C ou de C++, embora a filosofia da linguagem seja diferente. Por este motivo estaremos frequentemente fazendo compara��es 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 tamb�m possui caracter�sticas herdadas de muitas outras linguagens de programa��o: Objective-C, Smalltalk, Eiffel, Modula-3, etc. Muitas das caracter�sticas desta linguagem n�o s�o totalmente novas. Java � uma feliz uni�o de tecnologias testadas por v�rios centros de pesquisa e desenvolvimento de software.

Compilada:

Um programa em Java � compilado para o chamado "byte-code", que � pr�ximo as instru��es de m�quina, mas n�o de uma m�quina real. O "byte-code" � um c�digo de uma m�quina virtual idealizada pelos criadores da linguagem. Por isso Java pode ser mais r�pida do que se fosse simplesmente interpretada.

Port�vel:

Java foi criada para ser port�vel. O "byte-code" gerado pelo compilador para a sua aplica��o espec�fica pode ser transportado entre plataformas distintas que suportam Java (Solaris 2.3(, Windows-NT(, Windows-95(, Mac/Os etc) . N�o � necess�rio recompilar um programa para que ele rode numa m�quina e sistema diferente, ao contr�rio do que acontece por exemplo com programas escritos em C e outras linguagens.

Esta portabilidade � importante para a cria��o de aplica��es para a heterog�nea 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 pr�prio compilador Java � escrito em Java, de modo que ele � port�vel para qualquer sistema que possua o interpretador de "byte-codes". Um exemplo de programa escrito em Java � o browser hotjava.

Orientada a Objetos:

A portabilidade � uma das caracter�sticas que se inclui nos objetivos almejados por uma linguagem orientada a objetos.

Em Java ela foi obtida de maneira inovadora com rela��o ao grupo atual de linguagens orientadas a objetos.

Java suporta heran�a, mas n�o heran�a m�ltipla. A aus�ncia de heran�a m�ltipla pode ser compensada pelo uso de heran�a e interfaces, onde uma classe herda o comportamento de sua superclasse al�m de oferecer uma implementa��o para uma ou mais interfaces.

Java permite a cria��o de classes abstratas. Outra caracter�stica importante em linguagens orientadas a objetos � a seguran�a. Dada a sua import�ncia o t�pico foi escrito a parte.

Segura:

A presen�a de coleta autom�tica de lixo, evita erros comuns que os programadores cometem quando s�o obrigados a gerenciar diretamente a mem�ria (C , C++, Pascal ). A elimina��o do uso de ponteiros, em favor do uso de vetores, objetos e outras estruturas substitutivas traz benef�cios em termos de seguran�a. O programador � proibido de obter acesso a mem�ria que n�o pertence ao seu programa, al�m de n�o ter chances de cometer erros comuns tais como "reference aliasing" e uso indevido de aritm�tica de ponteiros. Estas medidas s�o particularmente �teis quando pensarmos em aplica��es comerciais desenvolvidas para a internet.

Ser "strongly typed" tamb�m � uma vantagem em termos de seguran�a, que est� aliada a elimina��o de convers�es impl�citas de tipos de C++.

A presen�a de mecanismos de tratamento de exce��es torna as aplica��es mais robustas, n�o permitindo que elas abortem, mesmo quando rodando sob condi��es anormais. O tratamento de exce��es ser� �til na segunda parte para modelar situa��es tais como falhas de transmiss�o e formatos incompat�veis de arquivos.

Suporta concorr�ncia: A linguagem permite a cria��o de maneira f�cil, de v�rios "threads" de execu��o. Este t�pico ser� �til quando voc� estudar anima��es, e � particularmente poderoso nos ambientes em que aplica��es Java s�o 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 espa�o, pouca mem�ria. Java � muito mais eficiente que grande parte das linguagens de "scripting" existentes, embora seja cerca de 20 vezes mais lenta que C, o que n�o � um marco definitivo. Com a evolu��o da linguagem, ser�o criados geradores de "byte-codes" cada vez mais otimizados que trar�o as marcas de performance da linguagem mais pr�ximas das de C++ e C. Al�m disso um dia Java permitir� a possibilidade de gerar c�digo execut�vel de uma particular arquitetura "on the fly", tudo a partir do "byte-code". Suporte para programa��o de sistemas distribu�dos:

Java fornece facilidades para programa��o com sockets, remote method call, tcp-ip, etc. Estes t�picos n�o ser�o abordados neste texto.

PROGRAMA��O 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 programa��o, mesmo antes de iniciar a leitura deste tutorial:

"DOWNLOAD"

"BROWSERS"

http://www.dcc.unicamp.br/~aacesta/java/group.html (Clique em brewing Java tutorial)

"Brewing Java: A Tutorial", Um tutorial de Java que segue o estilo do livro inicial sobre "C", escrito por Kernighan & Ritchie [2], � a refer�ncia b�sica para este texto. Cobre principalmente sintaxe de loops e outros assuntos f�ceis n�o abordados aqui.

Iniciaremos com um pouquinho de teoria sobre orienta��o a objetos. Se voc� quiser algum hipertexto para aprofundamento ou para ler em paralelo com esta introdu��o sobre classes e objetos e use:

"TUTORIAIS"

http://www.dcc.unicamp.br/~aacesta/java/group.html

"Esta � a homepage do 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 usu�rio que cont�m o molde, a especifica��o para os objetos, algo mais ou menos como o tipo inteiro cont�m o molde para as vari�veis declaradas como inteiros. A classe envolve, associa, fun��es e dados, controlando o acesso a estes, defin�-la implica em especificar os seus atributos (dados) e seus m�todos (fun��es).

Um programa que utiliza uma interface controladora de um motor el�trico provavelmente definiria a classe motor. Os atributos desta classe seriam: temperatura, velocidade, tens�o aplicada. Estes provavelmente seriam representados na classe por tipos como int ou float. Os m�todos desta classe seriam fun��es para alterar a velocidade, ler a temperatura, etc. Um programa editor de textos definiria a classe par�grafo que teria como um de seus atributos uma String ou um vetor de Strings, e como m�todos, fun��es que operam sobre estas strings. Quando um novo par�grafo � digitado no texto, o editor cria a partir da classe Par�grafo um objeto contendo as informa��es particulares do novo texto. Isto se chama instancia��o ou cria��o do objeto.

1.1. ESPECIFICANDO UMA CLASSE

Suponha um programa que controla um motor el�trico atrav�s de uma sa�da serial. A velocidade do motor � proporcional a tens�o aplicada e esta proporcional aos bits que v�o para sa�da serial e passam por um conversor digital anal�gico. Vamos abstrair todos estes detalhes por enquanto e modelar somente a interface do motor como uma classe, a pergunta � que m�todos e que atributos deve ter nossa classe, que argumentos e valores de retorno devem ter os m�todos?

Representa��o 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 necess�rio n�o possa ser fornecido pelo tipo , usaremos ent�o o tipo long, isto depende do conversor digital anal�gico utilizado.

Representa��o da sa�da serial:

O motor precisa conhecer a sua sa�da serial, a sua liga��o com o "motor do mundo real". Suponha uma representa��o em hexadecimal do atributo endere�o de porta serial, um poss�vel nome para o atributo: enderecomotor. N�o se preocupe em saber como usar a representa��o hexadecimal.

Altera��o do valor da velocidade:

Internamente o usu�rio da classe motor pode desejar alterar a velocidade, cria-se ent�o o m�todo: public void altera_velocidade(int novav);. O c�digo anterior corresponde ao cabe�alho do m�todo ele � definido junto com a classe motor, associado a ela. O valor de retorno da fun��o que "implementa" o m�todo � void, poderia ser criado um valor de retorno (boolean) que indicasse se o valor de velocidade era permitido e foi alterado ou n�o era permitido e portanto n�o foi alterado.

O ato de invocar um m�todo tamb�m � chamado de passar uma mensagem para o objeto que est� executando este m�todo.

N�o faz sentido usar, chamar, este m�todo separado de uma vari�vel do tipo motor, mas ent�o porque na lista de argumentos da fun��o n�o se encontra um motor? Este pensamento reflete a maneira de associar dados e c�digo (fun��es) das linguagens procedurais. Em linguagens orientadas a objetos o c�digo e os dados s�o ligados de forma diferente, a pr�pria declara��o de um tipo definido pelo usu�rio j� engloba as declara��es das fun��es inerentes a este tipo, isto ser� explicado em 1.2. O objeto ao qual � aplicado o m�todo � passado de outra forma.

Note que n�o fornecemos o c�digo do m�todo, isto n�o � importante, por hora a preocupa��o � com a interface definida pela classe: seus cabe�alhos de m�todos e atributos. Apenas pense que sua interface deve ser flex�vel de modo a n�o apresentar entraves para a cria��o do c�digo que seria feita numa outra etapa. Nesta etapa ter�amos que imaginar que o valor num�rico da velocidade deve ir para o conversor onde ir� se transformar numa diferen�a de potencial a ser aplicada nos terminais do motor, etc.

1.2. OBJETOS EM JAVA

Objetos s�o inst�ncias de uma classe. Quando um objeto � criado ele precisa ser inicializado, ou seja para uma �nica classe de nome EstudanteDeGraduacao podemos ter v�rios objetos durante a execu��o de um programa. Estudante de gradua��o Andre; Identifica��o 940718; Curso Computacao | Estudante de gradua��o Luiza , Identifica��o 893249, Curso Medicina... A classe representa somente o molde para a cria��o dos objetos, estes sim cont�m informa��o, veja t�pico classes e objetos.

O atributo Identifica��o tem valor 940718 para a inst�ncia (objeto) Andr� da classe Estudantes de Gradua��o.

INSTANCIAS: Um objeto existente durante um momento da execu��o de um programa � uma instancia de uma classe.

Objetos podem conter objetos, ou seja os atributos de um objeto podem ser objetos, da mesma classe ou n�o. Objetos podem ser passados pela rede, armazenados em meio f�sico. Objetos possuem um estado e um comportamento. M�todos podem receber objetos como argumentos, podem declarar objetos como vari�veis locais, podem chamar outros m�todos.

Voc� pode chamar um m�todo (mandar uma mensagem) para objetos em outras m�quinas atrav�s de sua rede.

Um objeto pode ser visto como um RECORD, s� que com uma tabela de fun��es que podem ser chamadas para ele.

Na verdade esta defini��o n�o � muito te�rica, mas � um bom come�o para os programadores que est�o acostumados com linguagens procedurais. Na verdade podemos fazer com objetos muito mais do que fazemos com records e procedimentos em Pascal.

Em Java, ao contr�rio de C++ e Modula-3, n�o existem fun��es desvinculadas de classes, fun��es isoladas. Isto implica que todo trecho de c�digo que for escrito deve pertencer a uma classe, mais precisamente deve ser um m�todo desta. O programa mais simples em Java deve conter pelo menos uma classe e um m�todo de in�cio 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, fun��es isoladas e vari�veis de procedimentos, tamb�m se pode fazer com classes e m�todos. C++ tinha que permitir a cria��o de fun��es isoladas para manter a compatibilidade com "C", mas Java n�o. Quando neste texto usarmos o termo fun��o no lugar de m�todos estaremos mais interessados em enfatizar a parte de implementa��o em detrimento da interface, voc� pensar que em Java toda fun��o implementa um m�todo de uma classe.

O leitor n�o acostumado com o paradigma de orienta��o a objetos, pode achar estranhas as afirma��es acima, e a pergunta mais comum neste momento �: "Mas ent�o como voc� sabe aonde vai come�ar 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.

2-Crie o arquivo ao lado em um diret�rio qualquer ("folder" para usu�rios mac) e salve com o nome: HelloInternet.Java

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

4-Seu diret�rio deve ter recebido um novo arquivo ap�s essa compila��o: HelloInternet.class

5-Chame o interpretador Java para este arquivo (omita a extens�o .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 n�o prosseguir enquanto n�o compil�-lo. Se voc� for como eu, e principalmente se tiver digitado tudo ao env�s de usar "copy and paste", � bem prov�vel que ele n�o compile, se isto ocorrer, leia atentamente o programa. Voc� n�o esqueceu o ponto e v�rgula? E as chaves? Hellointernet come�a com letra mai�scula, e isso faz diferen�a2, voc� foi coerente com a conven��o adotada de letras mai�sculas e min�sculas para seus identificadores?

Voc� estava no mesmo diret�rio de HelloInternet.java quando chamou o compilador? E quando chamou o interpretador? Tamb�m?

Se ainda n�o der certo, n�o se desespere, leia as explica��es passo a passo do programa e depois recorra a um usu�rio mais experiente. Normalmente a Java � muito f�cil de se programar, e voc� precisar� de pouca ajuda, o seu interesse o far� cada vez mais familiar com esta linguagem.

Explica��o passo a passo do programa exemplo:

//Comentario de uma linha

Coment�rios em Java seguem a mesma sintaxe de C++, "//" inicia uma linha de coment�rio, todo o restante da linha � ignorado. Existe tamb�m um outro tipo de coment�rio formado por /* Insira aqui o texto a ser ignorado */ , este tipo de coment�rio pode ser intercalado em uma linha de c�digo. Coment�rios s�o tratados como espa�os em branco.

public class HelloInternet {

class � a palavra reservada que marca o inicio da declara��o de uma classe. Public � um especificador, por enquanto guarde public class como o in�cio da declara��o de uma classe. Toda classes ser�o declaradas assim at� o t�pico ENCAPSULAMENTO DE ATRIBUTOS E M�TODOS COM PACKAGESENCAPSULAMENTO DE CLASSES COM PACKAGES.

HelloInternet

� o nome dado a esta classe. O "abre chaves" marca o in�cio das declara��es da classe que s�o os atributos e m�todos. Esta classe s� possui uma declara��o, a do m�todo main, note que um m�todo, ao contr�rio de C++, s� pode ser declarado {internamente} a classe a qual pertence, evitando as confus�es sobre "escopo". Desta forma, todo peda�o de c�digo em Java deve pertencer ao abre chaves, fecha chaves da defini��o de uma classe.

public static void main (String args[]) {

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

}

public

� um qualificador do m�todo que indica que este � acess�vel externamente a esta classe (para outras classes que eventualmente seriam criadas), n�o se preocupe com ele agora, apenas declare todos os m�todos como public. Voltaremos a este assunto em 1.5. ENCAPSULANDO M�TODOS E ATRIBUTOS

static

� um outro qualificador ou "specifier", que indica que o m�todo deve ser compartilhado por todos os objetos que s�o criados a partir desta classe. Os m�todos static podem ser invocados, mesmo quando n�o foi criado nenhum objeto para a classe, para tal deve-se seguir a sintaxe: .(argumentos);. Retornaremos a esta explica��o mais tarde, por hora voc� precisa saber que particularmente o m�todo main precisa ter essa qualifica��o 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 orienta��o a objetos, pense que se o m�todo main tivesse que ser chamado para um objeto (o que n�o � o caso) este objeto teria que ter sido criado em algum outro lugar ent�o este lugar seria o in�cio do programa e main3 deixaria de ter esta finalidade.

A linguagem de programa��o Eiffel adota uma t�cnica diferente para resolver este problema: todo programa come�a com a cria��o de um objeto (e n�o mais a chamada autom�tica de main), este objeto � chamado ROOT, ele pode conter atributos que s�o inicializados e um m�todo de inicializa��o, construtor do objeto, que � o in�cio do c�digo do programa.

void

Semelhante ao void C++ ou C, � o valor de retorno da fun��o, quando a fun��o n�o retorna nenhum valor ela retorna void, uma esp�cie de valor vazio que tem que ser especificado.

main

Este � um nome particular de m�todo que indica para o compilador o in�cio do programa, � dentro deste m�todo e atrav�s das itera��es entre os atributos, vari�veis e argumentos vis�veis nele que o programa se desenvolve.

(String args[])

� o argumento de main e por consequ�ncia do programa todo, ele � um vetor de Strings que � formado quando s�o passados ou n�o argumentos atrav�s da invoca��o do nome do programa na linha de comando do sistema operacional,

exemplo:

Java HelloInternet argumentotexto1 argumentotexto2

No nosso caso, ignoramos a poss�vel passagem de argumentos via linha de comando, retornaremos a este assunto em 1.3.

{ ...

}

"Abre chaves" e "fecha chaves". Para quem n�o 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 c�digo. Os programadores Pascal notar�o que vari�veis locais dos m�todos podem ser declaradas em qualquer local entre as chaves. Mas por motivos de clareza do c�digo declararemos todas no in�cio do abre chaves.

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

Chamada do m�todo 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 n�o avan�a linha. Por hora voc� pode guardar esta linha de c�digo como o comando para imprimir mensagens na tela, onde o argumento que vem entre aspas � a String a ser impressa. O ; "ponto e v�rgula" separa opera��es.

}

Finalmente o fecha chaves termina com a declara��o da classe HelloInternet.

Conclus�o:

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 ser�o aprofundados e s�o citados aqui apenas por curiosidade, � normal que voc� n�o tenha entendido tudo. De agora em diante n�o explicaremos mais como compilar os programas.

1.2.2. ATRIBUTOS

No programa anterior, n�o observamos a cria��o de nenhum objeto, apenas a declara��o da classe HelloInternet que continha o m�todo main. O nosso programa funcionou, porque o m�todo main n�o precisa de um objeto espec�fico para ser invocado.

Este exemplo declara uma classe (Circulo) e em seguida cria um objeto deste tipo em main e altera o conte�do desta vari�vel. Uma classe � parecida com um record de Pascal, a nossa representa um c�rculo com os atributos raio e x , y, que s�o coordenadas cartesianas. Note que este objeto n�o possui m�todos ainda.

A classe c�rculo � especificada em um arquivo separado do arquivo da classe que cont�m o m�todo main (in�cio do programa), um arquivo neste texto � representado pelo ret�ngulo envolvendo um trecho de c�digo, at� o t�pico ENCAPSULAMENTO DE CLASSES COM PACKAGES cada classe ser� especificada em um arquivo.

� importante entender este exemplo, quando voc� estudar interfaces gr�ficas, poder� usar a classe c�rculo pr�-definida na linguagem para desenhar c�rculos que se movem na tela. Embora n�o tenhamos explicado com detalhes os tipos b�sicos da linguagem, usaremos neste exemplo o tipo float (real), e nas explica��es o tipo String e o tipo int (inteiro). No final deste t�pico forneceremos uma explica��o detalhada sobre tipos.

//Classe circulo, arquivo Circulo.Java

public class Circulo {

//so atributos entre as chaves

public float raio; //atributo raio do circulo

public float x;

//posicoes em coordenadas 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 matem�ticos n�o gostam de C, C++, Java e Basic:

A declara��o umcirc.x=umcirc.x+17 presente em nosso programa deixa os matem�ticos doidos pois de voc� subtrair umcirc.x de cada um dos lados da "igualdade" a express�o se torna 0=17. Ocorre que = n�o � o operador de teste de igualdade e sim de atribui��o, ele tem a mesma fun��o do := de Pascal a qual os matem�ticos 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, est�o em arquivos separados. A sequ�ncia de altera��es em seu diret�rio ou folder �:

Inicio:

Ap�s Javac AsDuasJuntas.Java:

O compilador deve ser chamado para ambos arquivos. Ou voc� pode usar os chamados "wildcards"4 javac *.java.

Sem Includes:

Se voc� j� programa em alguma outra linguagem provavelmente deve estar com a seguinte d�vida: "Voc�s usaram o nome da classe Circulo na classe Principal, ambas est�o em arquivos separados, como o compilador sabe em que diret�rio est� a classe Circulo? N�o � preciso fazer uma esp�cie de include para poder usar a classe Circulo em outro arquivo?" A resposta � n�o. O compilador sabe achar se ela estiver sob o diret�rio de seu programa. Se voc� tiver que deixar esta classe em outro diret�rio ent�o ela deve fazer parte de um package e voc� ter� que importar explicitamente este package, veremos como faz�-lo mais tarde.

Classe Circulo e declara��o de atributos:

O primeiro arquivo deste exemplo cont�m o c�digo da classe Circulo, esta classe cont�m tr�s atributos . A declara��o de atributos segue sintaxe semelhante a de C++ (haver�o acr�scimos a esta sintaxe):

EspecificadorModoAcesso NomeTipo NomeAtributo;

public float raio;

public float x;

public float y;

Todos os atributos pertencentes a classe s�o do tipo float (Ponto flutuante 32-bit IEEE754, veja tabela de tipos b�sicos).

Est�o especificados como public o que significa que podem ser modificados a partir de uma classe que usa um objeto

Circulo seja como vari�vel de m�todo ou como atributo (este tipo de modifica��o ser� exemplificado na classe Principal).

Existem outros especificadores que abordaremos mais adiante, por hora todos os m�todos e atributos que criarmos dever�o ser public. Vale lembrar que na declara��o de vari�veis simples em m�todos, n�o faz sentido usar o

EspecificadorModoAcesso. Esta classe Circulo n�o possui m�todos.

Como exemplo de declara��o de vari�veis simples tome a declara��o de uma vari�vel Circulo no m�todo main. Seguida de sua aloca��o: umcirc=new Circulo(); //alocacao dessa variavel. Sem a aloca��o a vari�vel n�o pode ser usada. Note que os atributos s�o por default inicializados para zero.

Classe Principal declara��o e inicializa��o de atributos:

A classe Principal n�o possui atributos, porque nenhum objeto desta classe � criado, apenas seu m�todo main � chamado. O m�todo main declara uma refer�ncia para objeto da classe Circulo: Circulo umcirc;. Note que diferentemente de C++ n�o s�o necess�rios "includes" ou "header files" para poder declarar essa vari�vel de um "tipo" definido pelo usu�rio e existente em outro arquivo.

Antes da refer�ncia ao objeto ser usada, este precisa ser alocado na mem�ria o que � feito atrav�s de umcirc=new Circulo();. Se voc� tivesse declarado um objeto da classe String, j� definida na linguagem, e depois fizesse sua aloca��o, o c�digo seria semelhante ao seguinte:

String umastring;

umastring=new String("Valor inicial");

A diferen�a com a aloca��o do objeto Circulo � que entre os par�nteses incluem um argumento "Valor inicial", isto ocorre porque a linguagem permite que voc� aproveite a aloca��o 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 mem�ria alocada por new, s�o alterados de outra forma.

Coleta autom�tica de lixo:

A desaloca��o do objeto � feita pela linguagem, ("automatic garbage collection"), voc� n�o precisa se preocupar com ela. Ap�s o fecha chaves de main, a mem�ria do objeto umcirc j� pode ser liberada, o que normalmente n�o ocorre de imediato, pois o ambiente da linguagem executa um "tread" em baixa prioridade que libera de tempos em tempos os espa�os inutilizados de mem�ria, tirando proveito por exemplo de eventuais pausas de itera��o do usu�rio com o programa. Por executar em um "tread" entenda paralelamente ou quase paralelamente, voltaremos a este t�pico mais adiante. Acesso aos atributos e m�todos e altera��es dos atributos:

O acesso aos atributos da vari�vel (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 n�o faz sentido no programa, precisa-se especificar de que objeto se deseja alterar ou obter o raio.

A sintaxe de chamadas de m�todos � semelhante a sintaxe descrita acima, s� que ao env�s de nome do atributo temos o nome do m�todo seguido dos par�nteses que podem conter zero ou mais argumentos. Volte ao primeiro programa (HelloInternet) e verifique a declara��o do m�todo main, onde chamamos o m�todo println() para o objeto System.out . Imprimindo vari�veis 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 vari�vel do tipo String, no entanto o c�digo acima mistura nos argumentos desse m�todo os seguintes elementos: Strings: "(", operadores : +, e vari�veis float: umcirc.y. Fica muito f�cil de voc� entender porque isto funciona se pensar que + � tamb�m operador de concatena��o de Strings e que os argumentos int ou float e de outros tipos b�sicos desse m�todo s�o convertidos para Strings.

Importante aos que n�o programam em C ou C++, os operadores = e ==:

Em Java, C, e C++ o operador = (igual) tem a fun��o de atribui��o e o operador == (igual igual) tem a fun��o de compara��o entre valores, retornando o valor booleano verdadeiro se estes valores forem id�nticos. Alguns podem n�o achar esta escolha de operadores sensata, principalmente os matem�ticos, mas com um pouco de uso da linguagem ela se tornar� autom�tica.

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

Em C, C++ e tamb�m 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 atribui��es em cadeia permitem escrever c�digo mais compacto, elas fazem sentido porque atribui��es 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 n�o h� nada a esquerda desta atribui��o. 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++) n�o 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 n�o em Java) a==a tem valor 1 com o significado dado pelo programador de true ou verdadeiro, mas a=1+0; tamb�m tem como resultado o valor 1, mas agora com o significado inteiro, num�rico. O compilador n�o sabe distinguir entre os significados num�rico e booleano.

Essa ambiguidade faz com que programadores (C ou C++) n�o acostumados com esta conven��o de operadores = e ==, incorram no erro de escrever j=1 quando na verdade queriam dizer j==1, mas para o compilador ambas as express�es 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 n�o tem nenhuma rela��o com o tipo int e qualquer outros tipos.

TIPOS B�SICOS E CONSTANTES OU VALORES LITERAIS (para nossa sorte os tipos b�sicos s�o os mesmos para qualquer ambiente de programa��o Java, porque a linguagem � port�vel):

char

Caractere UNICODE 16-bit

O tipo char (caractere UNICODE) � representado com 16-bits sem sinal, o que permite endere�ar de 0 a 65535. O objetivo desta op��o � permitir internacionaliza��o da linguagem, bem como a padroniza��o. Constantes do tipo caractere aparecem entre ap�strofes: 'a', '1', '$'.

Tabela de caracteres especiais: (ao contr�rio de C/C++, n�o existe um caractere especial para o som de beep ou bell )

Representa��o visual:

Fun��o, significado:

\n

Pula linha, linefeed

\r

Retorno de carro

\b

Backspace

\t

Tabula��o

\f

Formfeed

\'

Ap�strofe

\"

Aspas

\\

Barra inversa

\u223d

Caractere unicode

\gfa

Octal

\fff

Hexadecimal

boolean

Valor true ou false, diferente representa��o de C++, sem convers�o em outros tipos.

O tipo boolean n�o tem rela��o nenhuma com outros tipos (coer��o). Eliminando problemas que surgiram por exemplo em C++ que usa inteiros para representar valores booleanos. Os poss�veis valores s�o true e false que s�o os resultado dos testes l�gicos .

boolean pertenceAoConjunto; //declara variavel

pertenceAoConjunto=true; //exemplo

byte

Inteiro 8-bit , complemento de 2, faixa:-128 at� 127

short

Inteiro 16-bit, complemento de 2, faixa:-32768 at� 32767

int

Inteiro 32-bit, complemento de 2, faixa:-2147483648 at� 2147483647

long

Inteiro 64-bit, compl. de 2, faixa:-9223372036854775808 at� 9223372036854775807

N�o 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 padr�o, se voc� quer atribuir esta constante a um long, fa�a o "type cast" explicitamente:

long a;

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

Ou ent�o use uma termina��o em L para indicar que o n�mero deve ser representado como long:

long a=299792458L; //ou L minusculo

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

exemplo: 0xBCD4

float

Ponto flutuante 32-bit IEEE754

double

Ponto flutuante 64-bit IEEE754

Um valor como 3.14159265 � considerado double como padr�o, se voc� quer atribuir esta constante a um float, fa�a o type cast explicitamente:

float a;

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

Ou ent�o usar uma termina��o em f para indicar que o n�mero 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 n�meros de tipo diferentes como double e int s�o usados em um calculo do lado direito de uma atribui��o, voc� n�o precisa fazer o type cast desses valores. O compilador promove o n�mero 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 vari�vel long por exemplo.

1.2.3. ATRIBUTOS E M�TODOS

Os m�todos determinam o comportamento dos objetos de um classe. Quando um m�todo � invocado, se diz que o objeto est� recebendo uma mensagem (para executar uma a��o). Programas complexos formam conjuntos de objetos que trocam mensagens entre si gerenciando inclusive os recursos do sistema.

O programa a seguir exemplifica chamadas de m�todos, para tal define um objeto que serve como contador, a implementa��o representa a contagem no atributo num que � um n�mero inteiro. Os m�todos s�o simples: incrementa adiciona um ao contador em qualquer estado e comeca inicializa a contagem em zero. Decrementa faz o oposto de incrementa.

//Classe Contador, arquivo Contador.Java

public class Contador {

public int num; //este � o atributo

//numero do contador

public void incrementa()

//incrementa contador

{

num=num+1; //acesso ao atributo

}

public void decrementa()

//decrementa contador

{

num=num-1;

}

public void comeca(int n)

//comeca a contar

{

num=n;

}

}

//Classe principal, Arquivo Princ.Java

public class Principal {

public static void main(String args[]) {

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

M�quinas de estados:

Olhando para o desenho contido no canto direito superior do arquivo da Classe contador, voc� consegue imaginar este

contador como uma m�quina de estado? O uso de objetos como m�quinas de estados � um dos conceitos que

exemplificaremos deste texto.

Sintaxe de declara��o de m�todos:

A sintaxe simplificada para a declara��o de m�todos de uma classe �:

especificadordeacesso tipoderetorno nomedometodo(lista_de_argumentos) { /*codigo */ }.

Uma diferen�a do uso de fun��es comuns em linguagens n�o orientadas a objetos e do uso de m�todos � que como o m�todo 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 m�todos em um programa j� se referem a um objeto espec�fico, embora os m�todos sejam definidos de uma forma geral e parametrizada para toda a classe. Volte agora ao m�todo main e verifique sua sintaxe.

this:

this � uma palavra chave usada num m�todo como refer�ncia para o objeto corrente, ela tem o significado de: "o objeto para o qual este trecho de c�digo est� sendo executado".

Suponha uma classe que possui a seguinte declara��o de atributo: public int qualquer; . Se quisermos em um m�todo desta classe alterar o atributo qualquer para o valor 3, basta escrever qualquer=3; , mas este c�digo escrito dentro de um m�todo da classe que declara qualquer, � totalmente equivalente a this.qualquer=3; , sendo o �ltimo uma op��o mais clara e capaz de eliminar ambiguidades entre os nomes dos atributos de uma classe e os nomes dos argumentos de um dos m�todos desta (quando estes nomes forem iguais). O uso de this tamb�m � v�lido fazer para chamadas de m�todos para o objeto corrente.

Sintaxe de chamada ou acesso a m�todos:

A sintaxe de chamada ou acesso � m�todos � semelhante a sintaxe de acesso aos atributos, com exce��o dos par�nteses que cont�m a lista de argumentos da fun��o que implementa o m�todo, mesmo que a lista seja vazia eles devem estar presentes: umcontador.incrementa();. Primeiro insere-se o nome do objeto e depois a chamada da fun��o, estes s�o separados por um ponto. Cuidado para n�o esquecer os par�nteses em programas futuros, este � um erro bastante comum.

Nova vers�o do programa Circulo:

Agora reapresentaremos o programa Circulo baseado no exemplo 1.2.2, por�m um pouco mais complicado:

M�todo move:

O m�todo move altera as coordenadas do objeto. O objeto tem suas coordenadas x e y somadas com os argumentos dessa fun��o. Note que este m�todo 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 abrevia��o para ac.x=ac.x+dx;.

M�todo mostra:

O m�todo mostra imprime na tela, de forma compacta, os atributos do objeto.

//Classe circulo

public class Circulo {

public float raio;

public float x;

//posicoes em coordenadas cartesianas

public float y;

public void move(float dx,float dy)

//move o circulo de lugar

{

this.x+=dx;

y+=dy;

}

public void mostra()

//imprime na tela estado do objeto

{

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

}

} //fim da declaracao da classe

//Classe principal, Arquivo Principal.Java

class Principal {

public static void main(String args[]) {

Circulo umcirc;

//declaracao de atributo circulo

umcirc=new Circulo();

umcirc.x=0;

umcirc.y=0;

umcirc.raio=12;

umcirc.mostra();

umcirc.move(10,10);

umcirc.mostra();

umcirc.x=100;

umcirc.mostra();

}

}

(0,0,12)

(10,10,12)

(100,10,12)

Como funcionam no compilador as chamadas de m�todos:

� poss�vel imaginar que as defini��es de m�todos ocupam um grande espa�o na representa��o interna dos objetos, mas lembre-se que elas s�o todas iguais para uma classe ent�o basta manter para cada classe uma tabela de m�todos que � consultada no momento da chamada . Os objetos s� precisam ter uma refer�ncia para esta tabela.

1.2.4. M�TODOS QUE RETORNAM VALORES.

At� agora s� hav�amos visto m�todos com valor de retorno igual a void. Um m�todo, assim como uma fun��o comum, pode retornar um �nico elemento de qualquer tipo, inclusive os definidos pelo usu�rio 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 m�todo , numa atribui��o 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 atrav�s de uma chamada ao m�todo estado(). Este exemplo � bastante simples e n�o tem a pretens�o de ser uma implementa��o 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;

public void atrave(String q)

//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 n�o o fosse n�o estaria na parte introdut�ria deste tutorial. Esta classe acaba tendo a funcionalidade de uma vari�vel 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.

1.2.5. COMPARA��O 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, al�m disso introduzimos um novo m�todo chamado inicializa e m�todos public float retorna_raio(void); e void altera_raio(float a). inicializa coloca o ponto nas coordenadas passadas como seus argumentos. A introdu��o deste m�todo prepara a explica��o sobre construtores dada no pr�ximo t�pico: 1.2.6. Para melhor entendimento leia os exemplos anteriores com a classe Circulo.

Java: Programa exemplo c�rculo, 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

{

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

}

}

Disposi��o dos m�todos e atributos na declara��o de uma classe:

Em uma declara��o de uma classe normalmente se coloca a declara��o de m�todos depois da declara��o dos atributos, por�m podemos fazer intercala��es ou adotar qualquer ordem que nos convenha.

Uma boa t�cnica de programa��o, que aconselhamos voc� adotar em seus programas � usar linhas de coment�rios para delimitar uma �rea do c�digo de suas classes que englobe tudo o que interessa a um usu�rio desta. Nestes programas exemplos praticamente tudo � de interesse de um usu�rio (cliente) de sua classe, mas nos exemplos mais avan�ados isto n�o ser� verdade.

Coment�rios:

Observe que o m�todo mostra chama o m�todo public float retorna_raio(void) que � da mesma classe. Fica claro da defini��o 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 m�todos tamb�m s�o permitidas, pois nesse caso esta chamada de m�todo poderia ser substitu�da pelo pr�prio atributo raio, o que seria mais eficiente.

Programa��o orientada a objetos e interfaces gr�ficas com o usu�rio:

Existem "libraries" de classes que permitem o programador C++ desenvolver aplica��es para ambientes como o Microsoft Windows(r) de uma maneira bastante abstrata, este � um exemplo claro de reuso de c�digo, afinal n�o � 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 gr�ficas com o usu�rio seja para aplica��es 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 s�o compostas de atributos e m�todos. Para executar uma a��o sobre o objeto ou relativa a este basta chamar um m�todo : ac.mostra(); O m�todo n�o precisa de muitos argumentos, porque � pr�prio 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 s�o criados de forma separada, mesmo que s� tenham sentido juntos. A jun��o entre os dados e procedimentos se d� atrav�s de passagem de par�metros. No caso de uma linguagem procedural, o que normalmente � feito se assemelha ao c�digo seguinte: Move(ac,1.0,1.0);. Nesse caso AC � um "record", algo semelhante ao struct de C (n�o C++). Move, acessa os dados do "record" alterando os campos. O par�metro � passado por refer�ncia e o procedimento � definido a parte do registro, embora s� sirva para aceitar argumentos do tipo Circulo e mover suas coordenadas.

Seguran�a:

Em ambos programas (Pascal, Java) o programador pode obter acesso direto aos dados do tipo definido pelo usu�rio: 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 m�todos. Isto nos garante maior seguran�a e liberdade pois podemos permitir ou n�o o acesso para cada atributo de acordo com nossa vontade.

Efici�ncia:

Algu�m pode argumentar que programas que usam bastante chamadas de m�todos podem se tornar pouco eficientes e que poderia ser melhor obter acesso direto aos dados de um tipo definido pelo usu�rio ao env�s de passar por todo o trabalho de c�pia de argumentos, inser��o de fun��o na pilha, etc.

Em verdade n�o se perde muito em efici�ncia, por que tal metodologia de programa��o nos leva a organizar o c�digo de maneira mais compacta. E al�m disso muitas vezes n�o se deseja permitir sempre o acesso direto aos dados de um tipo definido pelo usu�rio por raz�es de seguran�a.

1.2.6. CONSTRUTORES

Construtores s�o m�todos especiais chamados pelo sistema no momento da cria��o de um objeto. Eles n�o possuem valor de retorno, porque voc� n�o pode chamar um construtor para um objeto, voc� s� usa o construtor no momento da inicializa��o 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 cria��o, declara��o de uma String, sem necessidade de uso do nome do construtor como m�todo, 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 tamb�m us�vamos construtores no momento de inicializar nossos objetos, s� que eles n�o possu�am argumentos.

Existem varia��es 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 aten��o no m�todo com o mesmo nome que a classe, este � o construtor:

//Classe ponto

public class Ponto {

public float x,y;

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

//garante o estado do objeto

{

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

}

public void move(float dx,float dy)

{

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

}

public void mostra()

{

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

}

}

//Classe principal, Arquivo Principal.java

public class Principal {

public static void main(String args[]) {

Ponto ap;

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

ap.mostra();

ap.move(1,1);

ap.mostra();

ap.x=100;

ap.mostra();

}

}

(0,0)

(1,1)

(100,1)

//COMENTARIOS:

Note que com a defini��o do construtor, voc� � obrigado a passar os argumentos deste no momento da aloca��o do objeto. Se voc� precisa ter a op��o de n�o passar esses valores ou passar outros, as poss�veis solu��es ser�o dadas em 3. (float)0.0 indica que � para ser feita a convers�o de 1.0 para ponto flutuante. 1.0 sozinho � considerado double. (int)1.0 � igual a 1. (int) 2.3 � igual a dois. Esta opera��o indicada por (nometipo)tipo_a_ser_convertido � tamb�m chamada de "type cast".

A ocorr�ncia de rotinas de cria��o de objetos em diversos locais de um programa � muito comum. Objetos podem ser criados dentro de estruturas condicionais, armazenados em arquivos, passados como par�metros, inseridos em estruturas din�micas dentro de outros objetos, etc.

1.2.7. CONSTRUTORES E AGREGA��O

Este exemplo � o resultado do exerc�cio anterior (exerc�cio 4 t�pico 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 reutiliza��o de c�digo ocorre � chamada de agrega��o.

O nome reutiliza��o de c�digo � bastante apropriado, pois a classe Reta estar� utilizando todos os m�todos escritos para a classe Ponto. Em casos como este � comum dizer que a classe Reta � cliente da classe Ponto em uma analogia com as rela��es comerciais.

Este programa busca chamar sua aten��o para o fato de que objetos s�o alocados dinamicamente e que caso voc� se esque�a de aloc�-los, eles ficam possuindo o valor null. Obter acesso a uma vari�vel com valor null � um erro que geralmente � verificado em tempo de execu��o.

Nos programas anteriores alocar os objetos era f�cil, mas agora que temos objetos funcionando dentro de outros objetos h� necessidade de adotar t�cnicas 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 aloca��o:

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 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 n�o � muito eficiente, mas n�o � do escopo deste texto tratar de problemas dessa natureza, o que ali�s complicaria muito o c�digo , desviando-nos do objetivo principal: simplicidade na apresenta��o de conceitos de orienta��o a objetos. O leitor deve ampliar os modelos aqui sugeridos em aplica��es na sua �rea de interesse. Como ainda faltam conceitos importantes para serem apresentados este tipo de aplica��o deve ser feita em paralelo com a leitura.

1.2.8. DESTRUTORES OU "finalizers"

A presen�a de coleta autom�tica de lixo torna o conceito de destrutores um pouco diferente de seus equivalentes em outras linguagens orientadas a objetos. Em Java destrutores s�o m�todos chamados pelo sistema quando a mem�ria de um objeto est� para ser liberada pelo coletor autom�tico de lixo (n�o 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 n�o implica que o objeto ser� deletado. Ao contr�rio dos construtores, os destrutores n�o tem argumentos, mas possuem valor de retorno que � igual a void.

Os destrutores s�o 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 destru�do. Existem outros casos onde um objeto deve comunicar aos outros objetos que ser� inutilizado, destru�do, ou seja : sair� do programa.

Em Java, que possui coleta autom�tica de lixo, um objeto passa a n�o existir mais no programa quando nenhuma vari�vel faz refer�ncia a ele. Nesse ponto, ele � armazenado no coletor autom�tico 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 n�o acostumados com esse conceito precisam ouvir a seguinte frase: "Voc� n�o � obrigado a liberar explicitamente a mem�ria de um objeto como � feito em C++ e outras linguagens".

Se estiv�ssemos por exemplo em C++, que n�o possui coleta autom�tica de lixo, o destrutor seria chamado sempre que a mem�ria de um objeto fosse desalocada, o que � feito pelo programador atrav�s de uma chamada a delete nomedoobjeto(); .

Em Java a libera��o de mem�ria que � feita pelo coletor autom�tico de lixo que � executado de modo ass�ncrono com o restante do programa, ou seja voc� n�o pode contar com o fato de que o destrutor ser� chamado imediatamente ap�s o momento em que seu objeto sai de escopo, a n�o ser que o programa seja executado com o modo ass�ncrono do coletor autom�tico de lixo desligado (java -noasyncgc NomePrograma). Na vers�o beta, voc� n�o pode nem mesmo contar com a chamada do destrutor pelo garbage collector, de modo que ele deve ser usado apenas para otimiza��es do c�digo.

1.3. PONTEIROS, "POINTERS", REFER�NCIAS E OBJETOS

Algu�m pode ter achado estranho que n�o foram discutidos ponteiros em Java, ocorre que eles n�o existem nessa linguagem. Existem estudos que afirmam que erros com ponteiros s�o um dos principais geradores de "bugs" em programas, al�m disso com todos os recursos que temos n�o precisaremos deles.

Os programadores acostumados ao uso de ponteiros (e aos erros decorrentes desse uso), achar�o muito natural e segura a transi��o para Java onde passar�o a usar principalmente vetores e classes. A estrutura��o de seu c�digo dever� agora ser feita em um modelo que se baseia no uso de objetos (vetores e Strings tamb�m s�o objetos). Objetos superam a representatividade obtida com records, fun��es isoladas e ponteiros.

De certo modo voc� estar� usando refer�ncias, mas de forma impl�cita. Por exemplo: objetos s�o alocados dinamicamente com new, eles s�o refer�ncias ou ponteiros para posi��es na mem�ria, mas a linguagem mascara este fato por raz�es de seguran�ao�es�es . Como objetos s�o ponteiros (s� que transparentes para voc�), nos depararemos com o problema de reference aliasing quando discutirmos c�pia de objetos com outros objetos como atributos.

1.3.1. PASSAGEM POR REFER�NCIA

Linguagens como Pascal ou C criam meios de passar par�metros por valor ou por refer�ncia. Como Java n�o possui ponteiros, a passagem por refer�ncia deve ser feita atrav�s de objetos. Se o par�metro j� � um objeto, ent�o a passagem dele � obrigatoriamente por refer�ncia.

No caso de tipos simples, podemos pass�-los dentro de vetores que s�o objetos, ou ent�o criar classes para embalar, empacotar estes tipos. Dada a necessidade destas classes, elas j� foram definidas na linguagem. S�o classes definidas para conter cada tipo b�sicos e permitir certas convers�es entre eles, falaremos destas classes conforme necessitarmos de seu uso. As vezes estas classes s�o chamadas de "wrappers".

1.3.2. VETORES E MATRIZES

Vetores s�o objetos, eles possuem papel importante no estilo de programa��o desta linguagem que exclui ponteiros. Por serem objetos, vetores s�o obrigatoriamente alocados de maneira din�mica. O exemplo a seguir aloca um vetor de inteiros com tr�s posi��es, seguindo uma sintaxe semelhante a de aloca��o de objetos:

class VetorTest {

public static void main (String args[]) {

int vetor[]=new int[3];

vetor[0]=0; //indexacao semelhante a C , C++

vetor[1]=10;

vetor[2]=20;

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

}

}

0 10 20

Resumo da sintaxe de vetores:

int a[]; //declara vetor de inteiros a

a=new int[10]; //aloca vetor a com dez posicoes

//as duas linhas anteriores podem ser abreviadas por:

int a[]=new int[10];

//alem disso se voce quiser inicializar o vetor a, ja' na declaracao:

int a[3]={0,10,20};

O an�logo para matrizes �:

int a[][]; //declara matriz de inteiros a

a=new int[3][3]; //aloca matriz 3x3, 9 celulas

Fim ...

Hosted by www.Geocities.ws

1