Você está na página 1de 86

Introduo ` Linguagem de Programao Java ca a ca

Andr Leon S. Gradvohl, M.Sc. e

Centro Nacional de Processamento de Alto Desempenho em So Paulo a

Universidade Estadual de Campinas

Dezembro 2008, Verso 1.2 a

Em portugus: e Copyright c 2008 ANDRE LEON S. GRADVOHL & CENTRO NACIONAL DE PROCESSAMENTO DE ALTO DESEMPENHO EM SAO PAULO. E permitida a cpia, distribuio ou alterao deste documento sob os termos da Licena de o ca ca c Documentao Livre GNU, Verso 1.2 ou qualquer verso posterior publicada pela ca a a Fundao Software Livre; sem Sees Invariantes, nem Textos de Capa, nem Textos de ca co Contra-Capa. Uma cpia da licena pode ser obtida em http://www.gnu.org/licenses o c /fdl.html. In English: Copyright c 2008 ANDRE LEON S. GRADVOHL & CENTRO NACIONAL DE PROCESSAMENTO DE ALTO DESEMPENHO EM SAO PAULO. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no BackCover Texts. A copy of the license may be obtained in http://www.gnu.org/licenses /fdl.html.

Prefcio a

Muito material existe sobre Java, tanto sobre sua arquitetura quanto sobre a linguagem em si. Ento, por qual motivo se escreve mais um texto a respeito? O objetivo deste material a bibliogrco dar suporte didtico a um curso de curta durao ou servir como base a cursos de a e a ca maior durao em Java e, em particular, Programao Orientada a Objetos. ca ca Java um assunto muito abrangente e cheio de min cias em diversas reas tecnolgicas. Por e u a o exemplo, pode-se usar Java em dispositivos sem o (wireless), em dispositivos embarcados (embedded devices), para processamento multim dia, em televiso interativa, em redes de coma putadores, entre vrias outras reas. A proposta de portabilidade e facilidade de uso prometida a a pelo Java parece estar sendo cumprida. Essa armao pode ser comprovada pela quantidade ca de publicaes que, direta ou indiretamente, citam Java e dos in meros sistemas que o utilizam. co u Apesar de ser um assunto vasto, esse material no pretende ser to abrangente ou profundo a a nos conhecimentos sobre Java. Na verdade, o texto pretende mostrar os principais conceitos envolvidos na arquitetura Java e programao orientada a objetos, bem como demonstrar algumas ca prticas de programao mais comuns na linguagem. a ca Sendo assim espera-se - ou melhor, deseja-se - que este texto sirva como ponto de partida para maiores incurses neste campo de conhecimento. Para tentar tornar o texto mais motivante, o algumas citaes de lmes clssicos foram acrescentadas. Tente entender o motivo dessas citaes co a co durante a leitura do texto! Bom proveito e boa leitura!

Sumrio a

Prefcio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a Lista de Figuras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lista de Tabelas 1 Introduo ca 1.1 1.2 Convenes adotadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . co Estrutura do Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

i v

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . vii 1 2 3 4 5 6 9

2 Arquitetura Java 2.1 2.2 Aplicaes X Applets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . co Compilao e Execuo de Programas Java . . . . . . . . . . . . . . . . . . . . . . ca ca

3 Conceitos de Programao Orientada a Objetos ca 3.1

Conceitos Iniciais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3.1.1 Restries aos mtodos e atributos . . . . . . . . . . . . . . . . . . . . . . 10 co e

3.2

Conceitos Espec cos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 13

4 Primeiras Frases na Linguagem Java 4.1 4.2

O Primeiro Programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Tipos Primitivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 4.2.1 Declarao de Variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 ca a ii

CENAPAD-SP 4.3

Introduo ` Linguagem de Programao Java ca a ca

Arranjos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 4.3.1 Tamanho de um Arranjo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

4.4

Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 4.4.1 4.4.2 4.4.3 Operadores Aritmticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 e Operadores Relacionais e Condicionais . . . . . . . . . . . . . . . . . . . . 17 Operadores de Atribuio . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 ca

4.5

Estruturas de Deciso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 a 4.5.1 4.5.2 Comando if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Comando switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

4.6

Estruturas de Repetio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 ca 4.6.1 4.6.2 4.6.3 4.6.4 Comando while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Comando do-while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Comando for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Comandos de Desvio de Fluxo . . . . . . . . . . . . . . . . . . . . . . . . . 22

4.7 4.8 4.9

Comentrios em Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 a Importando Classes Existentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Exemplo Geral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 27

5 Especicando Classes, Instanciando Objetos 5.1

Especicao da Classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 ca 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 Mtodo Construtor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 e Mtodo Destrutor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 e Operadores this e super . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

Implementao de Mtodos . . . . . . . . . . . . . . . . . . . . . . . . . . 30 ca e Sobrecarga de Mtodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 e Mtodos estticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 e a

5.2

Instanciao de Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 ca 5.2.1 Operador new . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

5.3

Exemplo Geral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

iii

CENAPAD-SP 6 Tratamento de Excees co 6.1 6.2 6.3

Introduo ` Linguagem de Programao Java ca a ca 40

Clusulas try-catch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 a Clusulas throws e throw . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 a Classe Exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 44

7 Entrada e Sa da 7.1 7.2

Streams ou Fluxos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 Fluxos de Caracteres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 7.2.1 Exemplo de Fluxo de Caracteres . . . . . . . . . . . . . . . . . . . . . . . . 47

7.3

Fluxo de B ytes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 7.3.1 Exemplo de Fluxo de Bytes . . . . . . . . . . . . . . . . . . . . . . . . . . 53 56

8 Interfaces Grcas a 8.1 8.2 8.3 8.4 8.5 8.6

Janelas, o bsico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 a Look and Feel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 Tratamento de Eventos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 Gerenciadores de Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 Menus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 Campos e Areas de Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 71

9 Applets 9.1 9.2

Ciclo de Vida dos Applets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Passagem de Outros Parmetros . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 a 77

Referncias Bibliogrcas e a

iv

Lista de Figuras

2.1 2.2 4.1 4.2 4.3 4.4 4.5 5.1 5.2 5.3 5.4 5.5 5.6 7.1 7.2 7.3 7.4

Arquitetura Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Especicao das variveis de ambiente do Java . . . . . . . . . . . . . . . . . . . ca a

5 7

Primeiro programa em Java. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Segundo programa em Java. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Programa em Java que calcula o n mero de parmetros na linha de comando. . . 17 u a Programa que exemplica a maioria dos tpicos abordados neste cap o tulo. . . . . . 24 Continuao do Programa da Figura 4.4. . . . . . . . . . . . . . . . . . . . . . . . 25 ca Classe NumeroComplexo, utilizada para exemplicar os tpicos deste cap o tulo. . . . 35 Continuao da Classe NumeroComplexo. . . . . . . . . . . . . . . . . . . . . . . . 36 ca Segunda continuao da Classe NumeroComplexo. . . . . . . . . . . . . . . . . . . 37 ca Terceira continuao da Classe NumeroComplexo. ca . . . . . . . . . . . . . . . . . . 38

Quarta continuao da Classe NumeroComplexo. . . . . . . . . . . . . . . . . . . . 39 ca Classe Main, que utiliza a classe NumeroComplexo. . . . . . . . . . . . . . . . . . . 39 ClasseNumeraLinhas, utilizada para mostrar classes que tratam o uxo de caracteres. 48 Continuao da classe NumeraLinhas. . . . . . . . . . . . . . . . . . . . . . . . . . 49 ca Mtodo de nalizao da da classe NumeraLinhas. . . . . . . . . . . . . . . . . . . 50 e ca Mtodo main da classe NumeraLinhas. . . . . . . . . . . . . . . . . . . . . . . . . 51 e v

CENAPAD-SP 7.5 7.6 8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 8.9

Introduo ` Linguagem de Programao Java ca a ca

Escrita de um objeto da classe NumeroComplexo em um arquivo. . . . . . . . . . . 54 Leitura de um objeto da classe NumeroComplexo de um arquivo. . . . . . . . . . . 55 Programa que ilustra a criao de uma janela. . . . . . . . . . . . . . . . . . . . . 58 ca Programa que ilustra a criao de uma janela. . . . . . . . . . . . . . . . . . . . . 59 ca Classe EventoBotao que trata os eventos do boto no programa anterior. . . . . . 60 a Implementao da janela cujo boto ter os eventos capturados. . . . . . . . . . . 61 ca a a Exemplo de BorderLayout. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 Exemplo de BoxLayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 Exemplo de FlowLayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 Exemplo de GridLayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 In do exemplo de GridBagLayout . . . . . . . . . . . . . . . . . . . . . . . . . 66 cio

8.10 Continuao do exemplo de GridBagLayout . . . . . . . . . . . . . . . . . . . . . 67 ca 8.11 Exemplo de Menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 8.12 In do programa que exemplica a utilizao de objetos de texto. . . . . . . . . 69 cio ca 8.13 Continuao do programa que exemplica a utilizaao de objetos de texto. . . . . 70 ca c 9.1 9.2 9.3 9.4 Applet simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

Pgina HTML que embute o applet da Figura 9.1. . . . . . . . . . . . . . . . . . . 74 a Applet simples com passagem de parmetros. . . . . . . . . . . . . . . . . . . . . 75 a Pgina HTML que embute o applet da Figura 9.3. . . . . . . . . . . . . . . . . . . 76 a

vi

Lista de Tabelas

3.1 4.1 4.2 4.3 4.4 4.5 7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8 8.1 8.2

Tipos de restries a mtodos e atributos . . . . . . . . . . . . . . . . . . . . . . . 11 co e Tipos primitivos de dados e suas caracter sticas. . . . . . . . . . . . . . . . . . . . 15 Operadores aritmticos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 e Operadores relacionais. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Operadores condicionais. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Operadores de atribuio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 ca Subclasses da classe Reader e suas descries. . . . . . . . . . . . . . . . . . . . . 45 co Mtodos da classe Reader e herdados por suas subclasses. e . . . . . . . . . . . . . 45

Subclasses da classe Writer e suas descries. . . . . . . . . . . . . . . . . . . . . 46 co Mtodos da classe Writer e herdados por suas subclasses. e . . . . . . . . . . . . . 46

Subclasses da classe InputStream e suas descries. . . . . . . . . . . . . . . . . . 52 co Mtodos da classe InputStream e herdados por suas subclasses. . . . . . . . . . . 52 e Subclasses da classe OutputStream e suas descries. . . . . . . . . . . . . . . . . 53 co Mtodos da classe OutputStream e herdados por suas subclasses. e . . . . . . . . . 53

Tipos de Listeners e seus respectivos eventos t picos. . . . . . . . . . . . . . . . 60 Alguns atributos das clulas no GridBagLayout . . . . . . . . . . . . . . . . . . . 66 e

vii

CAP ITULO

Introduo ca

Diferente apenas na sua mente . e Desaprender aquilo que aprendeu voc deve e Mestre Yoda, em Star Wars V: The Empire Strikes Back ,1980. Desde o in da histria da humanidade, os homens procuram criar utens cio o lios para auxilia los nas tarefas dirias. Quanto mais genricas so essas ferramentas, i.e. quanto mais problemas a e a elas conseguem resolver sozinhas, mais uteis so. Esse o objetivo da arquitetura Java: ser uma a e ferramenta genrica, fcil, capaz de resolver o maior nmero de problemas poss e a u veis, na maior quantidade de reas poss a veis. Para conseguir essa proeza, a arquitetura Java foi concebida para ser multiplataforma, ou seja, foi implementada para funcionar em diferentes combinaes de hardware e software bsico (leiaco a se sistema operacional). O objetivo permitir que as aplicaes desenvolvidas na arquitetura e co sejam escritas apenas uma vez e executadas em qualquer lugar, qualquer mquina. Esse conceito a denominado, em ingls, de write-once, run anywhere. No bom portugus, isto signica e e e portabilidade. Mais do que portvel, o desenvolvimento de aplicaes na arquitetura Java deveria ser rpida a co a e reaproveitvel, sempre que poss a vel. O paradigma que, no por acaso, mais se adequava a esses a

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

requisitos era o paradigma de programao orientada a objetos (POO). Assim, juntando todos ca esses requisitos e conceitos, James Goslin, empregado da SUN Microsystems, criou a arquitetura Java em 1995. Contudo algum poderia questionar o porqu de se falar em arquitetura e no da linguagem e e a Java. A resposta que a linguagem apenas um componente da arquitetura Java. A idia e e e e complexa para tornar as tarefas simples. No decorrer do texto, todas as d vidas a esse respeito u tentaro ser sanadas. Por ora, vale ressaltar que a maior parte do texto concentra-se na linguagem a e no na arquitetura Java. a Quanto ` linguagem, o objetivo deste texto apresent-la ao leitor e mostrar um pouco das a e a bibliotecas mais utilizadas. O texto no pretende se aprofundar em detalhes da arquitetura, a tampouco das bibliotecas. Porm, ao nal do texto, espera-se que o leitor tenha assimilado o e m nimo necessrio para poder desenvolver-se sozinho aprendendo cada vez mais sobre o poder a da linguagem Java.

1.1

Convenes adotadas co

Para facilitar a leitura do texto, algumas convenes foram adotadas. So elas: co a Palavras estrangeiras so grafadas entre aspas e em itlico, e. g. threads. a a Comandos ou trechos de programas so grafados em fonte diferenciada, por exemplo void. a Ressalta-se que esse texto no pressupe v a o nculo nenhum do Java com qualquer sistema operacional. Entretanto, todos os testes foram feitos tendo como base o sistema operacional Linux (RedHat, verso 9.0). Sendo assim, no h garantias de que os exemplos funcionaro em a a a a outro sistema. Outro detalhe diz respeito ` verso da plataforma Java. Na poca do desenvolvimento deste a a e texto, a verso estvel da plataforma Java utilizada foi a J2SE 1.4.2. Uma outra verso da a a a plataforma j estava em sua verso Beta: a J2SE 1.6. Contudo, optou-se por focalizar o texto a a na ultima verso estvel. a a

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

1.2

Estrutura do Texto

