Sunteți pe pagina 1din 48

UNIVERSIDADE FEDERAL DE SANTA CATARINA PROGRAMA ESPECIAL DE TREINAMENTO CIENCIAS DA COMPUTACAO

Introducao a Linguagem Java `


Lucas Wanner

Verso 1.1 a Florianpolis, Outubro de 2002 o

Verses atualizadas deste documento devem estar dispon o veis no endereo c http://monica.inf.ufsc.br. Caso no seja poss a vel obter o documento neste s tio, envie um e-mail para pet@inf.ufsc.br ou para o autor.

Este documento pode ser distribu livremente em sua forma original. do Partes deste documento podem ser usadas em outros documentos, desde que exista indicao de fonte e instrues para obteno do documento completo. ca co ca

A Este documento foi constru e formatado com L TEX 2 do

Sumrio a
Prefcio a 1 Introduo ` Programao Orientada ca a ca 1.1 Classes e Objetos . . . . . . . . . . . 1.2 Encapsulamento . . . . . . . . . . . . 1.3 Agregao . . . . . . . . . . . . . . . ca 1.4 Herana . . . . . . . . . . . . . . . . c 1.5 Classes Abstratas e Interfaces . . . . a . . . . . Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 5 . 6 . 7 . 8 . 8 . 10 11 11 12 13 13 14 15 15 15 16 16 17 17 18 18 19 19 19 19 19 20 21 21 22 23 23 24 24

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

2 O Bsico de Java a 2.1 Compilao e Execuo . . . . . . . . . . . . . . . . . ca ca 2.2 Anatomia de uma Aplicao Java . . . . . . . . . . . ca 2.3 Variveis . . . . . . . . . . . . . . . . . . . . . . . . . a 2.3.1 Declarao de Variveis . . . . . . . . . . . . ca a 2.3.2 Inicializao de Variveis de Objetos . . . . . ca a 2.3.3 Inicializao de Variveis de Tipos Primitivos ca a 2.3.4 Destruio de Objetos . . . . . . . . . . . . . ca 2.3.5 Escopo . . . . . . . . . . . . . . . . . . . . . . 2.3.6 Variveis Finais . . . . . . . . . . . . . . . . . a 2.3.7 Exerc cios . . . . . . . . . . . . . . . . . . . . 2.4 Operadores . . . . . . . . . . . . . . . . . . . . . . . 2.4.1 Operadores Aritmticos . . . . . . . . . . . . e 2.4.2 Operadores Condicionais e Relacionais . . . . 2.4.3 Operadores de Atribuio . . . . . . . . . . . ca 2.4.4 Exerc cios . . . . . . . . . . . . . . . . . . . . 2.5 Controle de Fluxo . . . . . . . . . . . . . . . . . . . . 2.5.1 while e do-while . . . . . . . . . . . . . . . . . 2.5.2 for . . . . . . . . . . . . . . . . . . . . . . . . 2.5.3 if/else . . . . . . . . . . . . . . . . . . . . . . 2.5.4 switch . . . . . . . . . . . . . . . . . . . . . . 2.5.5 Tratamento de Excees . . . . . . . . . . . . co 2.5.6 Controle de Execuo . . . . . . . . . . . . . . ca 2.5.7 Exerc cios . . . . . . . . . . . . . . . . . . . . 2.6 Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . 2.6.1 Declarao, Criao e Acesso . . . . . . . . . ca ca 2.6.2 Exerc cios . . . . . . . . . . . . . . . . . . . . 2.7 Exerc cios de Reviso . . . . . . . . . . . . . . . . . . a

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

3 Orientao a Objetos em Java ca 3.1 Classes . . . . . . . . . . . . . 3.1.1 Exerc cios . . . . . . . 3.2 Interfaces . . . . . . . . . . . 3.3 Herana . . . . . . . . . . . . c 3.4 Classes Abstratas . . . . . . . 3.5 Tratamento de Excees . . . co 3.6 Exerc cios de Reviso . . . . . a

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

25 25 28 29 30 31 31 33 34 34 34 35 35 36 36 36 37 37 39 40 41 43 43 43 44 44 45 47

4 Construo de Aplicaes em Java ca co 4.1 Pacotes . . . . . . . . . . . . . . . . 4.1.1 Construo de Pacotes . . . . ca 4.1.2 Utilizao de Pacotes . . . . . ca 4.1.3 Exerc cios . . . . . . . . . . . 4.2 Documentao . . . . . . . . . . . . . ca 4.2.1 Exerc cios . . . . . . . . . . . 4.3 Entrada e Sa . . . . . . . . . . . . da 4.3.1 O Bsico do I/O em Java . . a 4.3.2 Arquivos de Acesso Aleatrio o 4.3.3 Serializao . . . . . . . . . . ca 4.3.4 I/O no Console . . . . . . . . 4.4 Threads . . . . . . . . . . . . . . . . A Um A.1 A.2 A.3 A.4 Primeiro Programa em Java Instalao e Congurao do JDK ca ca Criao do Cdigo Fonte . . . . . ca o Compilao . . . . . . . . . . . . ca Execuo . . . . . . . . . . . . . ca

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

B Glossrio de Termos a Referncias Bibliogrcas e a

Prefcio a
Esta apostila foi concebida originalmente em Setembro de 2001 como material de apoio aos Cursos de Introduo ` Linguagem Java ministrados ca a pelos bolsistas do Programa Especial de Treinamento - Cincias da Come putao da Universidade Federal de Santa Catarina (PET/CCO). O mateca rial e o curso destinam-se a principiantes em Java, que (preferencialmente) j a tenham algum conhecimento em alguma outra linguagem de programao, ca especialmente nas orientadas a objetos, como C++, Object Pascal (Delphi), Smalltalk, Eiel, etc. Cap tulo 1 traz uma breve introduo ` Orientao a Objetos, com enfoque ca a ca em Java. Embora bastante simples e incompleta, esta introduo deve ca cobrir todos os tpicos necessrios ` compreenso deste material. o a a a Cap tulo 2 apresenta a sintaxe de Java, com tpicos relacionados ` variveis, o a a controle de uxo, operadores, etc. Cap tulo 3 mostra a traduo dos conceitos da programao orientada a ca ca objetos para cdigo em Java o Cap tulo 4 apresenta tpicos relacionados a aplicaes em Java, como pao co cotes, documentao, entrada e sa ca da, etc. Apndice A traz instrues para gerao de cdigo, compilao e execuo e co ca o ca ca de um primeiro programa em Java Apndice B traz um glossrio de termos usados e a Embora destinado especialmente aos alunos do curso, este material deve servir tambm ao autodidata com bons conhecimentos em linguagens oriene tadas a objetos. Na verso 1.1 foram corrigidos pequenos erros existentes na verso inicial, a a mas outros podem eventualmente aparecer. No deixe de enviar indicaes a co de erros ou outras sugestes ao autor. o Lucas Wanner lucas@inf.ufsc.br Programa Especial De Treinamento - PET/CCO pet@inf.ufsc.br