O texto foi estruturado da seguinte forma. O Cap tulo 2 trata brevemente da losoa Java, alm de se explicar como ocorre a come pilao e a execuo de programas escritos nessa linguagem. ca ca Os conceitos de programao orientada a objetos so apresentados brevemente no Cap ca a tulo 3. No Cap tulo 4 so apresentados os operadores, tipos e comandos bsicos da linguagem a a Java. O in da prtica na POO no Cap cio a e tulo 5, onde se explica como ocorre a denio de ca classes e instanciao de objetos com um exemplo prtico. ca a O tratamento de excees mostrado no Cap co e tulo 6. O Cap tulo 7 dedica-se `s classes relativas a entrada e sa de dados. a da As estruturas mais comuns para implementao de interfaces grcas so descritas breveca a a mente no Cap tulo 8. Finalmente, rpidos comentrios a respeito de applets so apresentados no Cap a a a tulo 9

CAP ITULO

Arquitetura Java

Eu gosto de voc. e At entendo voc de vez em quando. e e Mas no vou investir meus sentimentos em uma mquina a a Portia Martin falando para o rob Andrew o em O homem bicentenrio, 1999. a A arquitetura ou plataforma Java tem, basicamente, dois componentes: a mquina virtual a Java (JVM) e a interface de programao de aplicaes (Application Programming Interface ca co API). A JVM, como o prprio nome diz, emula um ambiente computacional. A mquina virtual o a e a principal responsvel pela portabilidade que a plataforma Java prov, pois uma vez instalada a e em um ambiente computacional real, qualquer programa Java pode ser executado sobre a JVM. As APIs por sua vez so equivalentes `s bibliotecas. Elas tm grande utilidade para as a a e aplicaes Java pois trazem uma srie de funcionalidades j prontas para serem usadas, evitando co e a assim reinvent-las. a Os programas compilados em Java geram um arquivo .class contendo os chamados bytecodes. Os bytecodes so uma espcie de cdigo assembler para a JVM. Esse cdigo j a e o o a

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

est otimizado para a JVM que, por sua vez, o interpreta gerando comandos espec a cos para o hardware em que est instalada. Por isso se diz que os programas Java so compilados e a a interpretados. H ainda a questo do cdigo nativo, que pode ser chamado a partir de um cdigo Java (bya a o o tecodes). O cdigo nativo prprio da mquina que o executa. Portanto, no recomendvel o e o a a e a a utilizao desse tipo de cdigo nas aplicaes. Essa ao retira a principal caracter ca o co ca stica da plataforma Java: a portabilidade. A Figura 2.1 mostra qual a relao entre esses componentes. ca

Bytecodes

Codigo Nativo

JVM

Sistema Operacional

Hardware

Figura 2.1: Arquitetura Java

2.1

Aplicaes X Applets co

Os programas desenvolvidos em Java podem estar embutidas em pginas da World Wide Web a (WWW), chamados applets, ou serem aplicaes que so executadas independente da WWW co a - chamadas aplicaes standalone. co Lembre-se que para serem executados, tanto os applets quanto as aplicaes precisam da co mquina virtual. Mas e se a JVM estiver embutida no prprio navegador (browser ) utilizado? a o E exatamente dessa forma que ocorre! A mquina virtual um plug-in, um software a e acoplado ao navegador que permite que os bytecodes sejam interpretados em uma rea dentro a da pgina WWW sendo visualizada. Obviamente, sem esse plug-in, chamado Java Runtime a 5

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

Environment (JRE), nenhum cdigo Java pode ser interpretado dentro da pgina WWW. o a Alm da diferena expl e c cita nos pargrafos anteriores, h outra muito importante: a questo a a a da segurana. No caso dos applets, eles funcionam na chamada sandbox 1. Dentro da sandc box tudo permitido. Mas fora dela, existem vrias restries. As mais comuns so: impossibie a co a lidade de gravar conte do no disco r u gido e impossibilidade de abrir sockets ou qualquer outra forma de comunicao. Com isso, os applets Java ganharam muita fama na internet. ca As aplicaes no possuem nenhum tipo restrio imposta pela JVM. As restries feitas `s co a ca co a aplicaes so as mesmas impostas pelo sistema operacional ` mquina virtual. co a a a

2.2

Compilao e Execuo de Programas Java ca ca

Conforme j mencionado, um cdigo em Java compilado e interpretado. Sendo assim, o primeiro a o e passo depois de se escrever um programa em Java traduz para bytecodes. Isto feito com e -lo e o compilador Java que j vem com o kit padro de desenvolvimento (Standard Development a a Kit - SDK) A sintaxe m nima de compilao a seguinte: ca e javac -classpath /meuDir meuArquivo.java Observe quais so os elementos que compem a sintaxe do comando. a o javac o compilador Java. e -classpath especica onde sero encontrados os arquivos .class. a /meuDir o diretrio onde esto os arquivos .class utilizados e o a meuArquivo.java contm o programa a ser compilado. e Os itens -classpath /meuDir so opcionais. Eles servem para especicar em que diretrio a o esto outros arquivos .class que fazem parte da sua aplicao. Para evitar incluir essa ina ca formao sempre que precisar compilar o programa, o ideal que se dena a varivel de ambiente ca e a CLASSPATH.
1

Sandbox ou caixa de areia em portugus, um local onde as crianas podem brincar a vontade, sem a e e c

possibilidade de danicar objetos fora da caixa.

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

E no caminho especicado na varivel de ambiente CLASSPATH que o compilador Java vai a buscar todos os arquivos e bibliotecas necessrios para a sua aplicao. Alm da CLASSPATH, a ca e a varivel de ambiente PATH tambm tem papel importante. E com base no caminho especia e cado nessa varivel que se encontram os arquivos executveis (programas). Provavelmente, essa a a varivel j se encontra denida em seu sistema operacional. Ainda assim, poss altera-la. a a e vel Em sistemas operacionais Linux (usando o bash shell), recomenda-se que se congure as variveis de ambiente de acordo com a Figura 2.2: a

JAVA_HOME="diretorio_do_java" PATH=${PATH}:${JAVA_HOME}/bin CLASSPATH=${JAVA_HOME}/lib:. Figura 2.2: Especicao das variveis de ambiente do Java ca a

A varivel JAVA HOME especica em que diretrio foi instalado o Java SDK (as aspas no a o a devem ser inclu das). A varivel PATH acrescenta ` si mesma o diretrio bin que est dentro a a o a do diretrio onde foi instalado o Java SDK. Finalmente, a varivel CLASSPATH composta do o a e diretrio lib que est dentro do diretrio onde foi instalado o Java SDK e do diretrio atual o a o o (representado pelo .), onde provavelmente esto os arquivos compilados. a Esse mesmo esquema da Figura 2.2 pode ser inclu no seu arquivo de inicializao. Facilido ca tando assim o uso futuro. Esquema semelhante pode ser feito no sistema operacional Windows. Atente apenas para o fato de usar ; ao invs de : como separador de diretrios, tal como na e o especicao da varivel PATH, por exemplo. ca a Uma vez compilado sem erros, o compilador java deve gerar um arquivo com o mesmo nome do arquivo fonte, mas com a extenso .class. Supondo que seja uma aplicao e no um a ca a applet, a sintaxe para executar esse programa a seguinte: e java -classpath /meuDir meuArquivo arg1 arg2 arg3 Onde java a mquina virtual Java. e a 7

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

-classpath especica onde sero encontrados os arquivos .class. a /meuDir o diretrio onde esto os arquivos .class utilizados e o a meuArquivo o nome do programa (arquivo que contm os bytecodes sem a extenso e e a .class. arg1 arg2 arg3 so os argumentos para o programa. a Note que opcional a utilizao de -classpath /meuDir, se a varivel CLASSPATH j estiver e ca a a sido denida. So opcionais tambm os argumentos arg1 arg2 arg3. a e No caso dos applets a compilao ocorre da mesma forma. Porm, como sua execuo ca e ca requer a utilizao de um navegador, a execuo torna-se um pouco diferente. No Cap ca ca tulo 9, esse assunto ser tratado. a

CAP ITULO

Conceitos de Programao Orientada a Objetos ca

Receio que tudo o que zemos foi acordar um gigante adormecido. Almirante Yamamoto em Pearl Harbor , 2001. A programao orientada a objetos (POO) um conceito relativamente antigo, que nasceu ca e antes de 1990. Smalltalk foi uma das primeiras linguagens puramente orientada a objetos. Depois dela Eiel, Java e outras seguiram essa linha. Entretanto, nem todas puramente orientada a objetos, como o C++, por exemplo. Mas o que difere a programao orientada a objetos da programao convencional, chamada ca ca estruturada? A diferena est na relao entre as estruturas de dados e as rotinas para processc a ca a los. Na programao estruturada, os dados esto em estruturas separadas das rotinas que os ca a trataro. Em outras palavras, so declaradas as estruturas de dados em uma parte do programa a a e as rotinas em outra. Na POO, dados e processamento esto fortemente ligados. Tanto que so encapsulados em a a estruturas chamadas classes. As classes contero as estruturas de dados e o cdigo para lidar a o com essas estruturas em uma unica unidade lgica por assim dizer. o Na abordagem orientada a objetos, mais fcil implementar a reutilizao de cdigo. Alm e a ca o e

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

disso, a forma como os sistemas so analisados e projetados tambm torna-se diferente. Nas a e prximas sees, os conceitos sero explicados com mais detalhes. o co a

3.1

Conceitos Iniciais

Antes de entrar em conceitos mais complexos de POO, preciso comear pelos mais simples. O e c primeiro deles o conceito de classes de objetos - ou simplesmente classes. Classes so unidades e a que contm estruturas de dados e cdigo. As estruturas de dados da classe so chamadas de e o a atributos, enquanto as rotinas para lidar com essas estruturas so chamadas mtodos. a e Para car mais claro, imagine que se deseja modelar a classe de objetos tringulo. Que a atributos poderiam existir em uma classe de objetos tringulo? Como exemplo, pode-se ter a como atributos basicamente os seguintes itens: comprimento do primeiro lado; comprimento do segundo lado; comprimento do terceiro lado; cor do tringulo. a Quais seriam os mtodos dessa classe? Poderiam ser, talvez, os seguintes: alterar primeiro e lado; vericar segundo lado; calcular a rea do tringulo; vericar a cor do tringulo; entre a a a outros. Note que, mesmo teoricamente, os mtodos esto fortemente ligados aos atributos. Ou seja, e a os mtodos provem as ferramentas para a manipulao do prprio objeto atravs dos seus e e ca o e atributos. Mas qual a relao entre um objeto e uma classe? A resposta que um objeto uma instncia ca e e a de uma classe, i. e. a classe uma denio, enquanto o objeto a materializao (em termos e ca e ca computacionais) dessa denio. ca

3.1.1

Restries aos mtodos e atributos co e

Ora, mas tal como um objeto real, o objeto computacional pode ter mtodos ou atributos rese tritos. Em outras palavras, alguns mtodos ou atributos s so conhecidos e utilizados atravs e o a e de mtodos da prpria da classe ou daquelas classes cuja denio foi recebida como herana e o ca c (conceito tratado adiante, na Seo 3.2). ca Existem basicamente trs formas de restringir os mtodos ou atributos de uma classe. A e e Tabela 3.1 a seguir explica as diferenas. Desse modo, poss restringir o acesso dos mtodos c e vel e

10

CENAPAD-SP e atributos facilitando o encapsulamento. Palavra-chave public (p blico) u protected (protegido) private (privado)

Introduo ` Linguagem de Programao Java ca a ca

Restrio ca Nenhuma. Os mtodos de quale quer classe podem acessar. Apenas os mtodos das sube classes podem acessar. Apenas os mtodos da prpria e o classe podem acessar.

Tabela 3.1: Tipos de restries a mtodos e atributos co e

3.2

Conceitos Espec cos

Entre os conceitos que tornam a POO mais forte est o de encapsulamento, j mencionado. a a Encapsulamento, nesse caso, a criao de mdulos auto-sucientes, ou seja, que contm todos e ca o e os mtodos e atributos necessrios para gerar informaao solicitada e interagir com os demais e a c objetos. Na verdade, o ato de encapsular cdigo signica estar escondendo detalhes da implementao o ca de uma classe. A grande vantagem disso a facilidade que o usurio vai ter em usar objetos e a de tal classe. Nesse caso, para o usurio o importante que o objeto desempenhe a tarefa da a e melhor maneira poss vel, independente de como essa maneira. e Outro conceito importante para a POO e que facilita a reutilizao de cdigo o de herana. ca o e c Esse conceito o que permite que a denio de uma classe seja aproveitada por outra. Com e ca isso, menos cdigo necessrio, uma vez que as denies de mtodos e atributos podem ser o e a co e reaproveitadas. Voltando ao exemplo da classe tringulo, poss ter uma subclasse dessa que herda as a e vel caracter sticas dessa, e.g. a classe tringulo retngulo. Nessa nova subclasse, os atributos sero a a a os mesmos, mas poss acrescentar novos mtodos. Por exemplo, um mtodo para calcular a e vel e e hipotenusa. Note que o conceito de herana foi utilizado para fazer a especializao de uma classe. Mas, c ca 11

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