Cap tulo 1 Introduo ` Programao ca a ca Orientada a Objetos


Todas as linguagens de programao so abstraes. A complexidade da ca a co resoluo de um determinado problema est diretamente ligada ` qualidade e ca a a ao tipo de abstrao que feita dele. A linguagem Assembly uma pequena ca e e abstrao da mquina para qual ela foi criada. Muitas linguagens chamadas ca a estruturadas ou procedurais (como C, BASIC e Fortran) so abstraes a co da linguagem Assembly. Estas linguagens foram um grande progresso em relao a linguagem Assembly, mas sua abstrao inicial ainda requer que ca ca o programador pense em termos da estrutura do computador ao invs da e estrutura do problema a ser resolvido. O efeito colateral so programas a dif ceis de escrever e caros para se manter. A alternativa modelar o problema que se est tentando resolver de e a acordo com um paradigma diferente do da mquina. Linguagens como LISP a e APL escolheram vises particulares do mundo (Todos os problemas so o a listas e Todos os problemas so algoritmos, respectivamente). PROLOG a classica todos os problemas como cadeias de decises. Cada uma destas o vises uma boa soluo para o tipo espec o e ca co de problemas para o qual elas foram desenvolvidas, mas quando se sai deste dom nio, elas em geral tornam-se inadequadas. O paradigma de orientao a objetos vai um passo alm, dando ao proca e gramador ferramentas para representar elementos do espao do problema. c Esta representao geral o suciente para que o programador no que ca e a restrito a um tipo espec co de problema. Os elementos do espao do proc blema so chamados objetos. A idia que o programa possa adaptar-se a e e a ` linguagem do problema, assim quando se l o cdigo descrevendo a soluo e o ca (ou seja, o espao da soluo), tambm se est lendo a descrio do proc ca e a ca blema em si (ou o espao do problema). Assim, a Programao Orientada c ca a Objetos (POO) permite que o problema seja descrito nos termos do proprio problema, ao invs de em termos do computador onde ser executada a sua e a soluo. ca

1.1

Classes e Objetos

O conceito de classes ou tipos 1 de objetos vem de Plato e Aristteles. a o Plato acreditava que todos os objetos imperfeitos do mundo dos sentidos a derivam de um conceito perfeito do mundo das idias. Este conceito pere feito funciona como uma forma de coelhos de chocolate. Todos os coelhos produzidos com a forma so do mesmo tipo, mas diferem levemente entre si. a Um um pouco menor, outro tem uma orelha quebrada, assim por diante. e Aristteles, tomando uma via mais prtica, percebeu as semelhanas entre o a c espcies de animais, falando da classe dos peixes, a classe dos pssaros, . . . . e a A idia de que todos os objetos, embora unicos, so parte de uma classe e a de objetos que tem caracter sticas e comportamentos em comum foi utilizada diretamente na primeira linguagem orientada a objetos, Simula-67, com sua palavra chave fundamental class que introduz um novo tipo em um programa. Objetos so idnticos exceto pelo seu estado durante a execuo do proa e ca grama. Criar tipos abstratos de dados (classes) um conceito fundamental e na programao orientada a objetos. Tipos abstratos de dados funcionam ca como os tipos primitivos (inteiro, real, char, etc.): pode-se criar variveis de a um tipo (chamadas objetos ou instncias) e manipular estas variveis (ou a a seja, mandar mensagens ou pedidos, manda-se uma mensagem ao objeto e ele entende o que fazer com ela). Os membros (elementos) de cada classe tm algo em comum: todas as pessoas tm nome, todos os livros tm um e e e nmero de pginas, etc. Ao mesmo tempo, cada membro tem seu prprio u a o estado, cada pessoa tem um nome diferente, cada livro tem um nmero difeu rente de pginas. Assim, pessoas, livros, etc., podem ser representados com a uma entidade unica no programa. Esta entidade o objeto, e cada objeto e pertence a uma classe que dene seus atributos (caracter sticas) e mtodos e (comportamento). Quando se denem novos tipos, deve haver uma maneira de fazer um pedido a um objeto deste tipo para que o mesmo faa algo, como completar c uma transao, desenhar algo na tela, ou ligar um interruptor. Cada objeto ca s pode satisfazer certos pedidos. Os pedidos que podem ser feitos a um o objeto so determinados pela sua interface. Um exemplo simples pode ser a a representao de uma lmpada: ca a -------------------------| Lampada | -------------------------| ligar() | | desligar() | | aumentarLuminosidade() | | dimuirLuminosidade() | -------------------------1 2

Lampada lamp = new Lampada(); lamp.ligar();

A parte superior do diagrama representa o nome da classe, e a inferior, sua interface. A interface estabelece que pedidos podem ser feitos a um deter1

Este curso considera classe e tipo como sinnimos o

minado objeto. Entretanto, deve haver um cdigo que satisfaa este pedido. o c Isto, junto com os dados ocultos, ou protegidos, constitui a implementao. ca Do ponto de vista estrutural, um tipo tem uma funo associada a cada peca dido poss vel, e quando se faz um pedido a um objeto, sua respectiva funo ca chamada. Este processo sumarizado dizendo-se que se manda uma mene e sagem (faz um pedido) a um objeto, e o objeto sabe o que fazer com esta mensagem (executa o cdigo da funo). o ca Aqui, o nome da classe Lampada, o nome do objeto em particular e lamp, e os pedidos que se pode fazer so: acender a lmpada, apage a a a la, aumentar a luminosidade e diminuir a luminosidade. Cria-se um objeto denindo uma referncia (lamp) para aquele objeto e chamando um pedido e de um novo objeto daquele tipo. Para enviar uma mensagem ao objeto, escreve-se o nome (referncia) do objeto e conecta o mesmo ao pedido com e um ponto.

1.2

Encapsulamento

Torna-se importante neste ponto fazer uma distino entre criadores de ca classes e usurios de classes. O objetivo do usurio conseguir uma srie a a e e de classes para o uso no desenvolvimento rpido de aplicaes. O objetivo a co do criador de classes desenvolver uma srie de classes que expe somente e e o o necessrio ao usurio. Esta prtica util pois, se o usurio no pode ver, a a a e a a tambm no pode mudar. Isto signica que o criador pode modicar a parte e a oculta do cdigo sem se preocupar com o impacto que isto ter sobre todos o a os clientes (desde, claro, que mantenha a funcionalidade). A parte oculta e geralmente representa o interior dos objetos, que poderia ser facilmente corrompido por um usurio mal informado, sendo assim, o encapsulamento reduz a os bugs no programa. Em qualquer relao importante haver fronteiras que sejam respeitadas ca e por todas as partes envolvidas. Quando o programador cria uma biblioteca2 , ele estabelece uma relao com o usurio, que tambm um programador, ca a e e mas um que est criando uma aplicao usando a biblioteca do primeiro, a ca possivelmente para construir uma biblioteca maior. Se todos os membros de uma classe estivessem vis veis a todos, o usurio a poderia fazer tudo com aquela classe, e no h maneira de estabelecer rea a gras. Assim, a principal razo para o controle de acesso para manter o a e cliente longe das partes que so necessrias para o funcionamento interno da a a classe, mas no so parte da interface que o usurio utiliza para resolver seus a a a problemas. Isto tambm um servio aos usurios, j que eles podem ver e e c a a facilmente o que importante para eles e ignorar o restante. e Outra razo para o controle de acesso permitir ao criador da biblioteca a e mudar o funcionamento interno das classes sem se preocupar com o efeito para o usurio. Um programador pode desenvolver uma classe que implea menta determinada soluo, e depois modic-la para faz-la mais rpida. ca a e a Se a interface e a implementao esto separadas e protegidas, isso pode ser ca a conseguido facilmente.
2

Uma biblioteca um conjunto de classes e

Java utiliza trs palavras-chave para delimitar os acessos em uma classe: e public, private e protected. public signica que as denies esto disco a pon veis para todos. protected determina que ningum pode acessar aquelas e denies, a no ser o criador da classe, dentro de funes daquela classe. co a co private no permite acesso exterior, e funciona como protected, exceto que a as especializaes da classe herdam os membros protected, mas no os prico a vate. Se no for denido um delimitador, Java especica o modo friendly, a que signica que, para as classes do mesmo pacote os membros aparecero a como public, mas para fora do pacote, sero private. a

1.3

Agregao ca

Quando uma classe foi criada, ela deve representar uma parte utilizvel a do cdigo. A maneira mais simples de reutilizar uma classe usar um objeto o e daquela classe diretamente, mas tambm se pode colocar um objeto daquela e classe dentro de uma nova classe. A nova classe ser composta por qualquer a nmero e tipo de outros objetos, em qualquer combinao necessria para u ca a atingir a funcionalidade desejada. Este conceito chamado agregao (ou e ca composio). A relao de agregrao chamada de tem um, como em ca ca ca e um carro tem um motor.

1.4

Herana c

Uma classe faz mais do que descrever o funcionamento de um conjunto de objetos; ela tambm tem relaes com outras classes. Duas classes podem ter e co caracter sticas e comportamento em comum, mas uma pode lidar com mais mensagens (ou lidar com elas de forma diferente). A herana expressa esta c similaridade entre os tipos usando o conceito de tipos base e tipos derivados. Um tipo base contm todas as caracter e sticas e comportamentos que so a compartilhados entre os tipos derivados dele. Um exemplo clssico o da a e forma, que poderia ser usado em um sistema de CAD3 . O tipo base (ou superclasse) forma. Cada forma tem tamanho, cor, posio e assim por e ca diante. Cada forma pode ser desenhada, apagada, movida, colorida, etc. Outros tipos espec cos podem ser derivados (especializados) desta classe: circulo, quadrado, triangulo, e assim por diante, cada um dos quais pode ter comportamentos e caracter sticas adicionais. Algumas formas podem ser rotacionadas, por exemplo. Alguns comportamentos podem ser diferentes, como para calcular a rea de uma forma. a
3

Computer-Aided Design, Design Auxiliado por Computador

-------------------------| Forma | -------------------------| desenhar() | | apagar() | | mover() | | altereCor() | | retorneCor () | -------------------------| ------------------------------| | | ---------------------------------| Circulo | | Quadrado | | Triangulo | ---------------------------------Quando se especializa uma classe existente, cria-se uma nova classe. Esta nova classe contm no s os membros (atributos) da classe base, mas tambm e a o e sua interface. Ou seja, todas as mensagens que podem ser mandadas para a classe superior tambm podem ser enviadas para a classe derivada. A classe e derivada do mesmo tipo da classe base. e Como tanto a classe base como a derivada tem a mesma interface, deve haver alguma implementao para executar quando um objeto recebe uma ca mensagem. Se simplesmente deriva-se uma classe e no se faz mais nada, os a mtodos da classe base so derivados tambm. Isto signica que os objetos e a e da classe base e derivada no s tem o mesmo tipo, mas tambm o mesmo a o e comportamento, o que no tem muita utilidade prtica. H duas maneiras a a a de diferenciar a classe derivada da classe base. A primeira, adicionar novas e funes ` classe especializada. co a -------------------------| Forma | -------------------------| desenhar() | | apagar() | | mover() | | altereCor() | | retorneCor () | -------------------------| ------------------------------| | | ------------------------------------| Circulo | | Quadrado | | Triangulo | ------------------------------------| rotacionar() | ---------------Embora o conceito de herana implicar `s vezes (especialmente em Java, c a onde a palavra-chave que indica herana extends) que sero adicionadas c e a novas funes ` interface, isto nem sempre verdade. A segunda maneira co a e 9

de diferenciar a classe derivada mudar o comportamento de uma funo e ca existente na classe base. Esta operao chamada sobrescrever (overriding). ca e Para sobrescrever uma funo, simplesmente cria-se uma nova denio para ca ca a funo na classe derivada. ca A relao de especializao chamada de um, como em um c ca ca e e rculo uma forma. e

1.5

Classes Abstratas e Interfaces

Muitas vezes pode ser desejvel que uma superclasse apresente somente a a interface para suas classes derivadas. Ou seja, ningum poder criar um e a objeto daquela superclasse, ela s apresenta os mtodos que podem ser tratao e dos por suas subclasses. Isto conseguido usando a palavra-chave abstract. e Se algum tentar criar um objeto de uma classe abstrata, o compilador acue sar um erro. A palavra abstract tambm pode ser usada para descrever a e um mtodo da interface da superclasse que ainda no foi implementado pela e a subclasse. A palavra-chave interface leva o conceito de classe abstrata um passo adiante, impedindo que qualquer funo da classe seja denida. Esta uma ca e ferramenta poderosa e muito utilizada, j que permite a separao perfeita a ca entre a interface e a implementao. Alm disso, poss combinar vrias ca e e vel a interfaces ao mesmo tempo, sendo que a herana de mltiplas classes ou c u mltiplas classes abstratas no poss u a e vel.

10

Cap tulo 2 O Bsico de Java a