ao invs disso, pode ocorrer o contrrio: a generalizaao. Ou seja, pode-se acrescentar mais e a c mtodos e atributos para tornar uma classe mais genrica. e e Em algumas linguagens de POO, poss utilizar o conceito de herena m ltipla, i.e. uma e vel c u classe pode herdar de duas ou mais classes. A herana m ltipla muito problemtica pois se duas c u e a classes possu rem a mesma denio de um mtodo, mas implementaes diferentes, qual das ca e co duas denies sero aceitas? Para evitar esse conito, a linguagem Java aceita apenas herana co a c simples, ou seja, cada classe pode herdar de, no mximo, outra classe. a Outro conceito decorrente da herana o polimorsmo. Observando a composio da palavra c e ca poss e vel entender seu signicado: poli equivalente a muitos e morsmo a forma. e Assim, no caso de POO, polimorsmo signica que um determinado mtodo pode assumir vrias e a formas. Essas formas referem-se ` assinatura (ou prottipo) de um mtodo. A assinatura de um a o e mtodo composta dos seguintes itens: tipo de objeto retornado por esse mtodo; nome do e e e mtodo; tipo de objetos passados como parmetros. Um conjunto de mtodos polimrcos e a e o e aquele em que todos os mtodos possuem o mesmo nome, porm diferentes tipos de objeto de e e retorno ou parmetros. a H ainda o conceito de interface. No caso de Java o conceito de interface util para garantir a e o relacionamento entre objetos de classes distintas sem utilizar herana. Na verdade, ao implec mentar uma interface, a classe se obriga a implementar todos os mtodos daquela com a mesma e assinatura especicada pela prpria interface. o

12

CAP ITULO

Primeiras Frases na Linguagem Java

Existe uma diferena entre saber o caminho c e trilhar o caminho. Morpheus em Matrix , 1999. Neste cap tulo se inicia a parte prtica da linguagem Java. a idia tentar mostrar os tipos a e e primitivos de dados (mais precisamente objetos), os comandos bsicos e inclusive comentrios. a a Sempre que poss sero ressaltados os conceitos de POO, mencionados nos cap vel a tulos anteriores. Ressalta-se ainda que a linguagem Java descendente da linguagem C e portanto, h e a diferena entre textos escritos com letras mai sculas e min sculas. Alm disso, a maioria dos c u u e comandos bsicos tm sintaxe similar `queles da linguagem C. a e a

4.1

O Primeiro Programa

O primeiro programa em Java, como no poderia deixar de ser, uma aplicao simples que a e ca imprime uma mensagem na tela. Por enquanto, o ideal concentrar-se na estrutura do programa e ao invs dos comandos. Observe a Figura 4.1 a seguir. e So boas prticas de programao manter o nome do arquivo com o mesmo nome da classe a a ca para evitar confuses posteriores e usar a primeira letra mai scula nos nomes das classes. Essas o u 13

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

class Ola { public static void main(String[ ] args) { System.out.println("Ola Mundo!"); } } Figura 4.1: Primeiro programa em Java.

prticas so recomendadas pelos prprios autores da linguagem Java e adotados pela grande a a o maioria dos programadores. Analisando o exemplo da Figura 4.1 percebe-se que a declarao da classe Ola. Nessa classe ca h apenas o mtodo main. Esse mtodo mandatrio na classe principal da aplicao. E a partir a e e e o ca dele que o programa iniciar sua execuo. a ca A assinatura do mtodo main sempre a mesma, ou seja ele p blico (public), esttico e e e u a (static) e no retorna valores (void). Alm disso, ele recebe um arranjo (vetor) de Strings a e como parmetro. Nesse arranjo de Strings esto os parmetros passados para a aplicao pela a a a ca linha de comando. Dentro do mtodo main, o unico comando existente a chamada do mtodo println, com e e e a String Ola Mundo! como parmetro. O mtodo println faz parte do objeto out que a e e atributo do objeto System.

4.2

Tipos Primitivos

Como toda linguagem de programao de alto n ca vel, Java tambm possui seus tipos primitivos de e dados. A Tabela 4.1 a seguir mostra os tipos primitivos de dados, sua descrio e tamanho. Note ca que, diferente da linguagem C, Java no possui suporte para ponteiros (referncias ` memria). a e a o O objetivo dessa deciso tornar a linguagem mais fcil de usar. a e a

14

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

Tipo void boolean byte short char int float long double

Descrio ca vazio lgico o inteiro inteiro caractere inteiro real inteiro real

Tamanho zero 1 bit (false/true) 8 bits 16 bits 16 bits 32 bits 32 bits 64 bits 64 bits

Tabela 4.1: Tipos primitivos de dados e suas caracter sticas.

4.2.1

Declarao de Variveis ca a

Da mesma maneira que a linguagem C, a declarao de variveis em Java funciona especicando ca a primeiro o tipo de dado e em seguida o identicador (nome) da varivel. a Observe o programa da Figura 4.2. Nele, foram declaradas trs variveis de tipos diferentes. e a A primeira varivel (re) tem tipo float. A segunda (inte) tem tipo int e a terceira (carac) a tem tipo textttoat. Apesar de terem tipos diferentes, essas variveis so compat a a veis. Contudo, note que no h problemas se uma varivel de menos abrangente (int por exemplo) a a a for atribu a uma varivel de tipo mais abrangente (float por exemplo). Todavia, o contrrio da a a pode gerar erros, caso no seja feita uma converso expl a a cita de tipos. H tambm a possibilidade de se declarar variveis nais. Esse tipo de varivel funciona como a e a a uma constante. Por exemplo, se existisse a seguinte declarao: final char c;. Isso signica ca que c uma constante do tipo char cujo valor nal ainda no foi atribu e a do. Depois que este valor for atribu ` varivel, a mesma no poder ser alterada. do a a a a

4.3

Arranjos

Arranjos (vetores ou arrays em ingls) so estruturas de dados compostas, homogneas e de e a e tamanho xo. Isto signica que em um espao de memria de tamanho xo e cont c o nuo existem 15

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

class Ola { public static void main(String[ ] args) { float re; int inte = 0; char carac = a; re = inte + carac; System.out.println("O valor de re eh:" + re ); } } Figura 4.2: Segundo programa em Java.

vrios objetos de um mesmo tipo. a Como a prpria denio sugere, usa-se arranjo quando precisa-se armazenar um grupo de o ca objetos do mesmo tipo em um espao de memria facilmente enderevel. c o ca Para declarar um arranjo, necessrio colocar colchetes ([,]) aps o tipo de objeto que o e a o arranjo armazenar. O clculo de quantos objetos sero armazenados feito a posteriori, quando a a a e o arranjo for instanciado. Observe o exemplo a seguir, onde criado um arranjo de n meros em e u ponto utuante (float), com dez posies. co float[ ] vetor = new float[10]; Observe tambm o exemplo da Figura 4.2 onde, na lista de parmetros do mtodo main e a e e declarado que args um arranjo de Strings. O tamanho do arranjo ser calculado em tempo e a de execuo, dependendo de quantos parmetros foram passados pela linha de comando. ca a Para acessar um objeto em um arranjo de objetos, basta colocar entre colchetes a posio do ca respectivo objeto, como no exemplo a seguir. vetor[0] = 13.5; vetor[9] = 4.77; Note que `s posies zero e nove do arranjo vetor foram atribu a co dos os valores 13.5 e 4.77 respectivamente. Todos os arranjos em Java, se iniciam da posio zero. ca 16

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

4.3.1

Tamanho de um Arranjo

O tamanho de um arranjo pode ser obtido em tempo de execuo do programa. Lembre-se que ca o arranjo um objeto e como tal tambm tem atributos. Um dos atributos de qualquer arranjo e e seu tamanho, dado pelo atributo length. Veja como isto pode ser feito no programa ilustrado e na Figura 4.3 a seguir:

class Parametros { public static void main(String[ ] args) { int numeroParametros; numeroParametros = args.length; System.out.println("O numero de parametros eh:" + numeroParametros ); } } Figura 4.3: Programa em Java que calcula o n mero de parmetros na linha de comando. u a

4.4
4.4.1

Operadores
Operadores Aritmticos e

A Tabela 4.2 a seguir, mostra a lista de operadores aritmticos dispon e veis na linguagem Java.

4.4.2

Operadores Relacionais e Condicionais

Na Tabelas 4.3 e 4.4 a seguir, esto as listas de operadores relacionais e condicionais dispon a veis na linguagem Java. Cuidado em relao aos operadores & e |. Quando os operandos que eles tratam forem valores ca inteiros, as operaes realizadas so feitas bit-a-bit. Ou seja, respectivamente e lgico e ou co a o lgico. o

17

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

Operador + * / % ++

Exemplo op1 + op2 op1 op2 op1 op2 op1 / op2 op1 % op2 op1 + + + + op1

Descrio ca Soma op1 com op2. Subtrai op1 de op2. Multiplica op1 com op2. Divide op1 por op2. Calcula o resto da diviso de op1 por op2. a Retorna o valor de op1 e em seguida o incrementa. Incrementa op1 e em seguida retorna seu valor. Retorna o valor de op1 e em seguida o decrementa. Decrementa op1 e em seguida retorna seu valor.

--

op1 op1

Tabela 4.2: Operadores aritmticos. e

Operador == != > >= < <=

Exemplo op1 == op2 op1 ! = op2 op1 > op2 op1 op2 op1 < op2 op1 op2

Retorna true se op1 for igual a op2. op1 for diferente de op2. op1 for maior que op2. op1 for maior ou igual op2. op1 for menor que op2. op1 for menor ou igual a op2.

Tabela 4.3: Operadores relacionais.

4.4.3

Operadores de Atribuio ca

Os operadores de atribuio em Java esto descritos na Tabela 4.5 a seguir. ca a

4.5

Estruturas de Deciso a

Na maioria das linguagens de programao existem as chamadas estruturas de deciso. Essas ca a estruturas so comandos que permitem desviar o uxo de controle do programa, com base em um a teste prvio. Existem duas comandos bsicos que implementam essas estruturas: os comandos e a

18

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

Operador &&

Exemplo

Retorna true se

op1 && op2 se op1 e op2 forem ambos verdadeiros. op2 avaliado se op1 for verdade. e

&

op1 & op2

se op1 e op2 forem ambos verdadeiros. op1 e op1 so ambos avaliados. a

||

op1 || op2 op1 | op2 !op1 op1 ^ op2

se op1 ou op2 forem verdadeiros. op2 avaliado se op1 for falso. e

se op1 ou op2 forem verdadeiros. op1 e op1 so ambos avaliados. a

! ^

se o valor lgico de op1 for falso. o se op1 e op2 forem diferentes entre si.

Tabela 4.4: Operadores condicionais.

Operador += -= /= *= %= ?...:

Exemplo op1 + = op2 op1 = op2 op1 / = op2 op1 = op2 op1 % = op2

Equivalenta a op1 = op1 + op2. op1 = op1 op2. op1 = op1 / op2. op1 = op1 op2. op1 = op1 % op2.

op1 = exp? op2 : op3 op1 = op2 se exp for verdade. op1 = op3 se exp for falso. Tabela 4.5: Operadores de atribuio. ca

if e switch.

4.5.1

Comando if

Como na linguagem C, existem duas formas bsicas do comando if. A primeira, mais simples, a possui a seguinte sintaxe: if ( EXPRESS~O ) COMANDOS A 19

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

~ No lugar de EXPRESSAO deve estar qualquer expresso que retorne um valor lgico (true ou a o false). No lugar de COMANDOS deve existir um unico comando ou, noutro caso, um conjunto de comandos cercado por chaves ({e }), chamado bloco de comandos. Outra variante do comando if tem a seguinte sintaxe: ~ if ( EXPRESSAO ) COMANDOS1 else COMANDOS2 Essa variante funciona de forma similar ` primeira forma. Contudo o segundo bloco de a comandos COMANDOS2 s ser executado caso a EXPRESS~O seja false. o a A ~ a Note que os parnteses que cercam a EXPRESSAO so obrigatrios. e o

4.5.2

Comando switch

Outra estrutura de deciso comum `s linguagens C e Java a switch. Ela permite escolher a a e entre vrios valores poss a veis para uma determinada expresso inteira. As variveis devem ser a a dos tipos bsicos, inteiro e caractere, mostrados na Tabela 4.1. a A sintaxe do comando switch a seguinte: e switch(EXPRESSAO) { case VALOR1: COMANDOS_A case VALOR2: COMANDOS_B default: COMANDOS_C } O resultado da EXPRESSAO deve ser dos tipos inteiro ou caracter. De acordo com esse resultado, os case VALOR1 ou VALOR2 sero escolhidos. A partir daquele que for escolhido, os a comandos sero executados. No caso da expresso no retornar nenhum valor especicado nos a a a case, os comandos da clusula default sero executados. a a a Detalhes: os comandos ou blocos de comandos COMANDOS A, COMANDOS B e COMANDOS C no precisam de chaves; recomendada a utilizao do comando break ao nal de cada bloco de e ca comandos para evitar que outros blocos, fora da clusula escolhida sejam executados; a clusula a a default opcional. e

20

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

4.6

Estruturas de Repetio ca

Assim como as de deciso, as estruturas de repetio tambm so comuns na maioria das lina ca e a guagens de programao de alto n ca vel. Existem basicamente trs tipos dessas estruturas, while, e do-while e for, que sero apresentadas a seguir. a

4.6.1

Comando while

O comando while testa uma determinada condio e enquanto ela for verdadeira, o bloco de ca comandos repetido. sua sintaxe a seguinte: e e while (EXPRESSAO) { COMANDOS } A EXPRESSAO deve retornar um valor lgico e, com base nesse valor, COMANDOS so executados. o a

4.6.2

Comando do-while

O comando do while funciona de forma similar ao while. Entretanto, o teste da condio ca e feita ao nal do lao. Enquanto ela for verdadeira, o bloco de comandos repetido. sua sintaxe c e a seguinte: e do { COMANDOS } while (EXPRESSAO); Os COMANDOS so executados pelo menos uma vez. A EXPRESSAO avaliada e deve retornar a e um valor lgico e, com base nesse valor, o lao repetido. o c e

4.6.3

Comando for

O comando for chamado de lao contado, porque poss saber de antemo quantas vezes e c e vel a ele ser executado (na sua forma convencional). Na verdade, o comando for composto de trs a e e partes: a inicializao, a condio de trmino e o incremento ou decremento. Observe a sintaxe ca ca e do comando:

21

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

for (INICIALIZACAO ; CONDICAO ; INCREMENTO) { COMANDOS } Normalmente usa-se uma varivel de controle do lao. Essa varivel inicializada no campo a c a e INICIALIZACAO. A condio de trmino testada no campo CONDICAO e o incremento ou ` ca e e a varivel de controle feito no campo INCREMENTO. a e

4.6.4

Comandos de Desvio de Fluxo

Existem ainda em java, alguns comandos de desvio de uxo. Eles so usados geralmente em a laos para desviar o controle de uxo para fora do lao. Existem dois deles: continue e break. c c O comando continue, na sua forma sem rtulo, executa um desvio para o teste do lao. No o c caso dos laos com while, a EXPRESSAO avaliada novamente; no for, a varivel de controle c e a e incrementada e a condio reavaliada. ca Na forma rotulada necessrio especicar um label (qualquer nome seguido de :). Nesse e a caso, o desvio executado para o prximo comando aps o label. e o o Quanto ao comando break, conforme sugerido quando o comando case foi abordado, o desvio efetuado para fora do bloco onde o comando est.Na sua forma rotulada, o desvio feito para e a e onde o label est. a

4.7

Comentrios em Java a

Esta seo pode parecer dispensvel quando h tanto a ser visto a respeito da linguagem Java. ca a a Entretanto, notrio que um cdigo bem documentado pode ser muito util at para o prprio e o o e o programador. No caso da linguagem Java, o fato do cdigo estar bem comentado pode servir para gerar o automaticamente a prpria documentao da aplicao. Assim como a linguagem C, Java cono ca ca sidera como comentrio tudo o que aparece a partir dos caracteres /* at os caracteres */. a e Do mesmo modo, toda linha que se inicia com // tambm comentrio. e e a H tambm uma outra forma de comentar cdigo em java. Tudo o que aparece a partir dos a e o caracteres /** at os caracteres */, tambm comentrio, mas pode ser interpretado pelo e e e a 22

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

javadoc, um programa que gera documentao automaticamente. Sempre que esses caracteres ca aparecem antes da denio de classes, mtodos ou atributos, a documentao gerada em uma ca e ca e pgina html. Para acess-la, abra o arquivo index.html que est no diretrio onde se encontra a a a o seu arquivo fonte. Observe a documentao do exemplo da Seo 4.9 e, como exemplo, gere a documentao ca ca ca automtica. Para isto, use a seguinte sintaxe: a javadoc nomeArquivo.java Para mais informaes execute o programa javadoc sem parmetros. co a

4.8

Importando Classes Existentes

As vezes preciso aproveitar classes previamente existentes e assim fazer reutilizao de cdigo. e ca o Para fazer isto, utiliza-se a palavra reservada import seguida da classe que se quer importar. No decorrer do texto, exemplos disso ocorrero. a

4.9

Exemplo Geral

Nesta seo apresentado um programa exemplo que tenta abordar todos os tpicos tratados ca e o neste cap tulo. Obviamente, este no o melhor programa em Java para calcular o fatorial de a e dois n meros. Mas um bom exemplo para resumir tudo o que foi abordado neste cap u e tulo. Observe os seguintes detalhes: 1. Quanto ` documentao: antes da denio da classe ExemploGeral, no comeo da Figura a ca ca c 4.4, e do mtodo main esto os comentrios. Atente para os caracteres /** antes do in e a a cio e os caracteres */ ao nal dos comentrios. Todo o texto cercado por esses caracteres a aparecer na documentao gerada pelo javadoc. Veja a Seo 4.7, pgina 22 para mais a ca ca a detalhes. 2. No primeiro if que aparece na Figura 4.4 utilizado o operador condicional &. Note que e a utilizao do operador && poderia causar um bug. Ambas as condies devem ser ca co analisadas e devem ser verdadeiras para que o bloco de comandos do if seja executado. Mais informaes a esse respeito esto na Seo 4.4.2, pgina 19. co a ca a 23

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

/** * Classe de demonstracao. */ public class ExemploGeral { /** * Ha apenas esse metodo que calcula o fatorial de dois numeros */ public static void main(String[ ] args) { short n1, n2; long fatorial; n1 = 5; n2 = 105; fatorial = 1;

if ( n1 >= 0 & n1 < Integer.MAX_VALUE ) { switch(n1) { case 0: case 1: break; default: for (int i=1; i<=n1; i++) fatorial = fatorial * i; } System.out.println("Fatorial de " + n1 + " eh: " + fatorial); } else System.out.println("Nao existe fatorial de numero negativo!"); Figura 4.4: Programa que exemplica a maioria dos tpicos abordados neste cap o tulo. Continua na Figura 4.5.

e u 3. MAX VALUE um atributo da classe Integer. Isso pode gerar algumas d vidas: se existe um tipo int, porque preciso existir a classe Integer? Existe alguma relao entre o tipo e a e ca classe? A mesma resposta server `s duas perguntas: no! Na verdade, a classe Integer faz a a parte das classes padro do Java. Ela existe para facilitar o trabalho do programador. Por a exemplo, nesse caso era preciso saber qual o maior valor inteiro capaz de ser representado. ca o atributo MAX VALUE, continha essa informao.

24

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

if (!(n2 >= 0)) System.out.println("Nao existe fatorial de numero negativo!"); else { int j=n2; fatorial = 1; while (j > 0) { fatorial *= j; if (fatorial <= Integer.MAX_VALUE) { j--; continue; } else { System.out.println("Nao ha memoria para armazenar o numnero"); break; } } if (j == 0) System.out.println("Fatorial de " + n2 + " eh: " + fatorial); } } } Figura 4.5: Continuao do programa que exemplica a maioria dos tpicos abordados neste ca o cap tulo.

4. Na Figura 4.4, observe o comando break. Caso o valor de n1 seja zero ou um, sero a executados comandos at encontrar o comando break. Ao encontr-lo, feito um desvio e a e para fora do comando switch. Se o valor de n1 no for nenhum dos valores citados, ento a a a clusula default executada. No caso do comando continue na Figura 4.5, h um a e a desvio para fora do lao controlado pelo while. Com isso, ganha-se uma certa agilidade c no programa. Mais detalhes podem ser vistos na Seo 4.6.4, pgina 22. ca a 5. Ainda na Figura 4.4, observe que no prprio comando for h uma declarao de varivel o a ca a (int i). A declarao de variveis poss em qualquer parte de um programa Java. ca a e vel Ao semelhante ocorre na Figura 4.5, ao declarar a varivel j. Ressalta-se que, essas ca a 25

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

variveis tm escopo (validade) limitado ao bloco de comandos onde foram declaradas e a e no fazem parte dos atributos do objeto. a 6. Finalmente, note o parmetro passado para os mtodos println. E uma soma de objetos a e String com variveis inteiras. Pode parecer estranho, mas a classe String permite essa a operao. A soma de uma String com uma varivel inteira, resulta em uma String. ca a Mais detalhes sobre isso sero exemplicados no Cap a tulo 5, Seo 5.1.5. ca

26

CAP ITULO

Especicando Classes, Instanciando Objetos

Mame sempre disse que a vida como uma caixa de chocolates. a e Nunca se sabe o que voc vai encontrar l. e a Forrest Gump em Forrest Gump: o contador de estrias, 1994. o Neste cap tulo o foco a aplicao dos conceitos vistos no Cap e ca tulo 3. A idia mostrar e e como so especicadas as classes e como se instanciam os objetos. Lembrando que uma classe a uma especicao, enquanto um objeto a materializao dessa especicao na memria do e ca e ca ca o computador. Vale ressaltar que toda classe especicada em Java herda suas denies de uma classe chaco mada Object. Como so todas subclasses de Object, isso signica que alguns mtodos j esto a e a a implementados. Esse mtodos podem ser sobrecarregados para obter comportamentos mais e espe cos. Para tornar mais claro as aes para especicao de classes e instanciao de objetos ser co ca ca a usado uma aplicao exemplo. O objetivo desse exemplo criar a classe NumeroComplexo. ca e

27

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

5.1

Especicao da Classe ca

Para ilustrar como as classes so especicadas, ser utilizado o exemplo da classe de n meros a a u complexos. Como se sabe, um n mero complexo tem duas partes: uma parte real, e uma parte u imaginria. Matematicamente, um n mero complexo (A) representado da seguinte forma: a u e A = a + bi, onde i o chamado operador imaginrio e tem valor 1; a e b so valores reais. e a a A parte real de um n mero complexo dada por [A] = a, enquanto a parte imaginria u e a e dada por m[A] = b. De posse das informaes bsicas sobre n meros complexos, o prximo passo denir quais co a u o e os atributos dessa classe. Observe a seguir o in dessa especicao. cio ca public class NumeroComplexo { private double a; private double b; } Note que a classe NumeroComplexo p blica. Isto signica que essa especicao pode ser e u ca acessada por qualquer outra classe. Contudo, seus dois atributos a e b so privados, ou seja, s a o podem ser utilizados dentro da denio da classe. ca Uma d vida que poderia surgir se no necessrio representar a constante u e a e a 1. Em

termos de implementao isso no ser necessrio porque o fato de ser um n mero complexo j ca a a a u a a a implica na existncia da constante 1 e sabe-se que essa constante est sempre vinculada ` e componente imaginria. a

5.1.1

Mtodo Construtor e

O prximo passo especicar o que se chama de mtodo construtor (ou simplesmente conso e e e e e trutor) da classe. O construtor o mtodo que chamado sempre que se instancia um objeto dessa classe. Esse mtodo serve principalmente para inicializar alguns atributos da classe. Apee sar de no ser obrigatrio, boa prtica de programaao sempre ter pelo menos um construtor a o e a c da classe. Em razo do conceito de polimorsmo, poss existir mais de um construtor para a e vel a mesma classe. Voltando ao exemplo, existem pelo menos trs maneiras para se criar um objeto NumeroCome plexo: sem inicializ-lo com valor nenhum, inicializando-o apenas com a parte imaginria ou a a 28

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

inicializando-o com ambas as partes real e imaginria. Sendo assim, so necessrios trs consa a a e trutores. Observe o cdigo a seguir e perceba que os construtores no tm um tipo de objeto de o a e retorno. Isso porque, obviamente, o objeto retornado ser um NumeroComplexo. Note tambm a e que os construtores foram declarados como p blicos. Caso tenham sido declarados privados u (private) seu acesso s seria permitido dentro da prpria classe. o o public class NumeroComplexo { private double a; private double b; public NumeroComplexo() { a = b = 0; } public NumeroComplexo(double parteImaginaria) { a = 0; b = parteImaginaria; } public NumeroComplexo(double parteReal, double parteImaginaria) { a = parteReal; b = parteImaginaria; } }

5.1.2

Mtodo Destrutor e

De forma anloga, assim como h um mtodo construtor, tambm existe um destrutor. O mtodo a a e e e finalize pertence ` classe Object. Portanto, tambm herdado por todas as demais classes em a e e Java. Esse mtodo pode e recomenda-se ser sobrecarregado com aes que permitam a remoo e co ca do objeto da memria sem muitos efeitos colaterais. o Por exemplo, se um objeto que representa um arquivo removido da memria sem fechar e o o arquivo, pode ser que os dados que ainda no foram gravados sejam perdidos. Sendo assim, a muito importante a implementao do mtodo finalize, apesar de no ser implicitamente e ca e a chamado. A chamada a este mtodo feita pela mquina virtual quando no existir mais e e a a nenhuma referncia ao objeto. e 29

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

No prximo cap o tulo h um exemplo onde esse mtodo implementado. a e e

5.1.3

Operadores this e super

A palavra reservada this em Java representa o objeto atual, enquanto super representa a superclasse desse objeto. A palavra this muito util quando preciso referenciar o prprio objeto. e e o A t tulo de exemplo, considere a reescrita do construtor NumeroComplexo(double parteReal, double parteImaginaria) a seguir. public NumeroComplexo(double a, double b) { this.a = a; this.b = b; } Note que nesse novo exemplo de construtor, os parmetros possuem o mesmo identicador a dos atributos da classe. Mas como saber qual deles est sendo usado a cada momento? Sima ples. Na primeira atribuio, this.a=a, o atributo a de um objeto da classe NumeroComplexo ca referenciado pelo this - est recebendo o valor do parmetro a passado para o mtodo. a a e No decorrer do texto, outros exemplos usando os operadores this e super aparecero. a

5.1.4

Implementao de Mtodos ca e

No obrigatrio, mas os objetos costumam ter mtodos para prover formas de manipulao a e o e ca ou consulta. No exemplo da classe NumeroComplexo, importante que os atributos no sejam e a alterados por qualquer outra classe. Porm, ao mesmo tempo, interessante poder consultar e e esses valores. Verique o cdigo a seguir e atente para as restries impostas aos mtodos (os atributos e o co e construtores j vistos no sero repetidos). a a a public class NumeroComplexo { // atributos e construtores. public double real() { return this.a; } public double imaginaria() 30

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

{ return this.b; }

private void real(double a) { this.a = a; } private void imaginaria(double b) { this.b = b; } } Note que existem dois exemplos de polimorsmo similares. Os mtodos public double e real() e public double real(double a) so mtodos polimrcos, conforme discutido na a e o Seo 3.2, pgina 12. O mesmo conceito utilizado nos mtodos public double imaginaria() ca a e e e public double imaginaria(double b). Perceba que a diferena entre mtodos polimrcos c e o o tipo e a quantidade de parmetros que lhes passado e no o tipo de restrio imposta. Isto e a e a ca implica que imposs declarar mtodos polimrcos, com o mesmo n mero, mesmo tipo de e vel e o u parmetros, mas restries diferentes. a co No cdigo anterior, se houvesse um objeto A da classe NumeroComplexo sendo usado em outra o classe, seria poss usa-lo da forma A.real() para consultar sua parte real, mas seria um erro vel de compilao usa-lo da forma A.real(2) para alterar sua parte real. ca

5.1.5

Sobrecarga de Mtodos e

A classe Object, citada no in deste cap cio tulo, por denio a superclasse de todas as classes e ca denidas em um progrgama Java. Isto implica que alguns mtodos, embora no explicitamente e a denidos j esto implementados. Um desses mtodos o toString. a a e e O mtodo toString retorna uma representao do objeto como uma String composta do e ca nome da classe, seguida de @ e terminada com um cdigo hexadecimal do objeto. Ora, mas o as vezes necessrio a representao do objeto em uma String de forma mais natural. No e a ca caso do exemplo considerado, o ideal que um n mero complexo fosse apresentado da sua forma e u natural, 7.8 12.5i por exemplo. Veja, a seguir, como ocorre a sobrecarga do mtodo toString na classe NumeroComplexo e (os construtores, atributos e demais mtodos j vistos no sero repetidos, estaro inclusos na e a a a a respectiva linha de comentrio). a

31

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