A linguagem de programao Java era originalmente chamada Oak e foi ca desenvolvida inicialmente por James Gosling para ser usada em aparelhos eletrnicos. Depois de alguns anos de pesquisa a linguagem foi redirecionada o para a Internet, ganhou um novo nome e evoluiu at o ponto onde hoje se e 1 encontra . Apesar de ter realmente um forte apelo em relao ` Internet, a linguaca a gem e a tecnologia Java no se restringem aos famosos applets. Java a e uma linguagem orientada a objetos independente de plataforma, robusta, segura, multithreaded, distribu e, apesar disto tudo, bastante simples. H da a edies de Java especiais para dispositivos eletrnicos como celulares e cartes co o o eletrnicos (Java Micro Edition) e tambm para aplicaes de grande porte o e co (Java 2 Enterprise Edition). Este curso tratar da plataforma Java 2 Stana dart Edition (J2SE)2 , que ideal para aplicaes via Internet e convencionais e co de mdio porte. e

2.1

Compilao e Execuo ca ca

Cada mquina, em conjunto com o sistema operacional, tem uma maneira a diferente de fazer a execuo de seus programas. Sendo assim, os compilaca dores de linguagens como C++ e Object Pascal geram cdigo executvel o a espec co para a mquina e o sistema operacional no qual esto sendo usaa a por este motivo que os arquivos executveis de um sistema Windows dos. E a (.exe) no rodam, por exemplo, em um sistema UNIX. Em teoria, para gea rar um executvel para outro sistema bastaria recompilar o cdigo usando a o um compilador espec co para o sistema em questo, mas isto nem sempre a poss quando so usadas livrarias espec e vel a cas para um sistema, como as para interfaces grcas. a O compilador Java no gera um executvel espec a a co para um sistema, mas sim um cdigo intermedirio (bytecode), que interpretado pela Mquina o a e a Virtual Java (JVM). Um programa Java compilado (arquivo cuja extenso a .class) pode ser executado no ambiente Windows da Microsoft pois existe e
JDK 1.4.1, na data da ultima reviso deste curso. Os conceitos e exemplos deste curso a devem ser compat veis com todas as implementaes de Java a partir da verso 1.2 co a 2 A plataforma Java tem dois componentes: A Mquina Virtual Java (Java VM) e a a Interface para Programao de Aplicaes (Application Programming Interface - Java ca co API)
1

11

uma JVM que traduz as instrues em bytecode para o Windows. A mesma co lgica aplica-se para outros sistemas operacionais (Linux, AIX, Solaris, Mac o OS, etc.). A partir do conceito de JVM, elimina-se o problema de se ter uma verso a de um determinado software para cada um dos sistemas operacionais existentes no mercado ou dentro de uma corporao. Isto, naturalmente, reduz ca os custos de produo e manuteno de software. ca ca Para um exemplo simples de compilao e execuo de um programa em ca ca Java, consulte o Apndice A e

2.2

Anatomia de uma Aplicao Java ca

Vamos analisar a seguinte aplicao Java (as instrues para compilao ca co ca e execuo esto no Apndice A): ca a e
1 2 3 4 5 6 7 8 9 10 11 12

/** * A classe OlaJava implementa uma aplica~o que ca * simplesmente mostra "Ola Java !" na tela de console. */ public class OlaJava { public static void main(String[ ] args) { System.out.println("Ola Java !"); } }

As quatro primeiras linhas so de comentrio. Java suporta trs tipos de a a e comentrio: a


/* este um comentrio multilinha */ e a // este um comentrio de uma linha e a /** * Comentrio para o Javadoc (Documenta~o) a ca */

A linha 6 contm a declarao de classe. Neste caso, a classe chamada e ca e HelloJavae tem acesso pblico. A maneira mais simples de declarar uma u classe : e
1 2 3

class NomeDaClasse { // aqui vai o cdigo o }

A chave na linha 7 inicia um bloco de cdigo (neste caso, da prpria o o classe). Em Java, bem como em C, os blocos de cdigo iniciam com { e o terminam com }. O { ... } do Java equivalente ao begin ... end do e Pascal. A linha 8 inicia a denio do mtodo main. Toda aplicao Java deve ca e ca ter um mtodo cuja assinatura assim e e
1

public static void main(String[ ] args)

12

Nesta assinatura: public indica que o mtodo main pode ser chamado por qualquer objeto. e static indica que o mtodo main pode ser chamado mesmo que nenhuma e instncia da classe tenha sido criada. a void indica que o mtodo main no retorna nenhum valor. e a Os argumentos de um mtodo em Java sempre vo na assinatura aps o e a o nome do mtodo, dentro de parnteses. A declarao do argumento sempre e e ca e do tipo (TipoDoArgumento nomeDoArgumento). Mltiplos argumentos so u a separados por v rgula, como em (Tipo1 arg1, Tipo2 arg2). Mtodos sem e argumento devem ter na assinatura um () aps o nome. No caso espec o co do mtodo main, o argumento um array de Strings, que pode ser utilizado e e para execuo com opes de inicializao. ca co ca O mtodo main em Java similar ` funo main de C e C++. Quando e e a ca o interpretador Java executa uma aplicao, ele inicia chamando o mtodo ca e main (principal) da classe da aplicao. S a classe da aplicao deve ter um ca o ca mtodo main. Se voc tentar invocar o interpretador Java em uma classe e e que no tem um mtodo main ele acusa um erro. a e A linha 9 inicia o bloco de cdigo do mtodo main. A linha 10 usa a o e varivel out classe System, do API do Java, para mostrar uma mensagem a na tela. Esta varivel tambm um objeto, do tipo PrintStream. A classe a e e PrintStream possui um mtodo esttico chamado println, que mostra um e a string na tela de console. Note que nenhum objeto precisou ser criado nesta chamada, isto porque tanto a varivel out quanto o mtodo println so a e a estticos (static). a As linhas 11 e 12 fecham os blocos de cdigo do mtodo main e da classe, o e respectivamente.

2.3
2.3.1

Variveis a
Declarao de Variveis ca a

Uma varivel um dado referenciado por um identicador. Cada varivel a e a 3 tem um tipo, como int ou Object, e um escopo . O identicador o nome e da varivel. Identicadores funcionam de maneira similar aos ponteiros do a C. Quando chamados, eles referenciam o local da memria onde o objeto o 4 denotado por ele est localizado . A seguir esto exemplos de declarao de a a ca variveis em Java. a
1 2 3 4 5

int i; Object umObjeto; String umTexto; char caracter; float real1,real2;


3 4

Escopo o alcance da varivel e a Isto e vlido para as variveis de objetos. As variveis de tipos primitivos guardam a a a valores, no referncias a e

13

A declarao sempre segue o esquema TipoDaVariavel nomeDaVariavel. ca E poss fazer a declarao de mltiplas variveis, como na linha 5, onde so vel ca u a a declaradas duas variveis do tipo oat(ponto utuante de preciso simples). a a

2.3.2

Inicializao de Variveis de Objetos ca a

Em Java, as variveis podem ser inicializadas tanto no momento da dea clarao quanto em algum ponto aps a declarao. A primeira opo mais ca o ca ca e recomendvel, pois d ao programador maior controle sobre a varivel. No a a a cdigo a seguir esto exemplos de inicializao de variveis de objetos, que o a ca a so inicializadas por um construtor. a
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

// declara~o e inicializa~o da varivel ca ca a NomeDaClasse nomeDoObjeto = new NomeDaClasse();

// declara~o da varivel ca a Object umObjeto; . . // inicializa~o da varivel ca a umObjeto = new Object();

// declara~o e inializa~o da varivel sem par^metros ca ca a a String umTexto = new String();

// declara~o e inializa~o da varivel com par^metros ca ca a a String outroTexto = new String("Ol, Enfermeira!"); a

O construtor chamado atravs do comando new NomeDaClasse. Como e e pode-se ver pelas linhas 14 e 18, uma classe pode ter mais de um construtor, com diferentes parmetros. O construtor da classe String usado na linha 14 a no tem parmetros, e cria um string em branco. J o da linha 18 toma como a a a parmetro uma seqncia de caracteres, que se torna o contedo referenciado a ue u por aquela varivel. O construtor, em ultima instncia um mtodo, lembrea a e e se que mesmo mtodos que no tem argumentos devem ser chamados com e a um () aps seu nome, como em new String(). o Caso Especial A classe String tem um construtor especial, que no precisa ser chamado a com a palavra-chave new. O cdigo a seguir demonstra uma chamada do o construtor especial da classe String.
1 2 3 4 5 6 7

// a chamada String nomeDoLivro = "Cem Anos de Solid~o"; a // tem o mesmo efeito de String nomeDoLivro = new String("Cem Anos de Solid~o"); a // Este um caso especial, n~o vale para outras classes. e a

Os Arrays em Java tambm tm um construtor especial, que ser explie e a cado na Seo 2.6. ca 14

2.3.3

Inicializao de Variveis de Tipos Primitivos ca a

Tipos primitivos so tipos especiais, como nmero inteiros e em ponto a u utuante, caracter e booleano. Estes tipos no so objetos5 , portanto no a a a so inicializados atravs de construtores. O cdigo a seguir mostra exemplos a e o de inicializao de tipos primitivos. ca
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

// declara~o e inicializa~o da varivel ca ca a int umInteiro = 5000; long umInteiroGrande = 100000000000000; short umInteiroPequeno = 5; float umReal = 5.5f; /* o f depois do nmero u indica precis~o simples */ a double outroReal = 4.23423423; char umCaracter = a; boolean flag = false;

// declara~o da varivel ca a int i; . . // inicializa~o da varivel ca a i = 10;

2.3.4

Destruio de Objetos ca

Os objetos criados em Java no precisam ser destru a dos, um objeto ser a eliminado da memria automaticamente pelo garbage collector (coletor de o lixo) quando no houver mais referncias para ele. a e

2.3.5

Escopo