public class NumeroComplexo { // atributos, construtores e demais metodos. public String toString() { String representacao; if ( this.b >= 0 ) representacao = this.a + "+" + this.b + "i"; else representacao = this.a + "" +this.b + "i"; return representacao; } } O mtodo toString deve manter a mesma assinatura do mtodo original na classe Object. e e Isto implica que o mtodo deve ser p blico, retornar um objeto String e no receber parmetros. e u a a Como faz parte da classe Object, a utilizao desse mtodo no precisa ser expl ca e a cita, ou seja, sempre que for necessria a converso de um objeto da classe NumeroComplexo para a classe a a String, isso ser feito implicitamente (sem a chamada do mtodo). a e

5.1.6

Mtodos estticos e a

Lembre-se que os mtodos so usados geralmente para manipular objetos. Portanto, na maioria e a das vezes para utilizar um mtodo preciso que exista antes um objeto com aquele mtodo. e e e Entretanto, as vezes necessria a utilizao de mtodos que no esto vinculados a nenhum e a ca e a a objeto. Da a necessidade de mtodos estticos ou de classe. Esse tipo de mtodo pertence ` e a e a classe, por isso no necessria nenhuma instanciao de objeto para usa-los. a e a ca Observe o trecho de cdigo a seguir para vericar como so declarados mtodos estticos. o a e a Nesse caso, o mtodo usado para somar dois NumeroComplexos. e e public static NumeroComplexo Soma(NumeroComplexo x, NumeroComplexo y) { return new NumeroComplexo(x.real() + y.real(), y.imaginaria() + y.imaginaria()); }

32

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

Note que a palavra chave static foi usada aps a restrio desse mtodo. A forma de o ca e utilizao desse mtodo explicada nas linhas de cdigo a seguir. ca e e o public static void main(String[ ] args) { NumeroComplexo c = new NumeroComplexo(1,-6); NumeroComplexo d = new NumeroComplexo(1,6); NumeroComplexo z; z = NumeroComplexo.Soma(c,d); System.out.println(" c = "+c+"\n d = "+d+"\n z = "+z); } Veja que o mtodo Soma, esttico, foi chamado a partir do nome da classe. Nesse mtodo e a e foi criado um novo objeto que ser retornado. Mais detalhes sobre mtodos estticos podem ser a e a vistos no exemplo do nal desse cap tulo. Quanto ` criaao de objetos, a prxima seo apresenta a c o ca os detalhes.

5.2

Instanciao de Objetos ca

Uma vez especicada a classe, seus objetos podem ser criados. Atente para a diferena entre a c declarao de um objeto e sua instanciao. No primeiro caso, informa-se ao compilador que um ca ca determinado identicador representar um objeto da classe especicada. No segundo caso, ao a ser instanciado o objeto passa a existir na memria (incluindo seus mtodos e atributos). o e

5.2.1

Operador new

A instanciao de um objeto feita com o operador new. A sintaxe simples, basta preceder o ca e e operador com o construtor da classe do objeto que se pretende criar. O retorno dessa operao ca o objeto na memria. Veja a seguir um exemplo dessa operao na classe NumeroComplexo e e o ca tente perceber a diferena entre declarar e instanciar. c

33

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

public class NumeroComplexo { // atributos, construtores e demais metodos ja vistos. public static void main(String[ ] args) { NumeroComplexo x; // declaracao do objeto x x = new NumeroComplexo(3,-5); // instanciacao do objeto x

System.out.println("X = "+x); // chamada implicita do metodo toString System.out.println("Im[X] = "+x.imaginaria()); } } Nesse cdigo, foi primeiro declarado um objeto x da classe NumeroComplexo e depois instancio ado. Note que o terceiro construtor, aquele que inicializa tanto a parte real quanto a imaginria, a foi o escolhido. Nada impede porm que ambas as aes sejam feitas em uma unica linha. Por exemplo, e co NumeroComplexo x = new NumeroComplexo();. Nesse caso, o primeiro construtor chamado. e

5.3

Exemplo Geral

Nessa seo, o exemplo nas guras 5.1, 5.2, 5.3, 5.4 e 5.5 ilustra a a combinao de todo o ca ca conte do explorado at agora neste cap u e tulo. Foi criada ainda uma outra classe chamada Main, mostrada na Figura 5.6, apenas para ilustrar a utilizao de objetos fora da sua classe original. ca

34

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

/** * Classe responsavel pelas operacoes com numeros complexos */ public class NumeroComplexo { /** * Atributos. * a: parte real de um numero complexo * b: parte imaginaria de um numero complexo */ private double a; private double b; /** Primeiro construtor. */ public NumeroComplexo() { a = b = 0; } /** Segundo construtor. */ public NumeroComplexo(double parteImaginaria) { a = 0; b = parteImaginaria; } /** Terceiro construtor. */ public NumeroComplexo(double a, double b) { this.a = a; this.b = b; } /** Retorna a parte real do objeto NumeroComplexo */ public double real() { return this.a; } /** Retorna a parte imaginaria do objeto NumeroComplexo */ public double imaginaria() { return this.b; } Figura 5.1: Classe NumeroComplexo, utilizada para exemplicar os tpicos deste cap o tulo.

35

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

/** * Atribui um valor a parte real do NumeroComplexo. * Metodo Privado! */ private void real(double a) { this.a = a; } /** * Atribui um valor a parte imaginaria do NumeroComplexo. * Metodo Privado! */ private void imaginaria(double b) { this.b = b; } /** Metodo para criar uma representacao desse objeto em String*/ public String toString() { String representacao; if ( this.b>=0 ) representacao = this.a + "+" + this.b + "i"; else representacao = this.a + ""+ this.b + "i"; return representacao; } /** * Calcula o conjugado de um NumeroComplexo. * Conjugado de a + bi = a - bi. */ public NumeroComplexo Conjugado() { return new NumeroComplexo(this.real(),-this.imaginaria()); } Figura 5.2: Continuao da epecicao da classe NumeroComplexo, na Figura 5.1. ca ca

36

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

/** Soma um NumeroComplexos a este e retorna um novo NumeroComplexo.*/ public NumeroComplexo Soma(NumeroComplexo z) { return new NumeroComplexo(this.real() + z.real(), this.imaginaria() + z.imaginaria()); } /** Subtrai um NumeroComplexos a este e retorna um novo NumeroComplexo.*/ public NumeroComplexo Subtrai(NumeroComplexo z) { return new NumeroComplexo(this.real() - z.real(), this.imaginaria() - z.imaginaria()); } /** * Multiplica um NumeroComplexos por este e retorna um novo * NumeroComplexo. * ( a + bi ) * ( c + di) = ac + bci + adi + bdi^2 = * = (ac - bd) + (ad + bc)i */ public NumeroComplexo Multiplica(NumeroComplexo z) { return new NumeroComplexo( this.real() * z.real() - this.imaginaria() * z.imaginaria(), this.real() * z.imaginaria() + this.imaginaria() * z.real()); } /** * Divide um NumeroComplexos por este e retorna um novo NumeroComplexo. * A divisao e feita multiplicando o numerador e o denominador pelo * conjugado do denominador. */ public NumeroComplexo Divide(NumeroComplexo z) { NumeroComplexo numerador, denominador; numerador = this.Multiplica(z.Conjugado()); denominador = z.Multiplica(z.Conjugado()); return new NumeroComplexo(numerador.real()/denominador.real(), numerador.imaginaria()/denominador.real()); } Figura 5.3: Continuao da especicao da classe NumeroComplexo, na Figura 5.2. ca ca 37

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

/** * Calcula o conjugado de um NumeroComplexo. * Metodo Estatico. */ public static NumeroComplexo Conjugado(NumeroComplexo z) { return new NumeroComplexo(z.real(),-z.imaginaria());} /** Soma dois NumeroComplexos e retorna um novo NumeroComplexo. * Metodo Estatico. */ public static NumeroComplexo Soma(NumeroComplexo x, NumeroComplexo y) { return new NumeroComplexo(x.real() + y.real(), y.imaginaria() + y.imaginaria()); } /** Subtrai um NumeroComplexos a este e retorna um novo NumeroComplexo. * Metodo estatico */ public static NumeroComplexo Subtrai(NumeroComplexo x, NumeroComplexo y) { return new NumeroComplexo(x.real() - y.real(), x.imaginaria() - y.imaginaria()); } /** * Multiplica dois NumeroComplexos e retorna um novo NumeroComplexo. * Metodo estatico */ public static NumeroComplexo Multiplica(NumeroComplexo x, NumeroComplexo y) { return new NumeroComplexo( x.real() * y.real() - x.imaginaria() * y.imaginaria(), x.real() * y.imaginaria() + x.imaginaria() * y.real()); }

Figura 5.4: Continuao da epecicao da classe NumeroComplexo, na Figura 5.3. ca ca

38

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

/** * Divide um NumeroComplexos por este e retorna um novo NumeroComplexo. * Metodo estatico */ public NumeroComplexo Divide(NumeroComplexo x, NumeroComplexo y) { NumeroComplexo numerador, denominador; numerador = NumeroComplexo.Multiplica(x,y.Conjugado()); denominador = NumeroComplexo.Multiplica(y,y.Conjugado()); return new NumeroComplexo(numerador.real()/denominador.real(), numerador.imaginaria()/denominador.real()); } } // fim da definicao da classe NumeroComplexo. Figura 5.5: Continuao da epecicao da classe NumeroComplexo, na Figura 5.4. ca ca

Uma vez denida a classe NumeroComplexo, poss dentro de outra classe, usar os objetos e vel da classe NumeroComplexo. Observe a classe Main no exemplo a seguir.

public class Main { public static void main(String[ ] args) { NumeroComplexo x = new NumeroComplexo(1,-6); NumeroComplexo y = new NumeroComplexo(1,6); // Chamada ao metodo Soma estatico NumeroComplexo z = NumeroComplexo.Soma(x,y); // Observe a utilizacao implicita do metodo toString System.out.println("X = "+x); System.out.println("Y = "+y); System.out.println("Conjugado de X ="+ x.Conjugado()); System.out.println("X+Y = "+x.Soma(y)); System.out.println("X/Y = "+ NumeroComplexo.Divide(z,y)); } } Figura 5.6: Classe Main, que utiliza a classe NumeroComplexo.

39

CAP ITULO

Tratamento de Exceoes c

Sem dor, sem sacrif cio, no ter a amos nada. Tyler Durden em O Clube da Luta, 1999. Tudo parece estar indo bem com seu programa quando, de repente, o usurio digita um valor a que o programa no esperava ou, ao ler o disco r a gido h uma pane. Quem j no passou por a a a uma situao como essas ou situaes semelhantes? ca co Essas so as chamadas excees. Em outras palavras, so eventos que ocorrem durante a co a a execuo de um programa e desviam o uxo normal de instrues. Parodiando O. Bilac nos ca co versos do in deste cap cio tulo: ora, questionais se esses eventos no poderiam ser tratados pelo a prprio sistema operacional. Eu vos direi no entanto que se seu prprio programa j cuidar desses o o a eventos inesperados o sistema operacional car menos sobrecarregado e, com isso, continuar a a suas tarefas sem muitas interrupes. co

40

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

Esse tratamento podedria ser feito incluindo uma enorme quantidade de ifs no programa. Entretanto, Java oferece formas de tratar excees e evitar assim a sobrecarga do sistema. co

6.1

Clusulas try-catch a

Sempre que um determinado bloco de programa em Java for suspeito, i.e. se houver uma grande probabilidade de ocorrer uma exceo em um determinado trecho de cdigo, poss criar um ca o e vel tratamento espec co para tal exceo. ca Para isso, utilizam-se as clusulas try-catch. Observe o trecho a seguir. a float[ ] vetor = new float[5]; float x; int y, z; z = 13; y = 5; try{ z = (z - (y + 1)) * 2 / 7; x = vetor[y / (z - 2)]; } catch (ArithmeticException exc1){ System.err.println("Divisao por zero"); exc1.printStackTrace(); } catch (ArrayIndexOutOfBoundsException exc2) { System.err.println("Indice do arranjo fora dos limites!"); exc2.printStackTrace(); } Existem duas poss veis causas de excees neste trecho. A primeira delas em relao ` co e ca a operao y/(z-2). Perceba que se o valor de z for 2, h uma diviso de y por zero, o que em ca a a computao seria inconceb 1 . A outra em relao ao ca vel e ca ndice do arranjo vetor. Se o valor desse ndice for menor que zero ou maior que o limite do arranjo, isso tambm pode causar uma e exceo. ca Portanto, o trecho de programa suspeito colocado no bloco try{ ... }, enquanto o trae tamento de poss veis excees colocado no bloco catch( ... ){ ... }. O ideal que, para co e e
1

Em teoria a diviso por zero resultaria em innito. Esse valor imposs de representar computacionalmente. a e vel

41

CENAPAD-SP cada tipo de exceo, haja um catch espec ca co.

Introduo ` Linguagem de Programao Java ca a ca

As excees so lanadas at haver algum catch espec co a c e co para trat-las. Por ser objeto de a uma classe. as excees tambm tm uma hierarquia. No maior n dessa hierarquia est a co e e vel a classe Exception. Portanto, na d vida coloque um objeto da classe Exception como parmetro u a para o catch. Quando lanadas, as excees podem ser tratadas localmente. No havendo um tratamento c co a local, a exceo lanada para o objeto que invocou o mtodo do objeto local e assim sucessica e c e vamente. No existindo nenhum objeto que trate a exceo, ela lanada pela mquina virtual a ca e c a e o programa encerrado. Sendo assim, quanto mais prximo da ocorrncia o tratamento da o e e exceo, menor a possibilidade de pane da aplicao. ca ca

6.2

Clusulas throws e throw a

Normalmente, Java no exige que trechos suspeitos de programas sejam colocados em clusulas a a try-catch. Entretanto, h algumas classes que exigem que seus mtodos tenham tratamento a e em caso de exceo. Na compilao, essa exigncia cobrada. ca ca e e E poss especicar que um determinado mtodo pode lanar uma exceo. Nesses mtodos vel e c ca e existe a clusula throws (em portugus lanar). Voltando ao exemplo do n mero complexo, a e c u no cap tulo anterior, observe a especicao do mtodo Divide a seguir. ca e public NumeroComplexo Divide(NumeroComplexo z) throws ArithmeticException { NumeroComplexo numerador, denominador; numerador = this.Multiplica(z.Conjugado()); denominador = z.Multiplica(z.Conjugado()); if (denominador.real() == 0) throw new AritmeticException(); return new NumeroComplexo(numerador.real()/denominador.real(), numerador.imaginaria()/denominador.real()); } Perceba que, caso a parte real do denominador seja igual a zero, haver uma diviso por zero. a a Nesse caso, deve-se criar e lanar uma exceo. Isso feito com a clusula throw. No caso do c ca e a 42

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

exemplo, foi criado um objeto da classe ArithmeticException e em seguida, lanado para quem c chamou o mtodo. e

6.3

Classe Exception

Conforme j mencionado, a classe Exception a superclasse de todas aquelas que implementam a e excees. Alguns mtodos dessa classe so passados via herana `s demais. Sendo assim, util co e a c a e conhecer alguns mtodos dessa classe. Os mais importantes so: e a os construtores Exception() e Exception(String mensagem): o segundo construtor permite incluir uma mensagem espec ca. String getMessage() retorna a mensagem do objeto (inclu pelo construtor). da void printStackTrace() imprime a pilha de ativao de mtodos at o ponto onde houve ca e e o erro. O mtodo printStackTrace() util especialmente na fase de testes. Esse mtodo imprime e e e em que ponto do cdigo fonte o erro aconteceu e, com isso, ca mais fcil encontrar o problema. o a

43

CAP ITULO

Entrada e Sa da

Vamos nos concentrar no problema, pessoal. No deixemos as coisas piores tentando adivinhar. a Gene Kranz em Apollo 13 , 1995. As aes de entrada e sa (E/S) de programas so muito importantes. Elas permitem que co da a o mesmo programa atue como uma funo onde, para diferentes valores de entrada, diferentes ca resultados so obtidos. Este cap a tulo concentra-se nas principais classes que implementam E/S. Em particular, E/S dos dispositivos padro (teclado, monitor) e arquivos (discos). a As classes que lidam com entrada e sa esto em um pacote chamado java.io que deve da a ser importado no in de cada programa. cio

7.1

Streams ou Fluxos

Fluxos ou Streams em ingls funcionam como dutos onde se injetam dados de um lado e e recuperam-se no outro. Existem dois tipos bsicos de Stream: de caracteres ou de bytes. O a primeiro tipo l e escreve caracteres de 16 bits, enquanto o segundo transfere dados de 8 bits. e Ambos sero vistos nas sees a seguir. a co

44

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

7.2

Fluxos de Caracteres

As superclasse dos uxos de caracteres so a classe Reader, para a leitura, e a classe Writer para a escrita. A classe Reader uma classe abstrata, ou seja, ela apenas especica mtodos bsicos e e a que as suas subclasses devem implementar. Algumas classes que herdam da classe Reader esto a na Tabela 7.1 a seguir. Os mtodos dessa classe esto na Tabela 7.2. e a Subclasse BufferedReader Descrio ca L textos de um uxo de entrada de caracteres, utilizando um e buer interno. CharArrayReader InputStreamReader PipedReader Implementa um buer de caracteres. L bytes e os decodica em caracteres. e Implementa um pipe de leitura (conexo entre entradas e a sa das). Tabela 7.1: Subclasses da classe Reader e suas descries. co

Mtodos da classe Reader e void close() int read() int read(char[ ] cbuf)

Descrio ca Encerra um uxo. L um unico caractere. e L caracteres e os armazena em cbuf e

int read(char[ ] cbuf, int off, int len) L no mximo len caracteres e os armae a zena em cbuf, a partir da posio off. ca boolean ready() Informa se o uxo est pronto para leia tura. long skip(long n) Bloqueia at que n caracteres estejam e dispon veis. Tabela 7.2: Mtodos da classe Reader e herdados por suas subclasses. e

H ainda a classe FileReader, subclasse da InputStreamReader. Essa classe muito util na a e manipulao de arquivos de caracteres. ca 45

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

Como so subclasses da classe Reader, os mtodos mostrados na Tabela 7.2 devem ser a e implementados por elas. Todos os mtodos desta tabela lanam a exceo de E/S, chamada e c ca IOException. Portanto, ao usa-los importante coloc-los entre clusulas try-catch. e a a De maneira anloga, as subclasses da classe Writer esto na Tabela 7.3 a seguir. a a Subclasse BufferedWriter Descrio ca Escreve um uxo de caracteres em um buer interno que posteriormente ser descarregado na sa especicada.. a da CharArrayWriter OutputStreamReader PipedWriter Implementa um buer de sa caracteres. da Os caracteres escritos so convertidos em bytes. a Implementa um pipe de escrita (conexo entre entradas e sa a das). Tabela 7.3: Subclasses da classe Writer e suas descries. co

A classe FileWriter, subclasse da OutputStreamReader muito util na manipulao de e ca arquivos de caracteres, da mesma maneira que sua classe anloga, FileReader. Observe na a Tabela 7.4 a seguir alguns mtodos comuns implementados pelas subclasses da classe Writer. e Mtodos da classe Writer e close() flush() Descrio ca Encerra um uxo, descarregando-o primeiro. Descarrega um uxo de caracteres (gravao ca f sica). write(int c) write(char[ ] cbuf) Grava um unico caractere. Escreve os caracteres armazenados em cbuf

write(char[ ] cbuf, int off, int len) Escreve no mximo len caracteres armazenaa dos em cbuf, a partir da posio off. ca write(String cbuf) write(String cbuf, int off, int len) Escreve os caracteres armazenados em cbuf Escreve no mximo len caracteres armazenaa dos em cbuf, a partir da posio off. ca Tabela 7.4: Mtodos da classe Writer e herdados por suas subclasses. e

Assim como seus equivalentes na classe Reader, os mtodos da Tabela 7.4 tambm lanam a e e c 46

CENAPAD-SP exceo IOException. ca

Introduo ` Linguagem de Programao Java ca a ca

7.2.1

Exemplo de Fluxo de Caracteres

Nesta seo, mostra-se um exemplo de aplicao que utiliza algumas das classes que tratam do ca ca uxo de caracteres. Observe o programa ilustrado nas guras 7.1, 7.2, 7.3 e 7.4 a seguir e atente para os seguintes detalhes. 1. Na primeira linha, import java.io.*; importa as classes que implementam E/S. 2. Na denio da classe NumeraLinhas, a palavra reservada extends informa que essa classe ca herda a especicao da classe FileReader. ca 3. Na denio do construtor da classe NumeraLinhas, a palavra reservada throws especica ca que esse mtodo pode lanar duas excees, FileNotFoundException e IOException. Nos e c co demais mtodos ocorre algo semelhante. e 4. Na implementao do construtor, o primeiro mtodo chamado o super. Na verdade, isso ca e e uma chamada ao construtor da superclasse FileReader. Sempre que for necessria a e a chamada do mtodo construtor da superclasse, ele deve ser o primeiro a ser chamado. e 5. A instanciao do objeto entradaPadrao no mtodo construtor envolve o encapsulamento ca e de dois objetos. Perceba que o objeto System.in - que especica a entrada padro do a sistema - foi encapsulado em um objeto da classe InputStreamReader que, por sua vez, foi encapsulado em um objeto da classe BufferedReader. Esse tipo de ao permite ca acrescentar funcionalidades aos objetos instanciados. Porm, deve ser vericado quais e objetos so aceitos como parmetros pelo mtodo construtor. Estratgia similar ocorre na a a e e ultima linha do mtodo construtor. e 6. No mtodo fechaArquivo feita uma chamada ao mtodo close da superclasse, indicada e e e pelo comando super.close(). 7. No mtodo imprimeComNumeros foi usada a classe StringBuffer. Essa classe adiciona e algumas funcionalidades ` classe String. a

47

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

import java.io.*;

// importando biblioteca de classes de entrada e saida

/** * Classe NumeraLinhas, gera um arquivo com as linhas numeradas. */ public class NumeraLinhas extends FileReader { private String nomeArquivo; private BufferedWriter arquivoSaida; /** * Construtor da classe. Pode lancar as excecoes * FileNotFoundException e IOException */ public NumeraLinhas(String nomeArquivoEntrada, String nomeArquivoSaida) throws FileNotFoundException,IOException { super(nomeArquivoEntrada); this.nomeArquivo = nomeArquivoEntrada; char c=n; File arqSaida = new File(nomeArquivoSaida); BufferedReader entradaPadrao = new BufferedReader( new InputStreamReader(System.in) ); while ( (c==n || c ==N) & arqSaida.exists() & arqSaida.canWrite() & arqSaida.isFile() ) { System.out.print("Arquivo "+arqSaida.getCanonicalPath()); System.out.println("existe, ou e diretorio ou nao pode ser escrito!"); System.out.print("Deseja tentar sobrescreve-lo [s/n]?"); c = (char) entradaPadrao.read(); if (c == s || c ==S) break; System.out.print("\nDigite o nome de um novo arquivo:"); entradaPadrao.readLine(); arqSaida = new File(entradaPadrao.readLine()); System.out.println(); } this.arquivoSaida = new BufferedWriter(new FileWriter(arqSaida)); } Figura 7.1: Declarao de classe e do respectivo construtor de um programa que demonstra o ca uso de algumas classes que tratam o uxo de caracteres. 48

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

/** * Metodo para fechar o arquivo de entrada. Pode lancar IOException */ public void fechaArquivo() throws IOException { super.close(); } /** * Metodo para escrever linha a linha no arquivo de saida. * Pode lancar a excecao IOException. */ private void escreve(String linha) throws IOException { arquivoSaida.write(linha,0,linha.length()); arquivoSaida.newLine(); arquivoSaida.flush(); } /** * Metodo para compor as linhas que serao escritas no * arquivo de saida. Pode lancar a excecao IOException. */ public void imprimeComNumeros() throws IOException { BufferedReader buf = new BufferedReader(this); StringBuffer linha = new StringBuffer(); int i=0; char c = (char) buf.read(); while ( c != (char) -1 ) { i = i+1; if (c != \n) { linha.insert(0,"linha "+i+" :"+c+buf.readLine()); this.escreve(linha.toString()); } else this.escreve(" "); c = (char) buf.read(); linha.delete(0,linha.length()); } arquivoSaida.close(); } Figura 7.2: Declarao dos mtodos da classe NumeraLinhas. ca e 49

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

8. O mtodo finalize, na Figura 7.4, usado implicitamente quando um objeto no e e a e mais referenciado. Observe que, no prprio mtodo a exceo IOException capturada, o e ca e caso hajam problemas de E/S nos trs mtodos chamados dentro do bloco try. Ainda e e considerando a hiptese de exceo, uma mensagem ser mostrada na tela, bem como a o ca a pilha de chamadas de mtodos. e

/** Metodo de finalizacao de objeto */ protected void finalize() { try{ this.arquivoSaida.flush(); this.arquivoSaida.close(); this.fechaArquivo(); } catch (IOException e){ System.err.println("Problemas de E/S, na finalizacao do objeto"); e.printStackTrace(); } } Figura 7.3: Mtodo de nalizao da da classe NumeraLinhas. e ca

9. A captura de excees tambm feita no mtodo main. Nesse caso, a ordem de captura co e e e deve ser primeiro a exceo FileNotFoundException e em seguida a IOException. Isso ca e justicado pelo fato da primeira ser subclasse da segunda exceo. Ora, se fosse a ordem ca inversa, a segunda exceo, mais espec ca ca, jamais seria capturada.

50

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

public static void main(String[ ] args) { NumeraLinhas arqNumerado; String nomeArquivoEntrada = null; String nomeArquivoSaida = null; BufferedReader entradaPadrao; entradaPadrao = new BufferedReader(new InputStreamReader(System.in) ); try{ switch(args.length) { case 0: // Se nenhum parametro foi passado. System.out.print("Digite um nome para o arquivo de entrada:"); nomeArquivoEntrada = entradaPadrao.readLine(); case 1: // Se apenas um parametro foi passado. System.out.print("Digite um nome para o arquivo de Saida:"); nomeArquivoSaida = entradaPadrao.readLine(); if (args.length == 0) break; nomeArquivoEntrada = args[0]; break; default: // Se ambos os parametros foram passados. nomeArquivoEntrada = args[0]; nomeArquivoSaida = args[1]; } arqNumerado = new NumeraLinhas(nomeArquivoEntrada,nomeArquivoSaida); arqNumerado.imprimeComNumeros(); arqNumerado.fechaArquivo(); }catch (FileNotFoundException exc1) { System.err.println("Arquivo nao encontrado"); exc1.printStackTrace(); }catch (IOException exc2) { System.err.println("Problemas de E/S!"); exc2.printStackTrace(); } } } Figura 7.4: Mtodo main da classe NumeraLinhas. e

51

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

7.3

Fluxo de Bytes

No caso de arquivos de bytes (8-bits) o recomendvel o uso dos uxos de bytes. As duas a e principais classes - abstratas - para essa tarefa so InputStream e OutputStream. a As principais subclasses da InputStream esto listadas na Tabela 7.5 a seguir. a Subclasse FileInputStream ByteArrayInputStream ObjectInputStream SequenceInputStream Descrio ca Obtm bytes de um arquivo. e Contm um buer interno que permite ler o uxo de bytes. e Desserializa um objeto que est em um arquivo. a Obtm bytes de dois ou mais uxos de entrada (um aps o e o outro). Tabela 7.5: Subclasses da classe InputStream e suas descries. co

Os mtodos implementados pelas subclasses da InputStream esto listadas na Tabela 7.6 a e a seguir. Note que so bem parecidos com os da classe Reader, com exceo mtodo available. a ca e Mtodos da classe InputStream e int available() close() read() read(byte[ ] b) Descrio ca Retorna o n mero de bytes a serem lidos. u Encerra um uxo de entrada. L o prximo byte. e o L os bytes e os armazena em b. e

read(byte[ ] cbuf, int off, int len) L no mximo len caracteres e os armazena e a em cbuf, a partir da posio off. ca skip(int n) Passa por n bytes de dados.

Tabela 7.6: Mtodos da classe InputStream e herdados por suas subclasses. e

Analogamente, a classe OutputStream possui as seguintes subclasses principais, listadas na Tabela 7.7. Os principais mtodos da classe OutputStream esto listados na Tabela 7.8 a seguir. Todos e a os mtodos da Tabela 7.8 lanam a IOException. e c 52

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

Subclasse FileOutputStream ByteArrayOutputStream

Descrio ca Grava bytes em um arquivo. Contm um buer interno que permite gravar o uxo de e bytes.

ObjectOutputStream

Desserializa um objeto e o grava em um arquivo.

Tabela 7.7: Subclasses da classe OutputStream e suas descries. co

Mtodos da classe OutputStream e close() write(byte[ ] b)

Descrio ca Encerra um uxo de escrita. Escreve os bytes armazenados em b.

write(byte[ ] cbuf, int off, int len) Escreve no mximo len caracteres e os ara mazena em cbuf, a partir da posio off. ca write(int b) Escreve o byte n.

Tabela 7.8: Mtodos da classe OutputStream e herdados por suas subclasses. e

7.3.1

Exemplo de Fluxo de Bytes

Para exemplicar a utilizao do uxo de bytes foi desenvolvida uma aplicao (dividida em duas ca ca classes) que utiliza a classe NumeroComplexo, descrita no Cap tulo 5. O objetivo dessa aplicao salvar e ler objetos da classe NumeroComplexo em um arquivo. ca e As classes utilizadas foram ObjectOutputStream e ObjectInputStream. Observe o cdigo nas o guras 7.5 e 7.6 e atente para os seguintes detalhes. 1. A classe NumeroComplexo deve informar que implementa a interface Serializable. Isso importante para que os objetos dessa classe sejam gravados em arquivos. A interface e Serializable no possui mtodos que devem ser implementados. A informao sobre sua a e ca implementao apenas pro-forma. ca e 2. O objeto arquivoSaida da classe ObjectOutputStream. Apesar disso esse objeto e e formado a partir do encapsulamento de um objeto da classe FileOutputStream. 3. O mtodo writeObject serializa e grava um objeto qualquer na sa especicada. Esse e da 53

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

import java.io.*; class ArquivoEscritaNumeroComplexo { public static void main(String[ ] args) { ObjectOutputStream arquivoSaida; NumeroComplexo x = new NumeroComplexo(10,11); NumeroComplexo y = new NumeroComplexo(7,13); try{ arquivoSaida = new ObjectOutputStream( new FileOutputStream("numComplex.tmp")); arquivoSaida.writeObject(x); arquivoSaida.writeObject(y); arquivoSaida.writeObject(x.Soma(y)); arquivoSaida.close(); } catch (IOException e){ e.printStackTrace(); } } } Figura 7.5: Escrita de um objeto da classe NumeroComplexo em um arquivo.

mtodo pode lanar IOException. e c Quanto ao arquivo da Figura 7.6, observe os detalhes a seguir. 1. A criao do objeto arquivoEntrada envolve o encapsulamento de um objeto FileInputca Stream. 2. O mtodo readObject l e desserializa um objeto qualquer na entrada especicada. E e e necessria uma converso de tipos (cast) para que a mquina virtual saiba qual o objeto a a a lido e desserializado. Esse mtodo pode lanar ClassNotFoundException ou IOException. e c

54

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

import java.io.*; class ArquivoLeituraNumeroComplexo { public static void main(String[ ] args) { ObjectInputStream arquivoEntrada; NumeroComplexo a,b,c; try{ arquivoEntrada = new ObjectInputStream( new FileInputStream("numComplex.tmp")); a = (NumeroComplexo) arquivoEntrada.readObject(); b = (NumeroComplexo) arquivoEntrada.readObject(); c = (NumeroComplexo) arquivoEntrada.readObject(); arquivoEntrada.close(); System.out.println("a = "+a); System.out.println("b = "+b); System.out.println("soma = "+c+" retificacao: "+a.Soma(b)); } catch (IOException e){ e.printStackTrace(); } catch (ClassNotFoundException e2){ e2.printStackTrace(); } } } Figura 7.6: Leitura de um objeto da classe NumeroComplexo de um arquivo.

55

CAP ITULO

Interfaces Grcas a

Do outro lado da tela, tudo parece muito fcil a Flynn em Tron, 1982. Uma das facilidades da linguagem Java o conjunto de bibliotecas para criao de intere ca faces grcas (GUI -Graphical User Interfaces). Nas verses anteriores, a API existente era a o a Abstract Window Toolkit (AWT). A partir do Java 1.1 foi incorporada a Swing API, uma biblioteca para interfacees grcas leves. A Swing otimizou algumas classes de modo que sejam a rapidamente renderizadas pelo sistema operacional, da a determinao de leves. ca Neste cap tulo, as principais classes da Swing API so apresentadas. No nal, um exemplo a e apresentado para consolidar o conhecimento sobre o uso dessas classes.

8.1

Janelas, o bsico a

O sistema de janelas o mais usado hoje na maioria das interfaces grcas. Sendo assim, o e a primeiro exemplo o cdigo para criao de uma janela, na Figura 8.1. Atente para os seguintes e o ca detalhes: 1. E necessria a importao da Swing API. a ca 56

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

2. A classe JFrame responsvel pela criao do objeto janela. e a ca 3. A classe JLabel responsvel pela criao do objeto rtulo, uma string constante que e a ca o pode ser inclusa na janela. 4. O mtodo getContentPane(), da classe JFrame, retorna um Container que representa o e conte do da janela. Nele, incluso o objeto label, com o mtodo add(Component c). u e e 5. O mtodo setDefaultCloseOperation(int op) especica qual a operao a ser executada e ca quando se fecha a janela (clicando no X no canto superior direito da prpria). As operaes o co poss veis so: a (a) WindowConstants.DO NOTHING ON CLOSE: nada feito. O programa lidar com esse e a evento. (b) WindowConstants.HIDE ON CLOSE: esconde a janela e lana o evento de fechamento c de janela. c (c) WindowConstants.DISPOSE ON CLOSE: esconde, remove a janela e lana o evento de fechamento de janela. (d) JFrame.EXIT ON CLOSE: encerra a aplicao. ca 6. O mtodo pack() , na verdade, denido na classe Window, superclasse da JFrame. Esse e e mtodo util para ajustar o tamanho da janela e seu uso quase mandatrio. e e e o 7. O mtodo setLocation(int x, int y) denido na classe Component, tambm supere e e classe da JFrame. Esse mtodo util para posicionar a janela nas coordenadas x e y. Sendo e e que a origem (0, 0) no canto superior esquerdo. e 8. O mtodo setSize(int a, int l) tambm denido na classe Component e dene o e e e tamanho da janela em pixels (altura e largura). 9. O mtodo setVisible(boolean b), tambm denido na classe Component, torna a janela e e vis (true) ou invis (false). vel vel

57

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

import javax.swing.*; public class JanelaBasico { public static void main(String[ ] args) { JFrame janela = new JFrame("Janela Basica"); final JLabel label = new JLabel("Ola Mundo!"); janela.getContentPane().add(label); janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); janela.pack(); janela.setLocation(120,120); janela.setSize(200,100); janela.setVisible(true); } } Figura 8.1: Programa que ilustra a criao de uma janela. ca

8.2

Look and Feel

A aparncia e como o programa reage a determinados eventos um conceito chamado look-ande e feel . Por ser multiplataforma, a mquina virtual Java pode simular um determinado tipo de a aparncia, mesmo que seja outro tipo de sistema operacional. e Observe a Figura 8.2 a seguir com o cdigo da Figura 8.1 levemente modicado. o

8.3

Tratamento de Eventos

Sempre que o usurio interage com a aplicao, um evento ocorre. Essa interao pode ser feita a ca ca com o teclado, mouse ou qualquer combinao desses dispositivo de entrada. Para capturar e ca tratar eventos necessrio denir uma classe escutadora de eventos (Listener em ingls). e a e As classes Listener devem implementar as interfaces espec cas para os eventos que querem capturar. A Tabela 8.1 a seguir mostra os principais tipos de interfaces Listeners e os eventos t picos. Para ilustrar os Listener , o exemplo na Figura 8.3 a seguir implementa uma interface 58

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

import javax.swing.*; public class JanelaBasico2 { public static void main(String[ ] args) { try{ UIManager.setLookAndFeel( "com.sun.java.swing.plaf.gtk.GTKLookAndFeel"); } catch (Exception e){ System.out.println("Erro no Look and feel!"); } JFrame janela = new JFrame("Janela Basica"); final JLabel label = new JLabel("Ola Mundo!"); janela.getContentPane().add(label); janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); janela.pack(); janela.setLocation(120,120); janela.setSize(200,100); janela.setVisible(true); } } Figura 8.2: Programa que ilustra a criao de uma janela. ca

ActionListener que vai capturar o evento do clique de um boto. Na ocorrncia desse evento, a e a mensagem Fui Clicado ser colocada no prprio boto. Note a utilizao das APIs Swing e a o a ca java.awt.event.*. Note que no construtor da classe, especicado como parmetro o boto cujo texto ser e a a a alterado quando o evento de clique ocorrer. O mtodo actionPerformed deve ser implementado e da mesma forma que est denido. Todas os comandos contidos nesse mtodo sero executados a e a na ocorrncia do evento. e Na Figura 8.4 est a implementao da janela que contm o boto. O programa uma a ca e a e variao do programa da Figura 8.1. ca

59

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

Interfaces Listener ActionListener WindowListener MouseListener MouseMotionListener ComponentListener FocusListener ListSelectionListener

Evento T pico Clique em um boto da janela ou pressionar enter no teclado. a Fecha, minimiza, maximiza uma janela. Clique em um boto do mouse sobre um componente. a Movimenta o mouse sobre um componente. Componente torna-se vis vel. Componente pega o foco do teclado. Altera a seleo em uma lista. ca

Tabela 8.1: Tipos de Listeners e seus respectivos eventos t picos.

import java.awt.event.*; import javax.swing.*; public class EventoBotao implements ActionListener { public JButton botao; int i; public EventoBotao(JButton botao, int i) { this.botao = botao; this.i=i; } public void actionPerformed(ActionEvent e) { if ( 0 == i++ ) botao.setText("Fui Clicado!"); else botao.setText("Fui Clicado "+i+" vezes"); } } Figura 8.3: Denio da classe EventoBotao que vai capturar o evento do clique em um boto. ca a

8.4

Gerenciadores de Layout

Os gerenciadores de layout so objetos que, como o prprio nome arma, permitem uma orgaa o nizao dos objetos na janela. Existem cinco principais gerenciadores. So eles: ca a 60

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

import javax.swing.*; import java.awt.*; public class Botao { public static void main(String[] args) { JFrame janela = new JFrame("Janela Basica"); JButton botao = new JButton("Me clique!"); botao.addActionListener(new EventoBotao(botao)); janela.getContentPane().add(botao); janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); janela.pack(); janela.setLocation(120,120); janela.setSize(200,100); janela.setVisible(true); } } Figura 8.4: Programa que implementa uma janela que contm apenas um boto. os eventos so e a a capturados na classe EventoBotao, na Figura 8.3.

BorderLayout: os objetos so colocados ao longo das bordas. Isto signica que existem a basicamente 5 posies a preencher: topo de pgina (BorderLayout.PAGE START), m da co a pgina (BorderLayout.PAGE END), lateral esquerda (BorderLayout.LINE START), centro a (BorderLayout.CENTER) e lateral direita (BorderLayout.LINE END). BoxLayout: os objetos so colocados em uma unica linha ou coluna. a FlowLayout: os objetos so colocados em uma unica linha. Caso uma linha no seja a a suciente para colocar todos os objetos, eles so colocados em outra. a GridLayout: os objetos so colocados em linhas e colunas previamente denidas. Os a objetos so apresentados em tamanhos iguais. a GridBagLayout: uma variao do GridLayout. Neste caso, poss especicar o tamae ca e vel nho de cada clula. e 61

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

Observe o exemplo de BorderLayout na Figura 8.5 a seguir.

import javax.swing.*; import java.awt.*; public class BorderLayoutEx { public static void main(String[] args) { JFrame janela = new JFrame("Janela Basica"); JButton botao1 = new JButton("Me clique!"); JButton botao2 = new JButton("Me clique!"); JButton botao3 = new JButton("Me clique!"); JLabel label1 = new JLabel("Isso e um teste"); JLabel label2 = new JLabel("Isso e outro teste"); botao1.addActionListener(new EventoBotao(botao1,0)); botao2.addActionListener(new EventoBotao(botao2,0)); botao3.addActionListener(new EventoBotao(botao3,0)); janela.getContentPane().add(label1, janela.getContentPane().add(botao1, janela.getContentPane().add(botao2, janela.getContentPane().add(botao3, janela.getContentPane().add(label2, BorderLayout.PAGE_START); BorderLayout.LINE_START); BorderLayout.CENTER); BorderLayout.LINE_END); BorderLayout.PAGE_END);

janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); janela.pack(); janela.setLocation(120,120); janela.setSize(200,100); janela.setVisible(true); } } Figura 8.5: Exemplo de BorderLayout.

No exemplo de BoxLayout na Figura 8.6 a seguir, perceba que preciso estabelecer prie meiro em que sentido os objetos sero colocados: linha (BoxrLayout.LINE AXIS) ou coluna a (BoxrLayout.PAGE AXIS). Note que o layout foi denido em um objeto da classe JPanel que em seguida ser adicionado ` janela. a a

62

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

import javax.swing.*; import java.awt.*; public class BoxLayoutEx { public static void main(String[] args) { JFrame janela = new JFrame("Janela Basica"); JButton botao1 = new JButton("Me clique!"); JButton botao2 = new JButton("Me clique!"); JButton botao3 = new JButton("Me clique!"); JLabel label1 = new JLabel("Isso e um teste"); JLabel label2 = new JLabel("Isso e outro teste"); JPanel panel = new JPanel(); botao1.addActionListener(new EventoBotao(botao1,0)); botao2.addActionListener(new EventoBotao(botao2,0)); botao3.addActionListener(new EventoBotao(botao3,0)); panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); panel.add(label1); panel.add(botao1); panel.add(botao2); panel.add(botao3); panel.add(label2); janela.getContentPane().add(panel); janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); janela.pack(); janela.setLocation(120,120); janela.setSize(120,150); janela.setVisible(true); } } Figura 8.6: Exemplo de BoxLayout

No caso do FlowLayout na Figura 8.7 a seguir, preciso especicar um alinhamento que pode e ser FlowLayout.LEADING, FlowLayout.CENTER ou FlowLayout.TRAILING (respectivamente alinhado ` esquerda, centralizado ou alinhado ` direita). O tamanho dos objetos no sofre alterao a a a ca e o alinhamento mantido. e 63

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

import javax.swing.*; import java.awt.*; public class FlowLayoutEx { public static void main(String[] args) { JFrame janela = new JFrame("Janela Basica"); JButton botao1 = new JButton("Me clique!"); JButton botao2 = new JButton("Me clique!"); JButton botao3 = new JButton("Me clique!"); JLabel label1 = new JLabel("Isso e um teste"); JLabel label2 = new JLabel("Isso e outro teste"); JPanel panel = new JPanel(); botao1.addActionListener(new EventoBotao(botao1,0)); botao2.addActionListener(new EventoBotao(botao2,0)); botao3.addActionListener(new EventoBotao(botao3,0)); panel.setLayout(new FlowLayout(FlowLayout.CENTER)); panel.add(label1); panel.add(botao1); panel.add(botao2); panel.add(botao3); panel.add(label2); janela.getContentPane().add(panel); janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); janela.pack(); janela.setLocation(120,120); janela.setSize(250,150); janela.setVisible(true); } } Figura 8.7: Exemplo de FlowLayout

Em relao ao GridLayout na Figura 8.8 a seguir, especa-se a quantidade de linhas e colunas ca que existiro. Ao colocar os objetos na janela, ser obedecida a ordem da esquerda para a direita a a e de cima para baixo. Se o parmetro que informa a quantidade de linhas ou de colunas forem a zero, ento no haver limite para o n mero de linhas ou colunas. a a a u 64

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

import javax.swing.*; import java.awt.*; public class GridLayoutEx { public static void main(String[] args) { JFrame janela = new JFrame("Janela Basica"); JButton botao1 = new JButton("Me clique!"); JButton botao2 = new JButton("Me clique!"); JButton botao3 = new JButton("Me clique!"); JLabel label1 = new JLabel("Isso e um teste"); JLabel label2 = new JLabel("Isso e outro teste"); JPanel panel = new JPanel(); botao1.addActionListener(new EventoBotao(botao1,0)); botao2.addActionListener(new EventoBotao(botao2,0)); botao3.addActionListener(new EventoBotao(botao3,0)); panel.setLayout(new GridLayout(0,2)); panel.add(label1); panel.add(botao1); panel.add(botao2); panel.add(botao3); panel.add(label2); janela.getContentPane().add(panel); janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); janela.pack(); janela.setLocation(120,120); janela.setSize(250,150); janela.setVisible(true); } } Figura 8.8: Exemplo de GridLayout