O escopo de uma varivel a regio de um programa na qual a varivel a e a a pode ser referenciada simplesmente por seu nome. Alm disto, o escopo e tambm determina quando o sistema cria e destri as variveis. Escopo no e o a a o mesmo que visibilidade, a visibilidade acertada com um modicador de e e acesso (public, protected, private). O escopo de uma varivel determinado pelos blocos de cdigo { ... }. a e o A varivel estar acess somente dentro do bloco de cdigo no qual ela foi a a vel o declarada ou dentro de blocos que esto no bloco no qual ela foi declarada. a O cdigo a seguir mostra alguns exemplos. o
1 2 3 4 5 6 7 8 9 10

public class whatever { /* esta varivel estar acessvel a a em todos os pontos desta classe */ protected int i = 5; public void doSomething() { // esta varivel estar acessvel a a // somente neste mtodo. e
5

Ainda assim, cada um destes tipos tem classes que os representam como objetos, chamadas wrapers

15

11 12 13 14 15 16 17 18 19 20 21 22 23

char umaLetra = a; if (true) { // umaLetra pode ser acessado aqui umaLetra = b; /* umNumero acessvel somente e dentro do if */ int umNumero = 5; } umNumero = umNumero + 1; //isto n~o funciona. a } }

2.3.6

Variveis Finais a

A palavra-chave nal, quando precede a declarao de uma varivel, ca a impede que a varivel tenha seu contedo alterado. a u
1 2

// esta varivel n~o varia nunca ! a a final int variavelFinal = 2;

2.3.7

Exerc cios

Corrija, compile e execute o cdigo a seguir. o


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

public class Variaveis { protected int = 3; protected Object umObjeto = "Isto um Objeto"; e protected char c = "Lucas" public static void main(String[ ] args) { metodo1(); metodo2(); int tempoDeJogo = 50; } public static void metodo1() { String guga = "Gustavo Kuerten"; String sampras = Pete Sampras; int guga = 1; int samp = 0; System.out.println("Tempo de Jogo: "+tempoDeJogo+" min."); System.out.println(guga+" "+guga+" x "+samp+" "+sampras); } public static void metodo2() { float num = 0.23423; System.out.println("Imprimindo um caracter... "+c); } }

16

2.4
2.4.1

Operadores
Operadores Aritmticos e

Os operadores aritmticos se aplicam aos tipos primitivos numricos. Sua e e funcionalidade est descrita a seguir. a Operadores bsicos: a Operador + * / % Uso Descrio ca

var1 + var2 Soma var1 e var2 var1 - var2 Diminui var2 de var1 var1 * var2 Multiplica var1 por var2 var1 / var2 Divide var1 por var2 var1 % var2 Resto da diviso de var1 por var2 a

Sempre que uma varivel inteira e uma em ponto utuante so usadas a a como operandos, o resultado em ponto utuante. e Alm da forma binria, os operadores + e - tem uma verso unria: e a a a Operador + Uso Descrio ca +var -var Transforma var em int se var for byte, short ou char Transforma var em -var

Tambm existem operadores de incrementao / decrementao: e ca ca Operador ++ Uso Descrio ca

var++ Incrementa var em 1, avalia o valor de var antes de decrementar

++

++var Incrementa var em 1, avalia o valor de var depois de incrementar

--

var-- Decrementa var em 1, avalia o valor de var antes de decrementar

--

--var Decrementa var em 1, avalia o valor de var depois de decrementar

17

2.4.2

Operadores Condicionais e Relacionais

Um operador relacional compara dois valores e determina a relao entre ca eles. Por exemplo, ! = retorna verdadeiro se os dois operandos so diferentes. a A tabela seguinte sumariza os operadores relacionais: Operador > >= < <= == != Uso var1 > var2 Retorna True (verdade) se var1 maior do que var2 e

var1 >= var2 var1 maior/igual do que var2 e var1 < var2 var1 menor do que var2 e

var1 <= var2 var1 menor/igual do que var2 e var1 == var2 var1 e var2 so iguais a var1 != var2 var1 e var2 so diferentes a

Operadores relacionais so usados com operadores condicionais para consa truir expresses de deciso mais complexas. Seguem os operadores relacionais o a suportados por Java: Operador && || ! & | ^ Uso Retorna True (verdade) se

var1 && var2 var1 e var2 so True (verdade) a var1 || var2 var1 ou var2 so True (verdade) a ! var var1 & var2 var1 | var2 var1 ^ var2 var False (falso) e var1 e var2 so True a var1 ou var2 so True a var1 e var2 so diferentes (var1 xor var2) a

2.4.3

Operadores de Atribuio ca
Operador += -= *= /= %= &= |= ^= Uso Equivalente a

var1 += var2 var1 = var1 + var2 var1 -= var2 var1 = var1 - var2 var1 *= var2 var1 = var1 * var2 var1 /= var2 var1 = var1 / var2 var1 %= var2 var1 = var1 % var2 var1 &= var2 var1 = var1 & var2 var1 |= var2 var1 = var1 | var2 var1 ^= var2 var1 = var1 ^ var2

18

2.4.4

Exerc cios

Calcule o resultado das seguintes operaes, considerando: co


boolean var1 = true; boolean var2 = false; int var3 = 1; int var4 = 10; 1) 2) 3) 4) var1 && (var3 <= var4) (var1 && var2) || !var1 !(!(var3 < var4) && !(var1 || var2)) var1 ^= (var3 > var4)

2.5
2.5.1

Controle de Fluxo
while e do-while

O while usado para executar continuamente um bloco de cdigo ene o quanto uma condio permanecer verdadeira. Sua sintaxe geral ca e
1 2 3

while (condi~o) { ca // aqui vai o cdigo o }

O do-while semelhante ao while, a diferena que ele avalia a condio e c e ca parecido com o repeat do Pascal. Sua depois de executar a primeira vez. E sintaxe : e
1 2 3

do { // aqui vai o cdigo o } while (condi~o); ca

2.5.2

for

O for uma maneira compacta de repetir um bloco de cdigo n vezes. e o Sua sintaxe geral : e
1 2 3 4 5 6 7 8 9

for (inicio; fim; incremento) { // aqui vai o cdigo o } // por exemplo: for (int i = 0; i < 10; i++) { // aqui vai o cdigo o }

2.5.3

if/else

O if permite executar um bloco de cdigo condicionalmente. A sintaxe o do if em Java : e


1 2 3

if (condi~o) { ca // cdigo a executar se a condi~o for verdadeira o ca }

19

4 5 6 7 8 9 10 11

if (condi~o) { ca // cdigo a executar se a condi~o for verdadeira o ca } else { // cdigo a executar se a condi~o for falsa o ca } condi~o ? verdadeira : falsa ca

A ultima linha apresenta uma verso compacta do if, e poderia ser usado a como no exemplo a seguir:
1 2

System.out.println("O caracter " + umChar + " " + e umChar.ehMaiusculo ? "maisculo" : "minsculo")); u u

2.5.4

switch

O switch usado para executar um bloco de cdigo condicionalmente e o baseado no valor de uma expresso inteira. Os exemplos a seguir mostram a poss veis usos para o switch.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

public class SwitchDemo { public static void main(String[] args) { int mes = 8; switch (mes) { case 1: System.out.println("Janeiro"); break; case 2: System.out.println("Fevereiro"); break; case 3: System.out.println("Maro"); break; c case 4: System.out.println("Abril"); break; case 5: System.out.println("Maio"); break; case 6: System.out.println("Junho"); break; case 7: System.out.println("Julho"); break; case 8: System.out.println("Agosto"); break; case 9: System.out.println("Setembro"); break; case 10: System.out.println("Outubro"); break; case 11: System.out.println("Novembro"); break; case 12: System.out.println("Dezembro"); break; } } }

public class SwitchDemo2 { public static void main(String[] args) { int mes = 2; int ano = 2000; int numDias = 0; switch (mes) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: numDias = 31; break;

20

38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54

case 4: case 6: case 9: case 11: numDias = 30; break; case 2: if ( ((ano % 4 == 0) && !(ano % 100 == 0)) || (ano % 400 == 0) ) numDias = 29; else numDias = 28; break; } System.out.println("Nmero de Dias = " + numDias); u } }

2.5.5

Tratamento de Excees co

Java tem um mecanismo de tratamento de excees que ajuda os prograco mas a reportar e tratar erros. Quando um erro ocorre, o programa joga uma exceo. Quando isto ocorre, o uxo normal do programa interrompido e ca e executado um tratador de exceo, um bloco de cdigo que lida com dee ca o terminado tipo de erro. A sintaxe geral do tratamento de excees em Java co : e
1 2 3 4 5 6 7 8 9 10 11 12 13 14

try { // cdigo o } catch (TipoDaExcecao nomeDaExcecao) { // este bloco executado se ocorrer uma exce~o e ca }

try { // cdigo o } catch (TipoDaExcecao nomeDaExcecao) { // este bloco executado se ocorrer uma exce~o e ca } finally { // este bloco executado incondicionalmente e }

2.5.6
break

Controle de Execuo ca

O comando break serve para terminar um loop. Sua forma geral segue o seguinte exemplo:
1 2 3 4 5 6

for (int i = 0; i < 10; i++) { if (aconteceuAlgo) { facaAlgo(); break; } }

21

continue O comando continue serve para ignorar a iterao atual de um loop. ca


1 2 3 4 5 6 7 8

for (int i = 0; i < 10; i++) { facaAlgoPrimeiro(); if (aconteceuAlgo) { continue; // o resto desta itera~o do loop ser ignorada. ca a } facaAlgo(); facaOutraCoisa(); }

return Todo mtodo em Java tem um valor de retorno, expresso na assinatura. e Este valor pode ser um Objeto, um tipo primitivo, ou um valor do tipo null, que indica que o mtodo no retorna nenhum valor signicativo. e a O comando return tem duas funes. Ele indica o valor que ser reco a tornado pelo mtodo, e pra a execuo do mesmo. Os exemplos a seguir e a ca mostram a forma de uso do return.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

public int metodo1() { int i,j; j = 0; for (i = 0; i < 10; ++i) { j += i; if (j == i) continue; if (j == 100) break; if (j == 1000) return (i + 1); j++; } return j; } public void metodo2() { if (condi~o) return; ca outrometodo(); }

2.5.7

Exerc cios

Traduza o seguinte pseudo-cdigo para Java: o


quant = 0 para i = 0..10 para j = 5..100 se i != j n~o execute esta itera~o a ca fim se quant = i * j + quant fim para j k = 0 enquanto k != i

22

quant = quant / (k + i) k = k + 1 fim enquanto fim para i retorne quant

2.6

Arrays

Um Array uma estrutura que contm vrios dados de um mesmo tipo. e e a Arrays podem guardar tanto objetos quanto tipos primitivos. Em Java, o tamanho dos Arrays denido na criao. e ca

2.6.1

Declarao, Criao e Acesso ca ca

A declarao de variveis de Array em Java segue a seguinte estrutura: ca a


1 2 3 4 5 6 7 8 9

int[ ] arrayDeInteiros; char[ ] arrayDeCaracteres; Object[ ] arrayDeObjetos UmaClasseQualquer[ ] arrayDeUmaClasseQualquer; // A declara~o tambm pode seguir a forma ca e // Tipo varivel[ ], como em a int arrayDeInts[ ]; char arrayDeChars[ ];

Como j foi mencionado, os Arrays em Java tm construtores especiais. a e Os exemplos a seguir mostram a criao de Arrays: ca
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

int[ ] arrayDeInts = { 2 , 3 , 4 }; // equivalente a e int[ ] arrayDeInts = new int[3]; arrayDeInts[0] = 2; arrayDeInts[1] = 3; arrayDeInts[2] = 4; // e tambm igual a e e int arrayDeInts[ ]; arrayDeInts = new int[3]; arrayDeInts[0] = 2; arrayDeInts[1] = 3; arrayDeInts[2] = 4; // Isto tambm vlido para arrays de Objetos: e e a Object array[ ] = { new Object(), new Object() }

O acesso a uma determinada posio de um array sempre segue a sintaxe ca nomeDoArray[posicaoAAcessar]. Como os ndices do array comeam no c zero, o valor mximo que se pode acessar tamanho - 1. A varivel length a e a d o tamanho do array. Se for tentado o acesso ` uma posio inexistente, a a ca ser gerada uma exceo do tipo ArrayIndexOutOfBounds. a ca

23

2.6.2

Exerc cios

1. Qual o e ndice de Hommer no seguinte Array?


1 2 3

String[] simpsons { "Bart", "Lisa", "Hommer", "Marge", "Meg" };

2. 3. 4. 5.

Escreva uma expresso que se rera ao string Lisa no Array. a Qual o valor da expresso simpsons.length ? e a Qual o e ndice o ultimo item do array ? Qual o valor da expresso simpsons[3] ? e a

2.7

Exerc cios de Reviso a

1. Crie uma aplicao que mostre na tela de console o contedo de um ca u Array de Strings, como o do exerc na Seo 2.6.2. cio ca 2. Corrija e compile o cdigo a seguir: o
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

/ classe de exerccios. public Class umaClasse { public void main (string[] args) { metodo1; metodo2; } public static void metodo1() { int = 5; for (i = 0; i < max; i++) { System.Out.println(Uma mensagem qualquer) } public static void metodo2 { variavel = 5.5f; System.Out.println(Outra mensagem qualquer) } }

24

Cap tulo 3 Orientao a Objetos em Java ca


3.1 Classes

Programar em Java criar classes, e o primeiro passo para a construo e ca de classes o planejamento. Qual so os servios (mtodos) da classe ? Quais e a c e so seus atributos ? Um exemplo pode ser uma classe que represente uma a pessoa: -----------------------------| Pessoa | -----------------------------| Nome: String | | Idade: Inteiro | | Sexo: Caracter | -----------------------------| informeNome(): String | | informeIdade(): Inteiro | | informeSexo(): Caracter | | definaNome(String nome) | | definaIdade(Inteiro idade) | | definaSexo(Caracter sexo) | -----------------------------No diagrama acima, a primeira parte representa o nome da classe. Na segunda diviso esto os atributos e seus tipos. Na terceira parte esto os a a a mtodos implementados pela classe. Os valores entre parnteses so os argue e a mentos requeridos pelo mtodo. Quando no h argumentos, os parnteses e a a e esto vazios. O tipo do valor que retornado pelo mtodo est depois dos a e e a dois pontos. Quando no h valor de retorno (void), os dois pontos so a a a omitidos. A classe Pessoa somente implementa mtodos de acesso aos seus atributos. e Mtodos de acesso (tambm chamados getters e setters) so funes e e a co que permitem obter e alterar os valores dos atributos de uma classe. Por estarem sempre presentes, os mtodos de acesso normalmente so omitidos e a de diagramas como o anterior. A segunda etapa de construo de uma classe a traduo para o cdigo. ca e ca o Em Java, a classe Pessoa pode ser implementada da seguinte forma: 25

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59

/** * Classe que representa uma Pessoa */ public class Pessoa { // aqui comea a declara~o dos atributos c ca // os atributos devem ser sempre protegidos!! protected String nome; /* a varivel nome um String protegido a e (s pode ser acessado dentro da classe)*/ o protected int idade; protected char sexo; /* os outros atributos tambm s~o protegidos, e a mas s~o tipos primitivos (int e char) */ a // aqui comeam os mtodos da classe c e /* o mtodo informeNome publico, e e retorna um String, e n~o tem argumentos */ a public String informeNome() { // a nica coisa que este mtodo faz u e e // retornar a varivel nome. a return(nome); } public int informeIdade() { return(idade); } public char informeSexo() { return sexo; }

/* o mtodo definaNome publico, e e n~o tem nenhum valor de retorno a e toma um String como argumento */ public void definaNome (String nome) { // este mtodo define o attributo e // nome desta classe (this.nome) como // o nome que foi informado como par^metro a this.nome = nome; } public void definaIdade (int idade) { this.idade = idade; } public void definaChar (char sexo) { this.sexo = sexo; } // aqui s~o definidos os construtores da classe a // O Primeiro construtor n~o tem argumentos a public Pessoa () {

26

60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82

// como n~o foram definidos argumentos, a // os atributos recebem valores nulos. this.nome = ""; this.idade = 0; this.sexo = I; } // o segundo construtor toma como argumento // somente o nome da pessoa; public Pessoa (String nome) { this.nome = nome; this.idade = 0; this.sexo = I; } // um terceiro construtor toma como argumento // todos os dados da pessoa public Pessoa (String nome, int idade, char sexo) { this.nome = nome; this.idade = idade; this.sexo = sexo; } }

Um exemplo um pouco mais complexo o de uma la do tipo FIFO1 : e -----------------------------| Fila | -----------------------------| elementos: Object[] | | tamanho: int | -----------------------------| inclua(Object elemento) | | remova(): Object | | informeTamanho():int | -----------------------------Os atributos da classe so um array de Objetos e um valor inteiro que a indica o tamanho atual da la. Seus mtodos so inclua, que inclui um e a objeto no nal da la, e remova, que remove e retorna o elemento que est a no in da la. Tambm h um mtodo que informa o tamanho atual da cio e a e la. A implementao ca assim: ca
1 2 3 4 5 6 7 8 9 10 11

/** * Classe que implementa uma fila FIFO */ public class Fila { protected Object[] elementos; protected int tamanho; /** * Cria uma nova fila, de tamanho mximo 100 a */
1

First in, First Out - O primeiro que entrou o primeiro a sair e

27

12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60

public Fila() { tamanho = 0; elementos = new Object[100]; } /** * Cria uma nova fila, de tamanho * mximo indicado no argumento a */ public Fila(int tamanhoMax) { tamanho = 0; elementos = new Object[tamanhoMax]; } /** * Retorna o tamanho da fila */ public int informeTamanho() { return tamanho; } /** * Remove e retorna o primeiro elemento da fila */ public Object remova() { // guarda o primeiro elemento da fila. Object primeiro = elementos[0]; // desloca todos os elementos uma posi~o ca // para a esquerda. for (int i = 0;i < tamanho - 1 ; i++ ) { elementos[i] = elementos[i+1]; } // diminui o tamanho da fila tamanho--; // retorna o elemento que foi guardado return(primeiro); } /** * Inclui um elemento na fila */ public void inclua(Object elemento) { // inclui o elemento na ltima posi~o u ca elementos[tamanho] = elemento; // aumenta o tamanho da fila tamanho++; } }

3.1.1

Exerc cios

Construa uma classe que implemente uma Pilha (la do tipo LIFO2 ). Os mtodos so o mesmos da la FIFO, mas a funcionalidade interna deve ser e a alterada para que o elemento removido seja sempre o ultimo elemento que foi inserido.
2

Last In, First Out - O ultimo que entrou o primeiro a sair e

28

3.2

Interfaces

Uma interface uma srie de denies de mtodos sem a sua implee e co e mentao. Interfaces podem ser usadas para: ca Denotar similaridades entre classes sem ter que forar um relacionac mento (como herana) entre as duas. c Declarar mtodos que uma ou mais classes devem implementar e Revelar a interface do objeto sem revelar sua classe. No exemplo anterior das las, poderia ser criada uma interface Fila, na qual seriam especicados os mtodos que uma la deve implementar. Difee rentes tipos de la (LIFO, FIFO) implementariam esta interface de maneira diferente, mas todos eles ainda seriam Filas. A interface Fila poderia ser denida assim:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

public interface InterfaceFila { /** * Retorna o tamanho da fila */ public int informeTamanho(); /** * Remove e retorna um elemento da fila, * de acordo com a hieraquia da fila (LIFO ou FIFO) */ public Object remova(); /** * Inclui um elemento na fila, * de acordo com a hieraquia da fila (LIFO ou FIFO) */ public void inclua(Object elemento); }

Construtores podem ser denidos em uma interface. Para implementar uma interface usa-se a palavra-chave implements:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

public class FilaFIFO implements Fila {

// aqui vai a implementa~o de todos ca // os mtodos indicados na interface Fila e

public class UmaClasse implements UmaInterface, OutraInterface { // uma classe pode implementar vrias interfaces a }

29

3.3

Herana c

Embora nem sempre declarem explicitamente, todas as classes em Java usam herana, ou seja, todas elas tem uma superclasse, ou classe base. A c classe base de Java Object, e dela todas as outras so derivadas, direta e a ou indiretamente. Para derivar uma classe de outra, usa-se a palavra-chave extends. Subclasses: Herdam os membros da superclasse que so declarados pblicos (pua u blic), protegidos (protected) e que no tem especicador de acesso. a No herdam um membro da superclasse se a subclasse declara um mema bro com o mesmo nome. No caso das variveis, a subclasse esconde a a varivel da superclasse, e no caso dos mtodos a subclasse sobrescreve a e os mtodos da superclasse. e A subclasse pode referir-se a um membro da superclasse atravs da palavrae chave super. Mtodos da superclasse que forem declarados como nal no e a podem ser sobrescritos. O exemplo a seguir mostra a classe Cliente, que uma subclasse de e Pessoa.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

public class Cliente extends Pessoa {

// a classe cliente tem todos os atributos // de pessoa, alm dos especificados abaixo e protected int cpf; protected int numeroDeCliente; public int informeNumeroDeCliente () return(numeroDeCliente); } {

// aqui vai o restante dos mtodos da classe e // a subclasse pode reescrever os mtodos e // da superclasse: public void definaNome (String nome) { /* este mtodo sobreescreve o mtodo e e da superclasse, e define o nome do cliente (que uma Pessoa) e como Bart Simpson, sem considerar o argumento this.nome = "Bart Simpson"; }

*/

public void definaIdade(int idade) { // este outro mtodo chama o mtodo da superclasse e e // depois aumenta a idade em 1 super.definaIdade(idade); this.idade++; }

30

3.4

Classes Abstratas

Uma classe abstrata pode ser denida como um estgio intermedirio a a entre a interface e a classe nal. No exemplo das Filas LIFO e FIFO, poderia ser constru uma classe abstrata que implementasse as funes comuns `s da co a duas classes. Neste caso, a unica funo em comum seria informeTamanho, ca j que esta implementada da mesma maneira nas duas classes. Os atributos a e em comum tambm podem ser denidos. A classe abstrata caria assim: e
1 2 3 4 5 6 7 8 9 10 11 12 13 14

public abstract class FilaAbstrata implements InterfaceFila { /* a classe abstrata pode definir os atributos comuns a `s suas subclasses */ protected Object[] elementos; protected int tamanho; /* O nico mtodo definido pela classe u e abstrata informeTamanho() */ e public int informeTamanho() { return(tamanho); } }

Agora as subclasses devem extender a classe abstrata e implementar o restante da interface:


1 2 3 4 5 6 7

public class FilaFIFO extends FilaAbstrata implements InterfaceFila { // os atributos j foram definidos na FilaAbstrata a // s preciso implementar os mtodos restantes o e e }

3.5

Tratamento de Excees co

Uma exceo um evento que ocorre durante a execuo de um programa ca e ca e que interrompe o uxo natural de instrues. Apesar de no ser um conco a ceito da Programao Orientada a Objetos, o tratamento de excees uma ca co e parte fundamental de qualquer aplicao. Java tem um dos sistemas de traca tamento de exceo mais ecientes entre as linguagens atuais, e proporciona ca uma maneira segura e relativamente simples de lidar com os erros: todas as excees so objetos. co a No exemplo anterior das Filas, h uma srie de erros que podem ocorrer, a e mas no foram tratados: a E se o usurio tentar remover um elemento de uma la vazia ? a E se o usurio tentar inserir um elemento em uma la cheia ? a Para tratar estas poss veis falhas poderiam ser denidas duas excees: co

31

1 2 3 4 5 6 7 8

// uma exce~o extende Exception ca public class ExcecaoFilaCheia extends Exception { public ExcecaoFilaCheia () { // o construtor chama o construtor da superclasse super("**ERRO** A fila esta cheia!"); } } // uma exce~o extende Exception ca public class ExcecaoFilaVazia extends Exception { public ExcecaoFilaVazia () { // o construtor chama o construtor da superclasse super("**ERRO** A fila esta vazia!"); } }

1 2 3 4 5 6 7 8

Agora necessrio adaptar o cdigo da classe la: e a o


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

/** * Remove e retorna o primeiro elemento da fila * Joga a ExcecaoFilaVazia se a fila estiver vazia */ public Object remova() throws ExcecaoFilaVazia { // se o tamanho da fila for = 0, joga a exce~o ca if (tamanho == 0) throw new ExcecaoFilaVazia(); /* quando o mtodo joga a exce~o, o restante e ca do cdigo ignorado. o e /* se n~o houve erros, a guarda o primeiro elemento da fila. */ Object primeiro = elementos[0]; // desloca todos os elementos uma posi~o ca // para a esquerda. for (int i = 0;i < tamanho - 1 ; i++ ) { elementos[i] = elementos[i+1]; } // diminui o tamanho da fila tamanho--; // retorna o elemento que foi guardado return(primeiro); } /** * Inclui um elemento na fila * Joga a ExcecaoFilaCheia se a fila estiver cheia */ public void inclua(Object elemento) throws ExcecaoFilaCheia{ /* se o tamanho da fila for igual ao tamanho do array, joga a exce~o */ ca if (tamanho == elementos.length) throw new ExcecaoFilaVazia(); /* se n~o houver erros, a inclui o elemento na ltima posi~o */ u ca elementos[tamanho] = elemento; // aumenta o tamanho da fila

32

40 41

tamanho++; }

Agora preciso adaptar o uso desta la para pegar a exceo: e ca


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

// antes, a fila era usada simplesmente chamando os mtodos: e Fila fila = new Fila(100); fila.inclua(umObjeto); fila.inclua(outroObjeto); . . . outroObjetoAinda = fila.remova();

/* agora necessrio "pegar" a exce~o e a ca (e fazer algo com ela) */ Fila fila = new Fila(100); // agora, tenta-se incluir elementos try { fila.inclua(umObjeto); fila.inclua(outroObjeto); } catch (ExcecaoFilaCheia excecao) { // se ocorreu uma exce~o deste tipo ca // mostre uma mensagem na tela. System.out.println("Impossvel incluir elemento, a fila est cheia"); a } // tentando remover elementos try { outroObjetoAinda = fila.remova(); } catch (ExcecaoFilaVazia excecao) { // se ocorreu uma exce~o deste tipo ca // mostre uma mensagem na tela. System.out.println("Impossvel remover elemento, a fila est vazia"); a }

3.6

Exerc cios de Reviso a

Construa um aplicativo que use uma la LIFO e outra FIFO. A interface deve denir os mtodos j apresentados anteriormente, e outros dois mtodos, e a e estaCheia() e estaVazia(). Alm disto, as excees que sero jogadas pelos e co a mtodos devem ser denidas na interface. Deve ser constru uma classe e da abstrata, que dena mtodos em comum entres as las LIFO e FIFO, e estas e devem estender a classe abstrata e implementar a interface. A aplicao deve simplesmente incluir e remover elementos do tipo String ca das las, e mostrar os elementos inclu dos e removidos na tela de console. Tambm devem ser mostradas mensagens quando houverem excees. Inclua e co documentao no formato JavaDoc. ca

33

Cap tulo 4 Construo de Aplicaes em ca co Java


4.1 Pacotes

Se programar em Java criar classes, construir aplicaes em Java e co e usar classes. Pacotes, atravs dos arquivos JAR, fornecem uma maneira e conveniente de distribuir e usar um conjunto de classes, como uma livraria.

4.1.1

Construo de Pacotes ca

Para incluir uma classe em um pacote, inclui-se a palavra-chave package antes do in cio da declarao da classe. A classe FilaFIFO poderia estar ca inclu em um pacote: da
1 2 3 4 5

package cursojava.ed.filas public class FilaFIFO { ... }

O pacote denido foi cursojava.ed.filas, ou seja, o Pacote filas faz parte de um pacote ed (estruturas de dados), que faz parte de um pacote cursojava. A estrutura do nome do pacote deve estar reetida na estrutura de diretrios onde estes arquivos esto localizados. Sendo aso a sim, os arquivos FilaFIFO.class e FilaFIFO.java devem estar no diretrio o /cursoJava/ed/filas. Um conjunto de classes que implementasse diferentes tipos de rvores poderia estar localizado em /cursoJava/ed/arvores, e a assim por diante. A ferramenta jar junta todas as classes de um pacote em um unico arquivo no formato zip. Para criar um arquivo jar usa-se o seguinte comando1 :

jar cvf nomedopacote.jar diretorio/UmaClasse.class outroDiretorio/OutraClasse.class


1

Para mais informaes sobre a ferramenta JAR, consulte a documentao do JDK [4]. co ca

34

Conforme o nmero de classes aumenta, pode-se tornar cansativo digitar u todos os nomes cada vez que o pacote for atualizado, portanto pode ser util manter um arquivo de lote que empacote todas as classes.

4.1.2

Utilizao de Pacotes ca

Para usar uma classe que est em um pacote exterior ao atual, usa-se a a palavra-chave import. Uma aplicao que usasse as classes contidas no ca pacote cursojava.ed.filas caria assim:
1 2 3 4 5 6 7 8

import cursojava.ed.filas; public class Aplicacao { public static void main(String[] args) { } }

Tambm necessrio informar ao compilador e ao interpretador o arquivo e e a onde as classes do pacote esto localizadas. Supondo que o arquivo do pacote a usado seja cursojava.jar, a sintaxe de compilao e execuo caria assim ca ca (no Windows):

javac -classpath .;cursojava.jar Aplicacao.java java -classpath .;cursojava.jar Aplicacao.java

Diferentes locais de classpath so separados por ; no Windows e : no a UNIX. O . indica o diretrio atual. o O API do Java possui uma srie de classes uteis que esto distribu e a das por diversos pacotes. O uso destes pacotes segue a mesma lgica do exemplo o acima. Informaes estas classe esto dispon co a veis na documentao do Java ca API. Se por alguma razo for necessrio extrair as classes de um pacote usa-se a a o seguinte comando: jar -xf pacote.jar

Alternativamente, pode-se usar um descompactador de arquivos zip, como o Winzip ou o unzip.

4.1.3

Exerc cios

Empacote as classes criadas na Seo 3.6, na pgina 33. Inclua as direca a tivas package e import nas classes, crie uma estrutura de diretrios, recompile o as classes, e use a ferramenta jar para criar o pacote.

35

4.2

Documentao ca

A documentao pea fundamental na reusabilidade de classes. Se no ca e c a houvesse a documentao detalhando o funcionamento dos mtodos, como ca e estes poderiam ser usados ? Como seriam diferenciados mtodos com nomes e parecidos, ou mesmo iguais em classes diferentes ? Javadoc uma ferramenta que compila a documentao de uma srie e ca e de classes Java em pginas HTML, descrevendo as classes, construtores, a mtodos e atributos protegidos e pblicos. e u E poss usar o Javadoc em pacotes inteiros, classes individuais, ou amvel bos. No primeiro caso, os argumentos so uma srie de nomes de pacotes. No a e segundo, uma srie de arquivos fonte. Vale lembrar que o Javadoc processa e os arquivos .java, e no os .class, portanto necessrio que estes arquivos a e a estejam no pacote para que a documentao seja constru ca da. 2 O exemplo a seguir mostra o uso bsico do Javadoc . a javadoc -classpath .;umpacote.jar -d umdiretorio/docs cursojava.ed.filas cursojava.ed.arvores cursojava.aplicacoes

4.2.1

Exerc cios

Use a ferramenta Javadoc para criar a documentao do pacote criado na ca Seo 4.1.3. ca

4.3

Entrada e Sa da

Muitas vezes necessrio que uma aplicao carregue informaes de uma e a ca co fonte externa, ou guarde informaes em um local externo. Este local pode co ser um arquivo, um disco, um lugar na rede, etc. A informao tambm ca e pode ser de qualquer tipo: objetos, caracteres, imagens ou sons. Para trazer informaes externas, um programa abre uma corrente (stream) de dados co e l a informao da seguinte maneira: e ca abre uma corrente enquanto houver mais informa~o ca l^ informa~o e ca fecha a corrente De maneira similar, pode-se enviar informaes para uma fonte externa. co abre uma corrente enquanto houver mais informa~o ca escreve informa~o ca fecha a corrente O pacote java.io, do Java API, tem uma srie de classes para leitura e e escrita de dados, tanto na forma de bytes como caracteres.
2 Para mais informaes sobre a ferramenta Javadoc, consulte a documentao do co ca JDK [4].

36

4.3.1

O Bsico do I/O em Java a

O exemplo a seguir mostra um exemplo simples de uma aplicao que ca copia um texto de um arquivo para outro:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

// importa todas as classes do pacote java.io import java.io.*; public class IOBasics { // o mtodo main joga a exece~o IOException e ca public static void main(String[] args) throws IOException { // define dois arquivos com a classes File File arquivoEntrada = new File("c:/The Simpsons Episode List.txt"); File arquivoSaida = new File("d:/copia.txt"); // define um leitor e um escritor de caracteres // (classes FileReader e FileWriter) FileReader in = new FileReader(arquivoEntrada); FileWriter out = new FileWriter(arquivoSaida); // caracteres podem ser representados como inteiros // (o contrrio n~o vlido) a a e a int caracter; // O caracter -1 indica que o arquivo acabou. while ((caracter = in.read()) != -1) // enquanto o arquivo n~o acabar, escreve o que foi lido. a out.write(caracter); // fecha o leitor e o escritor de arquivos in.close(); out.close(); } }

Vale lembrar que Java trabalha com caracteres Unicode, o que no acona tece com a maioria dos sistemas operacionais atuais, portanto pode haver diferenas entre os arquivos. c

4.3.2

Arquivos de Acesso Aleatrio o

Classes como FileReader e FileWriter somente permitem acesso seqenu cial ` informao. Ainda que bastante util, o acesso seqencial a arquivos a ca u e uma herana de meios de estocagem antigos, como tas magnticas, que s c e o permitiam este tipo de acesso. Arquivos de acesso aleatrio, por outro lado, o permitem aceso no seqencial (aleatrio) aos contedos de uma arquivo. a u o u A classe RandomAcessFile, alm de permitir escrita e leitura no seqene a u cial de arquivos, implementa uma srie de facilidades para I/O, e tem mtodos e e para leitura e escrita de caracteres, nmeros inteiros, em ponto utuante, etc. u O exemplo a seguir mostra o uso de alguns mtodos da classe (cuja docue mentao completa encontrada na documentao do Java API [3]). Nesta ca e ca aplicao, considera-se que o arquivo randomacess.dat tem a seguinte esca trutura:

37

1. Um nmero inteiro (int) que indica o nmero de caracteres contidos no u u prximo item. o 2. Uma seqencia de caracteres, de tamanho indicado no item anterior u 3. Um nmero inteiro curto (short), que indica o nmero de valores em u u ponto utuante contidos no prximo item o 4. Uma srie de nmeros em ponto utuantes, de tamanho indicado no e u item anterior
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47

import java.io.*; public class IOAcessoAleatorio { public static void main(String[] args) throws Exception { escrevaArquivo(); leiaArquivo(); } // o mtodo escrevaArquivo joga todas as exce~es e co // que possivelmente ocorrerem public static void escrevaArquivo() throws Exception { int numChars = 0; File file = new File("c:/randomacess.dat"); // cria um RandomAcessFile com par^metros: um arquivo, a // e indica~o de que o acesso ser de leitura e escrita ("rw") ca a RandomAccessFile out = new RandomAccessFile(file,"rw"); String texto = "The Long Dark Tea-Time Of The Soul"; // escreve um inteiro do arquivo, que indica o numero // de caracteres do string a ser escrito out.writeInt(texto.length()); // escreve a sequencia de caracteres out.writeChars(texto); float[] floats = { 1.1f, 2.2f, 3.3f, 4.4f, 5.5f, 6.6f, 7.7f, 8.8f, 9.9f, 0.0f }; // escreve um inteiro curto do arquivo, que indica o numero // de floats que ser~o escritos escrito a out.writeShort(floats.length); // escreve os floats for (int i = 0; i < floats.length; i++ ) { out.writeFloat(floats[i]); } out.close(); }

// o mtodo leiaArquivo joga todas as exce~es e co // que possivelmente ocorrerem public static void leiaArquivo() throws Exception { int numChars = 0; File file = new File("c:/randomacess.dat"); // cria um RandomAcessFile com par^metros: um arquivo, a // e indica~o de que o acesso ser de leitura e escrita ("rw") ca a RandomAccessFile in = new RandomAccessFile(file,"rw"); // l^ um inteiro do arquivo e

38

48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

numChars = in.readInt(); // l^ numChars caracteres unicode e os armazena em um e // StringBuffer (Classe de Strings variveis) a StringBuffer texto = new StringBuffer(); for (int i = 0; i < numChars; i++) { // o mtodo append adiciona um caracter no final do String e texto.append(in.readChar()); } // l^ um inteiro curto do arquivo e short numFloats = in.readShort(); float[] floats = new float[numFloats]; // l^ numFloats valores em ponto flutuante e // e os armazena em um array de floats for (int i = 0; i < numFloats; i++ ) { floats[i] = in.readFloat(); } in.close(); }

4.3.3

Serializao ca

A serializao (serialization), atravs das classes ObjectInputStream e ca e ObjectOutputStream, permite ler e escrever objetos. Alm de permitir estoe cagem de objetos no disco para o uso futuro em uma aplicao, a serializao ca ca tambm usada na comunicao entre objetos via sockets, atravs do RMI3 . e e ca e Leitura e Escrita de Objetos As classes ObjectOutputStream, FileInputStream juntamente com as classes FileOutputStream, FileInputStream permitem que um objeto serializado seja escrito e lido em um arquivo. Sua utilizao bastante simples: ca e
1 2 3 4 5 6 7 8 9 10

FileOutputStream out = new FileOutputStream("c:/aData.dat"); ObjectOutputStream s = new ObjectOutputStream(out); s.writeObject("Hoje"); s.writeObject(new Date()); s.flush(); FileInputStream in = new FileInputStream("c:/aData.dat"); ObjectInputStream s = new ObjectInputStream(in); String hoje = (String)s.readObject(); Date data = (Date)s.readObject();

Classes Serializveis a Somente classes serializveis podem ter seus objetos escritos em arquia vos. As classes serializveis devem implementar a interface Serializable: a
1 2 3

public class UmaClasseSerializavel implements Serializable { // n~o preciso implementar nenhum mtodo! a e e }
3

Remote Method Invocation - Invocao de Mtodos Remotos ca e

39

4.3.4

I/O no Console

A classe System tem como atributo os objetos in e out, das classes InputStream e PrintStream, respectivamente. Como j foi visto, a exibio a ca de uma mensagem na tela de console pode ser feita chamando os mtodos e print(String msg) e println(String msg) da classe PrintStream. Entretanto, a leitura de mensagens ou caracteres digitadas atravs de um teclado e no to simples. O mtodo read() da classe InputStream l somente bytes, a e a e e que devem ser convertidos para caracteres, inteiros, etc. O mtodo read() e bastante simplista, e dicilmente ser usado diretamente, portanto nee a e cessrio criar ou usar outros mtodos para fazer a leitura. A classe a seguir a e usa um BufferedReader (Classe do API Java [3]) para ler mensagens do teclado.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

// a classe BufferedReader est no pacote java.io a import java.io.*; public class LeitorDeTeclado { private BufferedReader br; public // // // br } LeitorDeTeclado() { cria um novo BufferedReader, indicando que a entrada ser a "default", ou seja, a System.in = new BufferedReader(new InputStreamReader(System.in));

// mtodo leitor padr~o, mostra uma mensagem(argumento) e a // e l^ um string digitado e private String leia(String s) { String string = ""; System.out.print(s); try { // tenta ler uma linha string = br.readLine(); } catch(IOException ioexception) { // se houver uma exce~o, indica um erro e sai da aplica~o ca ca System.out.println("Erro, nao foi possivel ler..."); System.exit(1); } return string; } // os mtodos a seguir convertem o que foi lido para e // um tipo especfico. public byte leiaByte(String s){ return Byte.parseByte(leia(s)); } public int leiaInt(String s){ return Integer.parseInt(leia(s)); }

40

44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74

public long leiaLong(String s){ return Long.parseLong(leia(s)); } public short leiaShort(String s){ return Short.parseShort(leia(s)); } public double leiaDouble(String s){ return Double.parseDouble(leia(s)); } public float leiaFloat(String s){ return Float.parseFloat(leia(s)); } public char leiaChar(String s){ return leia(s).charAt(0); } public String leiaString(String s){ return leia(s); } // retorna true se o que foi digitado foi igual a msgtrue, // e retorna false se for diferente de msgtrue. public boolean leiaBoolean(String s, String msgtrue, String msgfalse) { return msgtrue.equalsIgnoreCase(leia(s+" "+msgtrue+" "+msgfalse)); } }

4.4

Threads

Um programa seqencial tem um in u cio, uma seqncia de execuo e um ue ca m. Uma thread similar ao programa seqencial, mas no um programa e u a e em si, e roda dentro de um programa. O uso de uma s thread (ou tarefa) no util. O benef de usar threads o a e cio est na possibilidade de executar vrias threads em um unico programa, a a rodando ao mesmo tempo. Para uma classe ser uma thread, ela deve extender a classe Thread:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

public class ThreadSimples extends Thread { public ThreadSimples(String str) { // o construtor chama o construtor da superclasse. // str ser o nome da thread, que ser passado como a a // argumento, e ser usado mais tarde a super(str); } // este mtodo o principal de qualquer thread e e public void run() { /* em cada iteraao mostrado o numero da itera~o, c e ca e o nome da Thread, depois a thread "dorme" (sleep) por um intervalo rand^mico entre 0 e 1000 milisegundos */ o

41

16 17 18 19 20 21 22 23 24 25 26

for (int i = 0; i < 10; i++) { System.out.println(i + " " + getName()); try { sleep((long)(Math.random() * 1000)); } catch (InterruptedException e) {} } /* quando todas as itera~es terminaram, co e mostrada a mensagem "Pronto!" e o nome da thread */ System.out.println("Pronto! " + getName()); } }

A thread acima pode ser usada como um conselheiro amoroso na aplicao ca Bem me quer, mal me quer.
1 2 3 4 5 6 7

public class BemMeQuer { public static void main (String[] args) { // duas ThreadSimples s~o criadas e iniciadas a new ThreadSimples("Bem me quer").start(); new ThreadSimples("Mal me quer").start(); } }

A sa deve ser algo assim: da 0 Bem me quer 0 Mal me quer 1 Bem me quer 1 Mal me quer 2 Bem me quer 2 Mal me quer 3 Bem me quer 3 Mal me quer 4 Bem me quer 4 Mal me quer 5 Mal me quer 5 Bem me quer 6 Mal me quer 7 Mal me quer 6 Bem me quer 8 Mal me quer 7 Bem me quer 9 Mal me quer Pronto! Mal me quer 8 Bem me quer 9 Bem me quer Pronto! Bem me quer Bem me quer! Estou com sorte. . . Outra tcnica para a criao de threads a implementao da interface e ca e ca Runnable. Para mais informaes, consulte o Tutorial Java [2]. co

42

Apndice A e Um Primeiro Programa em Java


A.1 Instalao e Congurao do JDK ca ca

A ultima verso Java Standard Development Kit (J2SDK) pode ser ob a tida em http://java.sun.com. Neste s tambm podem ser obtidos a tio e documentao e o Tutorial Java. Aps descarregar e instalar o kit, deve-se ca o adicionar o diretrio que contm os arquivos executveis ao Path (camio e a nho) do sistema. No Windows basta adicionar a seguinte linha ao arquivo autoexec.bat: PATH = %PATH%;C:\JDK1.x.x\bin onde C:\JDK1.x.x o local da instalao do JDK. Para testar se o sistema e ca est congurado, digite javac em uma janela de console (Prompt de Coa mando). Se tudo estiver OK, o compilador ser executado e imediatamente a nalizado.

A.2

Criao do Cdigo Fonte ca o

Digite o cdigo a seguir em um editor de texto qualquer (Notepad, vi, pico, o etc.). Salve o arquivo com o nome de OlaJava.java. Durante a digitao, ca tome cuidado com letras maisculas e minsculas, pois Java faz distino u u ca entre as duas. Cuide tambm dos ponto-e-v e rgulas e do fechamento de chaves.
1 2 3 4 5 6 7 8 9 10 11 12

/** * A classe OlaJava implementa uma aplica~o que ca * simplesmente mostra "Ola Java !" na tela de console. */ public class OlaJava { public static void main(String[ ] args) { System.out.println("Ola Java !"); } }

43

A.3

Compilao ca

Para compilar o cdigo, abra uma janela de console e v ao diretrio onde o a o o arquivo OlaJava.java se encontra. Digite o seguinte comando: javac OlaJava.java Se no houver erros, o cdigo ser compilado e ser gerado um arquivo a o a a chamado OlaJava.class. Um poss vel erro o sistema no reconhecer o e a comando javac. Se for este o caso, consulte a seo de instalao e conca ca gurao. Podem tambm ocorrer erros de compilao. Neste caso, reedite o ca e ca arquivo, procurando por erros.

A.4

Execuo ca

Para executar a aplicao, digite: ca java OlaJava A linha Ola Java ! deve aparecer na tela. Se ocorrer o erro Exception in thread "main" java.lang.NoClassDefFoundError: OlaJava o arquivo compilado no foi gerado. a

44

Apndice B e Glossrio de Termos a


Abstract Window Toolkit (AWT) Coleo de componentes para consca truo de Interfaces Grcas com o Usurio. O AWT est desatualica a a a zado, e foi substitu pelo Projeto Swing. do abstract Palavra-chave que indica que uma classe no deve ser instanciada, a mas sim servir como tipo base para outras classes. API Application Programming Interface. Especicao de como feito o ca e acesso ao comportamento e estado de classes e objetos. applet Um programa escrito em Java para rodar em um browser de Internet. argumento Um item de dado especicado em uma chamada de mtodo. e array Uma coleo de itens de dados do mesmo tipo, no qual a posio de ca ca cada dado indicada por um nmero inteiro e u bit A menor unidade de informao em um computador, com valor 1 ou 0. ca bloco de cdigo Em Java, qualquer cdigo entre chaves. o o booleano Uma varivel ou expresso que pode ter unicamente um valor a a verdadeiro ou falso. byte Uma seqncia de oito bits ue bytecode Cdigo independente de mquina gerado pelo compilador Java e o a executado pelo interpretador Java. casting Converso de um tipo de dado para outro. a classe abstrata Uma classe que contm um ou mais mtodos abstratos, e e portanto no pode ser instanciada. a compilador Programa que traduz o cdigo fonte para um cdigo que pode o o ser executado por um computador. escopo Indica o alcance de um membro de uma classe. GUI Graphical User Interface. Interface grca com o usurio. a a

45

mquina virtual Denio abstrata de um computador, que pode ser ima ca plementada de maneiras diferentes, via software ou hardware. mtodo abstrato Um mtodo que no tem implementao. e e a ca multithreaded Uma aplicao que tem partes do cdigo executada em paca o ralelo. null Palavra-chave usada para especicar um valor indenido a uma varivel. a operador binrio Um operador que tem dois argumentos a overriding (sobrescrever) Designar uma implementao de um mtodo ca e em uma subclasse diferente daquela da superclasse. pacote Um grupo de classes. preciso simples Numero em ponto utuante com preciso de 32 bits. a a subclasse Uma classe derivada de outra classe. super Palavra-chave para acessar membros da superclasse da classe na qual ela usada. e e superclasse Uma classe da qual outra(s) classes so derivadas a Swing Coleo de componentes independentes de plataforma usados para ca construo de Interfaces Grcas com o Usurio. ca a a this Palavra-chave usada para designar a classe na qual ela aparece. thread Unidade bsica de execuo. Um processo pode ter vrias threa ca a ads rodando ao mesmo tempo, cada uma desempenhando uma tarefa diferente. Unicode Codicao de 16-bits de caracteres denida pelo ISO 10646 ca varivel Um item de dados identicado por um identicador a void Palavra-chave usada na declarao de um mtodo para indicar que o ca e mesmo no retorna nenhum valor. a wrapper Um objeto que encapsula e delega a outro objeto para alterar sua interface e comportamento.

46

Referncias Bibliogrcas e a
[1] Bruce Eckel. Thinking In Java, 2nd Edition. Prentice-Hall, Segunda Edio, 2000. Dispon para download em http://www.BruceEckel.com ca vel [2] Lisa Friendly, Mary Campione, Kathy Walrath, Alison Huml. The Java Tutorial. Sun Microsystems, Segunda Edio, 2000. Dispon ca vel para download e online em http://java.sun.com/docs/books/tutorial/ [3] Sun Microsystems Java 2 Platform, Standard Edition, v 1.3.1 API Specication. Sun Microsystems, 2001. Dispon online e para download em vel http://java.sun.com/docs/ [4] Sun Microsystems Java 2 SDK, Standard Edition Documentation. Sun Microsystems, 2001. Dispon vel online e para download em http://java.sun.com/docs/ [5] James Gosling, Bill Joy, Guy Steele, Gilad Bracha. The Java Language Specication. Sun Microsystems, Segunda Edio, 2000. Dispon online ca vel em http://java.sun.com/docs/ [6] Leandro J. Komoniski. Programao em Linguagem Java. Departamento ca de Informtica e Estat a stica, UFSC, 2001.

47

S-ar putea să vă placă și