Finalmente, o GridBagLayout na Figura 8.9 a seguir, o mais complexo e ex e vel. A losoa se parece com o GridLayout. Entretanto, poss especicar uma srie de atributos das clulas. e vel e e Alguns atributos so os seguintes. a

65

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

Atributos gridx e gridy gridwidth e gridheight

Signicado Coordenadas relativas da posio da clula. ca e Largura e altura relativas do componente, dadas em funo do n mero de clulas. ca u e

Tabela 8.2: Alguns atributos das clulas no GridBagLayout e

Convm ressaltar que os atributos mencionados so relativos `s clulas. Por exemplo, quando e a a e se especica respectivamente gridx=2 e gridy=1 est posicionando a clula na terceira linha, a e segunda coluna. Todos os atributos esto em uma classe chamada GridBagConstraints. a

import javax.swing.*; import java.awt.*; public class GridBagLayoutEx { public static void main(String[] args) { JFrame janela = new JFrame("Janela Basica"); JButton botao1 = new JButton("Me clique!"); JButton botao2 = new JButton("Me clique!"); JButton botao3 = new JButton("Me clique!"); JLabel label1 = new JLabel("Isso e um teste"); JLabel label2 = new JLabel("Isso e outro teste"); JPanel panel = new JPanel(); GridBagConstraints c = new GridBagConstraints(); botao1.addActionListener(new EventoBotao(botao1,0)); botao2.addActionListener(new EventoBotao(botao2,0)); botao3.addActionListener(new EventoBotao(botao3,0)); Figura 8.9: In do exemplo de GridBagLayout cio

8.5

Menus

Um menu prov uma maneira simples de listar os servios que a aplicao disponibiliza sem e c ca poluir a interface. Os menus (JMenu) so colocados na chamada barra de menu (JMenuBar). a 66

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

panel.setLayout(new GridBagLayout()); c.gridx=1; c.gridy=0; panel.add(label1,c); c.gridx=0; c.gridy=1; panel.add(botao1,c); c.gridx=1; c.gridy=1; panel.add(botao2,c); c.gridx=2; c.gridy=1; panel.add(botao3,c); c.gridx=1; c.gridy=2; panel.add(label2,c); janela.getContentPane().add(panel); janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); janela.pack(); janela.setLocation(120,120); janela.setSize(350,150); janela.setVisible(true); } } Figura 8.10: Continuao do exemplo de GridBagLayout ca

Cada menu, pode ter um ou mais itens (JMenuItem). Para tornar mais claro essa relao, observe o exemplo da Figura 8.11 a seguir. Nesse caso, ca e criado um menu que contm dois itens de menu. O segundo item contm texto e imagem. e e

8.6

Campos e Areas de Texto

Os campos de texto so objetos que permitem que o usurio fornea um pequeno texto (no a a c a mais que uma linha) ao programa. Quando o usurio indica que j nalizou a entrada de dados, a a teclando enter por exemplo, esse objeto dispara um evento.

67

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

import java.awt.*; import java.awt.event.*; import javax.swing.*; public class JanelaMenu { JMenuBar barraMenu; JMenu menu, submenu; JMenuItem itemMenu; JFrame janela; public JanelaMenu(String titulo) { janela = new JFrame(titulo); barraMenu = new JMenuBar(); // Criando o primeiro menu menu = new JMenu("Primeiro Menu"); menu.setMnemonic(KeyEvent.VK_P); menu.setToolTipText("Texto de ToolTip"); // Criando o primeiro item de menu e adicionando-o ao menu itemMenu = new JMenuItem("Imagem e texto", new ImageIcon("cenapadIcon.jpg")); itemMenu.setMnemonic(KeyEvent.VK_I); menu.add(itemMenu); // Criando o segundo item de menu e adicionando-o ao menu itemMenu = new JMenuItem("Apenas texto"); itemMenu.setMnemonic(KeyEvent.VK_A); menu.add(itemMenu); //Adicionando o menu a barra. barraMenu.add(menu); // Adicionando a barra de menu a janela. janela.setJMenuBar(barraMenu); janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); janela.pack(); janela.setLocation(120,120); janela.setSize(200,100); janela.setVisible(true); } } Figura 8.11: Exemplo de Menu 68

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

Uma rea de texto, por sua vez, um objeto que permite a digitao de vrias linhas de a e ca a texto. Observe o exemplo nas guras 8.12 e 8.13 a seguir.

import java.awt.*; import java.awt.event.*; import javax.swing.*; public class DemonstTexto extends JPanel implements ActionListener { protected JTextField campoTexto; protected JTextArea areaTexto; public DemonstTexto() { super(new GridBagLayout()); campoTexto = new JTextField(20); campoTexto.addActionListener(this); areaTexto = new JTextArea(5, 20); areaTexto.setEditable(false); JScrollPane scrollPane = new JScrollPane(areaTexto, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); GridBagConstraints c = new GridBagConstraints(); c.gridwidth = GridBagConstraints.REMAINDER; c.fill = GridBagConstraints.HORIZONTAL; add(campoTexto, c); c.fill = GridBagConstraints.BOTH; c.weightx = 1.0; c.weighty = 1.0; add(scrollPane, c); } public void actionPerformed(ActionEvent evt) { String text = campoTexto.getText(); areaTexto.append("Voce digitou: "+text + "\n"); campoTexto.selectAll(); // Posiciona o cursor no final do texto. areaTexto.setCaretPosition(areaTexto.getDocument().getLength()); } Figura 8.12: In do programa que exemplica a utilizao de objetos de texto. cio ca

69

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

private static void interfaceJanela() { JFrame janela = new JFrame("Demonstracao Objetos de texto"); janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JComponent novoPane = new DemonstTexto(); janela.setContentPane(novoPane); //Display the window. janela.pack(); janela.setVisible(true); } public static void main(String[ ] args) { interfaceJanela(); } } Figura 8.13: Continuao do programa que exemplica a utilizao de objetos de texto. ca ca

70

CAP ITULO

Applets

Baixem seus escudos e rendam suas naves. Vocs sero assimilados. Resistir intil. e a e u Borgs em Jornada nas Estrelas: o primeiro contato, 1996. a Applets so pequenas aplicaes embutidas em pginas HTML1 . E fcil a criao de applets em a co a ca Java por causa da mquina virtual. a Na verdade, o navegador (browser ) contm em si uma mquina virtual Java que permite e a a execuo de cdigos (arquivos .class). Esses cdigos, por sua vez, devem estar impl ca o o citos em pginas HTML. a Os applets so bem parecidos com as aplicaes tradicionais, porm possuem detalhes bem a co e diferentes. Uma das que mais se destaca o fato dos applets possuirem uma srie de restries e e co de segurana. Imagine o que aconteceria se essas restrioes no se aplicassem aos applets. Os c c a v rus se proliferariam com muito mais rapidez.
1

Pginas HTML so escritas na linguagem de marcaao de hipertextos, t a a c picas da World Wide Web (WWW).

71

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

9.1

Ciclo de Vida dos Applets

O applet possui um ciclo de vida denido em funo dos eventos gerados pela prpria pgina ca o a onde est embutido. O ciclo de vida possui as seguintes fases: a 1. Inicializao: carga do applet na mquina virtual. ca a 2. Comeo: inicio do programa propriamente dito. c 3. Parada: parada de execuo do applet. ca 4. Destruio: liberao do applet pela mquina virtual. ca ca a Para cada uma das fases, existe um mtodo que pode ser sobrecarregado e realizar algumas e tarefas adicionais. Para a fase de inicializao, existe o mtodo init; para a fase de comeo, ca e c existe o mtodo start; para a fase de parada, existe o mtodo stop; nalmente, para a fase de e e destruio, existe o mtodo destroy. Nem todos os mtodos precisam ser sobrecarregados. ca e e Observe o exemplo da Figura 9.1 a seguir. Lembre-se que um applet deve estar embutido em uma pgina HTML. Na Figura 9.2 a seguir est um exemplo de pgina HTML que embute a a a o applet da Figura 9.1. Perceba que a tag APPLET especica os principais parmetros para o applet. Entre eles a esto: a Parmetro CODE: arquivo que contm o cdigo. a e o Parmetro WIDTH: largura da rea reservada para o applet. a a Parmetro HEIGHT: altura da rea reservada para o applet. a a

9.2

Passagem de Outros Parmetros a

E poss ainda passar outros parmetros mais espec vel a cos para os applets. Para tanto, utiliza-se a tag PARAM no contexto da tag APPLET. Observe o exemplo da Figura 9.3 a seguir e da pgina HTML na Figura 9.4. a

72

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

import java.applet.Applet; import java.awt.Graphics; public class Simples extends Applet { StringBuffer buffer; public void init() { buffer = new StringBuffer(); escreve("inicializando... "); } public void start() { escreve("comecando..."); } public void stop() { escreve("parando..."); } public void destroy() { escreve("preparando para descarregar...");} void escreve(String frase) { System.out.println(frase); buffer.append(frase); repaint(); } public void paint(Graphics g) { g.drawRect(0, 0, getSize().width - 1, getSize().height - 1); //Desenha a frase atual dentro do retangulo g.drawString(buffer.toString(), 5, 15); } } Figura 9.1: Applet simples

73

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

<html> <title> Essa e&acute; uma p&aacute;gina para exemplificar Applets</title> <body> <p> O applet est&aacute; embutido a seguir: </p> <br> <APPLET CODE=Simples.class WIDTH=200 HEIGHT=30> </APPLET> <br> Fim do Applet. <br> </body> </html> Figura 9.2: Pgina HTML que embute o applet da Figura 9.1. a

74

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

import java.applet.Applet; import java.awt.Graphics; public class Simples2 extends Applet { StringBuffer buffer; String param1; float param2; public void init() { buffer = new StringBuffer(); escreve("inicializando... "); param1 = getParameter("PRIMEIRO"); try{ param2 = Float.parseFloat(getParameter("SEGUNDO")); } catch (NumberFormatException e) { param2=0; } } public void start() { escreve("comecando..."); escreve(" Parametro 1: "+ param1); escreve(" Parametro 2: "+ param2); } void escreve(String frase) { System.out.println(frase); buffer.append(frase); repaint(); } public void paint(Graphics g) { g.drawRect(0, 0, getSize().width - 1, getSize().height - 1); g.drawString(buffer.toString(), 5, 15); } } Figura 9.3: Applet simples com passagem de parmetros. a

75

CENAPAD-SP

Introduo ` Linguagem de Programao Java ca a ca

<html> <title> Essa e&acute; uma p&aacute;gina para exemplificar Applets</title> <body> <p> O applet est&aacute; embutido a seguir com os seguintes par&acirc;metros: </p> <br> <APPLET CODE=Simples3.class WIDTH=500 HEIGHT=30> <PARAM NAME=PRIMEIRO VALUE=primeiro> <PARAM NAME=SEGUNDO VALUE=2.34> </APPLET> <br> Fim do Applet.<br> </body> </html> Figura 9.4: Pgina HTML que embute o applet da Figura 9.3. a

76

Referncias Bibliogrcas e a

[1] M. Campione, K. Walrath, and A. Huml. The Java Tutorial. Addison-Wesley, 2000. [2] P. Chan. The Java Developers Manual. Addison-Wesley, 2000. [3] S. Microsystems. Java 2 SDK, Standard Edition Documentation. Dispon on-line em: vel http://java.sun.com/j2se/1.4.2/docs/index.html, 2003.

77

Você também pode gostar