You are on page 1of 128

3

Mdulo

INSTITUTO DE SOFTWARE DO CEAR INSOFT

XI Semana da Tecnologia da Informao: na onda das frias

bsico e intermedirio

XI SEMANA DA TECNOLOGIA DA INFORMAO

Java bsico e intermedirio

60.150-160 Av Santos Dumont, 1180 Fortaleza - CE


Tel.: (85) 488.5200 Fax: (85) 488.5210

Instrutor:

Felipe Gacho

gaucho@atlantico.com.br
todos os direitos reservados

ndice analtico
A tecnologia Java

O que Java ?

O que mquina virtual ?

O que garbage collection ?

A estrutura de um cdigo em Java.


Exerccios

6
7

Implementando o primeiro programa

O ambiente de desenvolvimento

O cdigo fonte

Operadores de deslocamento (>>, <<, >>>)

24

Circuitos lgicos

25

Exerccios

26

Fluxo de controle

27

Ramificao if, else

27

Ramificao switch

28

Repetio for

29

Repetio while

30

Compilando e executando o programa

10

Comandos especiais de controle de fluxo: break,


continue e label
31

Erros mais comuns


Exerccios

11
12

Lendo valores do teclado

32

Exerccios

33

Sintaxe da linguagem Java

14

Delimitadores em Java
Comentrios

14
14

Identificadores e palavras reservadas


Declarando variveis em Java

Agrupamento de dados (Arrays)

34

Declarando e criando Arrays

34

15

Inicializando os valores de um Array

35

16

Array multi-dimensional

36

Array esparso

36

Exerccios

37

Tipos primitivos da linguagem Java


17
Tipos lgicos: boolean
17
Tipos textuais: char e String
17
Tipos numricos inteiros: byte, short, int e long
18
Tipos numricos de ponto flutuante: float e
double
19
Convenes de codificao
Exerccios
Expresses

Introduo Orientao a Objetos

38

Motivao ao uso de um novo paradigma,


orientado a objetos.

38

19
19

Tipos agregados de dados

39

Criando objetos

41

21

42

Operadores lgicos e aritmticos

21

Alocao de memria durante a criao de


objetos

Concatenao de Strings com o operador +

22

Atribuio de referncias a uma varivel

42

Promoo e Casting

23

Termos bsicos em Orientao a Objetos

43

J A V A

B S I C O

I N T E R M E D I R I O

44

O que so excees ?

73

Tipos abstratos de dados

44

Diferena entre excees e erros

73

Definio de mtodos

45

Tratamento de excees

74

A referncia this

48

Tratamento de excees em Java

75

A hierarquia das excees

76

Tratamento pendente de excees

77

Excees implementadas pelo programador

77

Sinalizando uma exceo (throw)


Throwable.printStackTrace() e
Throwable.getMessage()

78

Excees mais comuns

79

Exerccios

80

Abstrao de dados

Gerando a documentao de um programa javadoc


49
Documentao da API Java

50

Exerccios

50

Encapsulamento e sobrecarga de mtodos

52

Acessibilidade dos membros de uma classe

52

O modificador final

53

O modificador private

54

Encapsulamento

55

Sobrecarga de mtodos

55

Exerccios

56

Construtores

Interface grfica com o usurio

78

81

Componentes grficos o pacote AWT


Cdigo do exemplo de componentes AWT

81
83

57

Gerenciadores de Layout
Containers

86
86

57

Flow layout

87

Inicializao explcita de membros variveis 57

CardLayout

88

Construtores

59

BorderLayout

91

Exerccios

60

GridLayout

93

61

GridBagLayout

94

Processo de instanciao de objetos

Herana e polimorfismo

Applets

97

O conceito de classificao

61

A palavra reservada extends

62

O que um Applet ? (java.awt.Applet)

97

Herana em Java

63

Restries de segurana em applets

97

A superclasse Object

64

O primeiro applet

98

Polimorfismo

64

Ciclo de vida de um applet

100

Argumentos e colees heterogneas

65

Contexto grfico AWT

101

O operador instaceof

66

Aprendendo a usar o appletviewer

103

Exerccios

67

O cdigo HTML de carga do applet

103

68

Lendo parmetros do Html com um applet 105

Classes abstratas e concretas

68

Manipulando imagens

106

O modificador abstract

69

Exerccios

107

Classes abstratas e interfaces

Restrio de herana pelo modificador final 70


As referncias this e super

70

Exerccios

71

Tratamento de excees

73

Interfaces grficas baseadas em behaviorismo O


pacote Swing
108
O que Swing ?

108

Containers Swing

108

J A V A

B S I C O

I N T E R M E D I R I O

Introduo a padres de projeto (design


patterns)
109
Programao behaviorista - o paradigma
modelo-viso-controle (MVC)

110

Implementando um modelo em Java


(Observable)

113

Implementando vises para um modelo

114

Criando o primeiro aplicativo MVC

114

Acesso a dispositivos de entrada e sada - I/O

116

O que so I/O Streams ?

116

Leitura de dados (java.io.InputStream)

117

Escrita de dados (java.io.OutputStream) 118


As classes de manipulao de Streams em Java
(o pacote java.io)
118
Leitores e Escritores de dados em Streams com
buffer
120
Converso entre bytes e caracteres
O que UNICODE?

121
121

Manipulao de arquivos seqenciais

122

Manipulao de arquivos randmicos

123

Serializao de objetos
O que so Grafos de Objetos?
Lendo objetos serializados de um arquivo

124
124
125

Exerccios

126

A tecnologia Java

Esta seo contextualiza a tecnologia Java no mercado de informtica e enumera suas


principais caractersticas e termos.

O que Java ?
Java :
??
??
??

Uma linguagem de programao


Um ambiente de desenvolvimento
Um ambiente de aplicao

Java uma linguagem de programao desenvolvida pela SUN com o objetivo de manter o poder
computacional de C++, agregando caractersticas de segurana, robusteza e portabilidade.
Os objetivos primrios da SUN ao desenvolver a linguagem Java foram:
? ? Criar uma linguagem orientada a objetos
? ? Prover um ambiente de desenvolvimento com duas caractersticas bsicas:
o Velocidade de desenvolvimento, eliminando o ciclo compilar-ligar-carregar-testar
tradicional em outras linguagens como C++, Pascal, etc.
o Portabilidade prover um ambiente meta interpretado, permitindo que o mesmo cdigo
rode em diversos sistemas operacionais sem a necessidade de adaptao ou uso de
bibliotecas especficas.
? ? Eliminar exigncias de programao que tradicionalmente afetam a robusteza de um cdigo de
computador:
o Aritmtica de ponteiros (comum em ANSI C/C++)
o Controle de alocao/liberao de memria (comum em Pascal, C, C++, Basic, ...)
? ? Permitir a programao multitarefa, mesmo em sistemas operacionais que no dem suporte
nativo a Threads.
? ? Permitir que um programa seja dinamicamente modificado atravs da carga de componentes via
redes de computadores, como a Internet.
? ? Prover um modo de checar a integridade de um programa quanto sua origem, garantindo a
segurana do sistema operacional e de dados durante a sua execuo.
A arquitetura Java formada pelas seguintes caractersticas:
? ? A mquina virtual Java (JVM Java Virtual Machine, atualmente na verso 1.4)
? ? Gerenciador de alocao/liberao de memria (Garbage Collection)
? ? Sand box mdulo de garantia de segurana de cdigo ( impossvel criar um vrus em Java)

T E C N O L O G I A

J A V A

O que mquina virtual ?


De acordo com a especificao da SUN, a mquina virtual do Java pode ser vista como:
Uma mquina imaginria que implementada via software ou hardware. Um cdigo a
ser executado por essa mquina deve ser gravado em um arquivo com extenso
.class. e possuir um cdigo compatvel com as instrues Java.
Para um programa Java ser executado, ele precisa passar pelo processo ilustrado na figura abaixo:

O cdigo compilado, gerando um conjunto de instrues chamado de byte-code. Esse byte-code


aplicado Mquina Virtual Java (JVM) que se encarrega de interpretar os comandos para o sistema
operacional onde o programa est rodando. Ou seja, a mquina virtual traduz as instrues do cdigo
Java para instrues vlidas no sistema operacional em que est rodando. Se essa portabilidade fosse
requerida em C, o cdigo deveria ser compilado vrias vezes uma para cada sistema operacional
desejado. No caso do Java, o cdigo compilado apenas uma vez, gerando o byte-code. Esse byte-code
poder ento ser interpretado por qualquer mquina virtual Java, rodando em Linux, Windows, Palm OS,
Solaris ou qualquer outro sistema operacional que possua uma mquina virtual Java implementada.
(Compile once, run anywhere).
Uma JVM possui definies concretas para a implementao dos seguintes itens:
? ? Conjunto de instrues (equivalentes s instrues da CPU)
? ? Conjunto de registradores
? ? Formato padro de classes
? ? Pilha de memria
? ? Pilha de objetos coletados pelo garbage-collector
? ? rea de memria
IMPORTANTE: a JVM no permite que um programa Java acesse recursos de hardware diretamente,
protegendo o computador de operaes perigosas, como acesso regies protegidas da memria ou
formatao fsica do disco rgido.
Um programa Java s executado caso o seu byte-code passe pela verificao de segurana da JVM,
que consiste em dizer que:
? ? O programa foi escrito utilizando-se a sintaxe e semntica da linguagem Java
? ? No existem violaes de reas restritas de memria no cdigo
? ? O cdigo no gera Stack Overflow

T E C N O L O G I A

J A V A

??
??

Os tipos de parmetros dos mtodos so corretos


No existe nenhuma converso ilegal entre dados do programa, como a tentativa de converso
de inteiros em ponteiros
? ? O acesso a objetos est corretamente declarado
Caso alguma das condies acima no seja satisfeita, a mquina virtual Java causar um erro de
execuo (runtime error).

O que garbage collection ?


Durante a execuo de um programa de computador, ocorre a alocao e liberao dinmica de
memria RAM. Dados so escritos e lidos da memria do computador satisfazendo os requisitos de cada
programa. Em linguagens tradicionais como Pascal, Basic e C/C++, o programador responsvel por
controlar essa alocao, impedindo o estouro de memria (stack overflow) e outros problemas, como o
acesso indevido a reas reservadas de memria. Para facilitar a vida dos programadores, e evitar os
erros comuns associados alocao de memria, a linguagem Java introduziu um novo conceito: o
garbage-collection.
Garbage-collection um mecanismo de controle automtico de alocao e liberao de memria.
Quando uma varivel declarada em um cdigo de computador, a JVM cria um ponteiro para uma rea
de memria equivalente ao tamanho do tipo de dado utilizado por essa varivel. Quando essa varivel
associada a outra regio de memria, a JVM coloca o espao alocado anteriormente em uma pilha de
objetos em desuso. Caso o computador fique com pouca memria disponvel, a JVM remove objetos
dessa pilha, permitindo que esse espao de memria seja re-alocado.
O processo de garbage-collection ocorre automaticamente durante a execuo de um programa Java. O
programador no precisa se preocupar com aritmtica de ponteiros (grande dificuldade em linguagens
como C e Pascal).

A estrutura de um cdigo em Java.


Como todas as outras linguagens de programao, Java possui um formato bsico para a escrita de
cdigos. Tal formato demonstrado abaixo:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.

// Duas barras significam comentrio


/* comentrios tambm podem seguir o formato de C++ */
public class NomeDoPrograma
{
// O mtodo main sempre deve estar presente para que um cdigo
// Java possa ser executado:
static public void main(String[] args)
{
// aqui viro os comandos, que so parecidos com C++
}
}

Compreendendo o cdigo Java:


? ? linhas 1 e 2: representam comentrios. Um comentrio pode conter qualquer informao
relevante ao comportamento do programa, autor, verso, etc.
? ? linha 3: est em branco, pois Java permite linhas em branco entre os comandos

T E C N O L O G I A

??

??
??
??
??

J A V A

linha 4: a declarao do "nome do programa", que case-sensitive (existe diferena


entre maisculas e minsculas). O arquivo que contm o cdigo Java deve ser salvo com
o mesmo nome que aparece aps a declarao public class e mais a extenso .java (o
exemplo acima deveria ser salvo como NomeDoPrograma.java).
linha 5 e 9: a abertura de chave { indica incio de bloco (tal qual begin em Pascal)
linha 8: essa linha deve aparecer em todos os cdigos Java. Quando um programa Java
executado, o interpretador da JVM executa os comandos que estiverem dentro do
bloco indicado pelo mtodo "static public void main(String)".
Linha 10: aqui seria escrito o cdigo propriamente dito. Instrues como for-next, print,
etc.
Linha 11 e 12: o fechamento de chave } indica incio de bloco (tal qual end em Pascal)

Exemplo de cdigo Java:

/**
* Instituto de Software do Cear - INSOFT
* XI Semana tecnolgica de frias
* Primeiro programa escrever a mensagem al mundo na tela.
*/
public class AloMundo
{
static public void main(String[] args)
{
System.out.println("Alo Mundo");
}
}

Como rodar o programa acima ?


1. Salve o cdigo acima em um arquivo nomeado: AloMundo.Java (no esquea o case-sensitive)
2. Digite no console:
a. C:\fic>javac AloMundo.java
3. Caso no ocorra nenhuma mensagem de erro, digite:
a. C:\fic>java AloMundo

Exerccios
a. Verifique se o sjdk1.4.1 est corretamente instalado em sua mquina (digite java no console e
observe. Caso no acontea nada, procure a documentao que vem junto ao sjdk1.4.1)
b. Escreva um programa em Java para imprimir seu nome na tela do computador. Compile e rode
esse programa.
Dica: o comando em Java para imprimir mensagens na tela o seguinte:
? No esquea do ponto e vrgula no final

System.out.println("mensagem");

Implementando o primeiro
programa

Ao final da seo anterior, o aluno foi apresentado ao formato de programas Java. O


texto abaixo orienta a edio, compilao e execuo destes programas.

O ambiente de desenvolvimento
? Para que voc possa compreender o contedo desta aula, necessrio que voc j tenha instalado o
Java em sua mquina. As instrues de instalao do j2sdk1.4.1 sero apresentadas na aula de
laboratrio. Para verificar se o Java foi corretamente instalado em sua mquina, faa o seguinte:
- abra um console DOS em seu computador (no Win2000, clique iniciar/executar e digite o comando
cmd).
- depois que o console estiver ativo, digite o seguinte comando : Java version <enter>
- dever aparecer uma mensagem parecida com esta:
C:\>java -version
java version "1.4.1"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1
-b92)
Java HotSpot(TM) Client VM (build 1.4.1-b92, mixed mode)
C:\>
Caso no esteja funcionando, revise o processo de instalao do j2sdk1.4.1 antes de continuar essa
aula. Um site que pode lhe ajudar nessa instalao est em:
http://geocities.com/canaljava/olamundo.html
No esquea de configurar as variveis de ambiente de seu sistema operacional. Em ambiente Windows,
as configuraes so as seguintes:

path = %path%;c:\j2sdk1.4.1\bin
classpath = %classpath%;.;c:\j2sdk1.4.1\jre\lib
* Em ambientes UNIX/Linux, o delimitador das variveis de ambiente o dois pontos (:) ao invs de
ponto e vrgula.
** Detalhes sobre a instalao podem ser encontrados na pgina da SUN: Your First Cup of Java
http://java.sun.com/docs/books/tutorial/getStarted/cupojava/index.html

I M P L E M E N T A N D O

P R I M E I R O

P R O G R A M A

O cdigo fonte
Como qualquer outra linguagem de programao, Java usada para criar aplicaes de computador. O
texto que contm os comandos a serem executados pela JVM chamado de cdigo-fonte, ou
simplesmente fonte. O conjunto mnimo de instrues necessrio para que um cdigo-fonte seja
considerado um programa Java aparece no quadro abaixo:
/**
* Instituto de Software do Cear - INSOFT
* XI Semana tecnolgica de frias
* Primeiro programa escrever a mensagem al mundo na tela.
*/
public class AloMundo
{
static public void main(String[] args)
{
System.out.println("Al mundo");
}
}

Analisando o cdigo acima:


??

As primeiras 5 linhas representam um bloco de comentrio, que tem por objetivo identificar a
funo do programa, seu autor, verso, etc. Mais adiante na disciplina aprenderemos a utilizar a
ferramenta de documentao do Java, chamada javadoc.

??

A linha seguinte (public class AloMundo) declara uma classe chamada AloMundo. Aps
compilado, esse cdigo gerar um arquivo AloMundo.class no mesmo diretrio em que se
encontra o cdigo fonte. Um cdigo fonte em Java pode descrever mais de uma classe. Aps a
compilao, cada descrio de classe gerar um arquivo .class separado. Observer que pode
haver no mximo um classe public dentro de cada cdigo-fonte Java. Caso voc
inadvertidamente declare mais de uma classe como public dentro de um cdigo-fonte Java,
ocorrer um erro de compilao. O corpo da classe (o cdigo que define a classe) deve ser
delimitado por chaves, assim como toda a estrutura de dados, deciso ou controle em Java.

??

A seguir encontra-se a declarao do mtodo inicial de um programa Java. Todo programa Java
comea a ser executado pelo mtodo main (tal qual C/C++ e vrias outras linguagens). Note que
o mtodo main declarado com uma srie de modificadores e com uma matriz de Strings como
parmetro. No se preocupe se no momento esses conceitos parecem confusos, mais tarde voc
aprender o motivo de cada um deles. Por enquanto basta saber o seguinte sobre o mtodo
main: static public void main(String[] args)
o

static: um modificador utilizado pelo compilador para identificar mtodos que podem ser
executados apenas no contexto da classe AloMundo, sem a necessidade que um objeto
dessa classe seja instanciada.

public: o mtodo main opde ser executado por qualquer processo ativo no sistema
operacional, incluindo o interpretador Java.

void: indica o tipo do valor (int, char, etc.) a ser retornado pelo mtodo main. Quando um
tipo de retorno declarado como void, significa que o mtodo no retorna nenhum valor.
O mtodo main sempre dever ser declarado static public void. Caso contrrio o
programa
no
poder
ser
executado
(Exception
in
thread
"main"
java.lang.NoSuchMethodError: main).

I M P L E M E N T A N D O

P R I M E I R O

P R O G R A M A

String[] args: um array de objetos do tipo String, que serve para armazenar a lista de
argumentos digitados na linha de comando aps o nome da classe a ser executada:
C:\alo>java AloMundo nome numero ...
C:\alo>_

Esses argumentos so acessados pelo ndice da matriz args, ou seja, args[0] = nome,
args[1] = numero, etc.
??

Dentro do mtodo main, existe um exemplo de comando em Java. Nosso prximo passo ser
identificar o conjunto de comandos mais comuns em Java. Por hora, usaremos esse comando
apenas para treinar a compilao e execuo de programas Java. O mtodo System.out.println
utilizado para escrever uma mensagem no dispositivo padro de sada do Java, que a tela do
computador (mais tarde, aprenderemos como configurar dispositivos de entrada e sada, que
podem ser: a tela do computador, uma conexo da Internet, o disco rgido, etc.)

Compilando e executando o programa


Para compilar o programa AloMundo proceda da seguinte maneira:
1. Digite o cdigo do AloMundo, conforme aparece na figura acima, utilizando um editor de textos
padro Ascii. (Para ter certeza que o seu texto ser salvo em Ascii, no windows, use o notepad.
Ou ento utilize o editor recomendado pela disciplina)
2. Salve o cdigo-fonte do AloMundo em um arquivo chamado: AloMundo.java
3. Ative um console DOS (no Windows, iniciar/executar/CMD)
4. V para o diretrio em que voc salvou o cdigo-fonte do AloMundo (cd <diretrio>)
5. Execute o compilador Java, passando como parmetro o n ome do arquivo a ser compilado:
C:\>_
C:\>cd alo
C:\alo>javac AloMundo.java
C:\alo>_
6. Se aps executar o comando javac o sistema no acusou nenhum erro, porque o programa
AloMundo.java foi compilado com sucesso.
7. Para verificar se o byte-code do seu programa foi gerado com sucesso, liste o contedo diretrio
em que voc est trabalhando:
C:\alo>dir
O volume na unidade C WINDOWS
O nmero de srie do volume B4EC
-EDD8
Pasta de C:\alo
19/02/2002
19/02/2002
19/02/2002

15:54
15:54
15:54

<DIR>
<DIR>

.
..
190 AloMundo.class

10

I M P L E M E N T A N D O

19/02/2002

P R I M E I R O

12:52
2 arquivo(s)
2 pasta(s)

P R O G R A M A

191 AloMundo.java
381 bytes
931.860.480 bytes disponveis

C:\alo>_
8. Observe que o compilador Java criou um arquivo chamado AloMundo.class em seu diretrio.
Esse arquivo contm o byte-code, o conjunto de instrues executveis pela JVM.
Para rodar o programa AloMundo, basta carregar a mquina virtual Java (JVM) passando como
parmetro o nome da classe a ser executada:
C:\alo>java AloMundo
Al mundo
C:\alo>_
Note tambm que o nome do arquivo aparece sem a extenso .class. Esse um detalhe importante,
pois causa problemas maioria dos iniciantes em Java. O ponto em nome de arquivos obedece ao
padro UNIX, ou seja, se voc executar o programa atravs de seu nome + . + extenso o JVM vai
pensar que se trata de um subdiretrio:
C:\alo>java AloMundo.class
Exception in thread "main" java.lang.NoClassDefFoundError: AloMundo/class
C:\alo>_

Erros mais comuns


Erros de compilao:
Varivel de ambiente (PATH) mal configurada: um dos erros mais freqentes entre iniciantes Java a
configurao incorreta das variveis de ambiente PATH e CLASSPATH. Lembre-se que o diretrio que
contm os arquivos executveis que compem a JVM deve estar indicado na varivel PATH do sistema
operacional (na instalao padro, esse diretrio o ..\j2sdk1.4.1.1\bin) Caso contrrio ocorrer o
seguinte erro:
C:\alo>javac AloMundo.java
'javac' no reconhecido como um comando int
erno
ou externo, um programa opervel ou um arquivo em lotes.
C:\alo>_
SOLUO: voc deve incluir o diretrio onde o Java foi instalado na definio da varivel de ambiente
PATH. No Windows 2000, abra o painel de controle, clique no cone Sistema e depois na aba Avanado.
Voc ver um boto chamado Variveis de ambiente... Clique nesse boto e inclua o diretrio da
instalao Java na varivel PATH. Importante: voc vai ter que fechar o console atual e abrir um outro
para que a alterao tenha efeito. Para entender melhor o que uma varivel de ambiente, consulte o
Help do Windows.
Erro de digitao: muito comum quando ainda no se est acostumado com a sintaxe de uma
linguagem. No exemplo abaixo, ao invs de digitar println o usurio digitou printl.

11

I M P L E M E N T A N D O

P R I M E I R O

P R O G R A M A

C:\alo>javac AloMundo.java
AloMundo.java:9: cannot resolve symbol
symbol : method printl (java.lang.String)
location: class java.io.PrintStream
System.out.printl("Al mundo");
^
1 error
C:\alo>_
SOLUO: revisar o cdigo. Note que o compilador acusa em quais linhas ocorreram erros.
case-sensitive ou nome de arquivo diferente do nome da classe pblica: Outra fonte de erros o
case-sensitive, ou seja, no Java palavras minsculas so diferentes das maisculas. Se, por exemplo, o
programador salvar o arquivo com o nome de alomundo.java, o compilador procurar uma classe
chamada alomundo e no AloMundo ? esses dois nomes, em Java, so diferentes.
C:\alo>javac AloMundo.java
AloMundo.java:5: class aloMundo is public, h
sould be declared in a file
named aloMundo.java
public class aloMundo
^
1 error
C:\alo>_
SOLUO: revisar o cdigo. Note que o compilador acusa em quais linhas ocorreram erros no exemplo
acima, o erro ocorreu na linha 5.
Erros de execuo:
Varivel de ambiente (CLASSPATHPATH) mal configurada: durante o processo de compilao, a m
configurao da varivel PATH causava um erro de compilao. Aqui o erro de execuo, e pode ser
causado pela ausncia da varivel de ambiente CLASSPATH.
C:\alo>java AloMundo
Exception in thread "main" java.lang.NoClassDefFoundError: AloMundo
C:\alo>_
SOLUO: faa o mesmo procedimento de configurao de variveis de ambiente e ajuste a varivel
CLASSPATH para o diretrio que contm as bibliotecas padro Java (na instalao padro: ../
j2sdk1.4.1/jre/lib).

Exerccios
a. Crie o arquivo AloMundo.Java com algum editor de textos. Em seguida compile e execute o
programa AloMundo.
b. Modifique o programa AloMundo para que ele desenhe os seguintes formatos na tela:
C:\alo>java AloMundo
*
*
*
*

*
*
*
*

*
*
*
*

*
*
*
*

*
*
*
*

*
* *
* * *
* *

12

I M P L E M E N T A N D O

* * * * *

P R I M E I R O

P R O G R A M A

C:\alo>_
c.

D uma olhada nos arquivos de documentao do j2sdk1.4.1.

13

Sintaxe da linguagem Java

Nesta seo ser apresentado o formato de codificao da linguagem Javacomo cdigos


de computador devem ser escritas aluno deve reconhecer Desde o seu surgimento, a
tecnologia Java vem contribuindo no amadurecimento de processamento remoto e ligado
Internet. o mercado a se adpatar , nos anos 90, Reconhecida como tecnologia

Delimitadores em Java
Em um cdigo-fonte Java, alguns smbolos so utilizados pelo compilador para diferenciar comandos,
blocos de comandos, mtodos, classes, etc. Tais smbolos, chamados de delimitadores, so
enumerados abaixo:

Comentrios
Comentrios servem para identificar a funo de um comando, um trecho de cdigo, ou um mtodo.
Alm disso, os comentrios podem ser utilizados para documentar aspectos de desenvolvimento de um
programa: como o nome da empresa que o desenvolveu, nome dos programadores, verso, etc. Existem
dois tipos de comentrio: o simples e o de documentao.
O comentrio simples delimitado por duas baras // e termina ao final de uma linha.
O comentrio de documentao iniciado pelo smbolo /** e encerrado pelo smbolo */, podendo conter
vrias linhas de texto e linhas em branco.
// comentrio simples: no ser includo na documentao
// do programa (note que comentrios simples exigem
// um par de barras para cada linha).
/**
FIC Sistemas Orientados a Objetos I
Exerccio de aula
Esse tipo de comentrio ser utilizado pela ferramenta geradora de
documentao
javadoc, que acompanha o ambiente de desenvolvimento
sjdk1.3.1. O uso do javadoc ser comentado em aula. A descrio das tags
utilizadas pelo javadoc pode ser encontrada na documentao da Java.
@author FIC - Faculdade Integrada do Cear
@version 1.0 beta
@date fevereiro de 2002
*/
Ponto e vrgula, blocos e espaos em branco: em Java, todo comando terminado por um ponto e
vrgula (;). Exemplo: System.out.println("note o ponto e vrgula no final ? ");

S I N T A X E

D A

L I N G U A G E M

J A V A

Um bloco formado por um conjunto de instrues delimitadas por chaves, como no exemplo abaixo:
/** Exemplo de bloco */
{
// Chamamos essa chave de incio de bloco
int ano;
// Note o ponto e vrgula
ano = 2002; // sempre ao final de um comando Java
}
// Chamamos essa chave de final de bloco
o espao em branco, quebra de linha e caracteres de tabulao so permitidos em qualquer trecho do
cdigo-fonte, devendo ser utilizados para realar o aspecto visual de seu cdigo.

? apesar do aspecto visual do cdigo-fonte no ter nenhum impacto no desempenho de um programa


Java, o uso de endentao uma caracterstica de bons cdigos-fonte. Lembre-se que voc no ser o
nico a ler o cdigo-fonte de seus programas, portanto escreva-o da maneira mais organizada e legvel
possvel.

Identificadores e palavras reservadas


Em Java, um identificador uma seqncia de smbolos UNICODE (64K smbolos) que comea com
uma letra, um smbolo subscrito _, ou o caractere $. Os demais smbolos de um identificador podem
conter tambm nmeros. Identificadores so case-sensitive e no tem um tamanho mximo estabelecido.
Apesar da tabela UNICODE ser bastante extensa, um bom hbito de programao utilizar somente
letras do alfabeto (a-Z) e nmeros para nomear identificadores.
Exemplo de identificadores vlidos em Java:
??
??
??
??
??
??
??

data
_data
$data
data_do_ms
data1
uma_varivel_pode_SER_bastante_extensa_e_conter_Numeros234876238476
data_public_class_NoteQueEsseIdentificadorContemPalavrasReservadas

Apesar desta "liberdade" de opes para nomes de identificadores, algumas palavras no so permitidas.
Tais palavras so ditas palavras reservadas, e representam o conjunto de comandos que forma a sintaxe
da linguagem Java. O conjunto de palavras reservadas em Java o seguinte:
abstract
boolean
break
byte
case
catch
char
class
const
continue
default

double
else
extends
final
finally
float
for
goto
if
implements
import

int
interface
long
native
new
package
private
protected
public
return
short

15

strictfp
super
switch
synchronized
this
throw
throws
transient
try
void
volatile

S I N T A X E

D A

do

L I N G U A G E M

J A V A

instanceof

static

while

? voc no precisa se preocupar em memorizar o nome das palavras reservadas em Java. medida
que voc for praticando a programao em Java, isso se tornar natural. Alm disso,o compilador acusa
um erro de nomenclatura quando voc tenta utilizar uma palavra reservada para nomear uma varivel,
um mtodo ou uma classe.

Declarando variveis em Java


Uma varivel sempre declarada seguindo do seguinte esquema:
<tipo> + <espao> + identificador + ;
ou
<tipo> + <espao> + identificador + = + valor + ;
onde:
<tipo>
identificador
valor

um tipo primitivo de dados ou o nome de uma classe ou interface


o nome da varivel
o valor atribudo varivel. Caso voc declare uma varivel e no atribua nenhum
valor, ela no poder ser utilizada em um cdigo Java a tentativa de utilizar uma
varivel no inicializada em Java gerar um erro de compilao.

exemplos:
/**
* FIC - Faculdade Integrada do Cear
* Sistemas Orientados a Objetos I
* Incluindo variveis no programa AloMundo.
*/
public class AloMundo
{
static public void main(String[] args)
{
boolean obrigatorio;
int semestre = 2;
String mensagem = "Alo mundo.";
System.out.println(mensagem);
}
}

? veremos mais adiante que Java possui um mecanismo de inicializao de variveis de seus tipos
primitivos, mas o aluno deve evitar considerar essa inicializao como prtica de programao. De fato,
esta inicializao automtica no funciona para variveis de tipos agregados ou abstratos de dados e
tambm que o escopo das variveis de classe ou de instncia - tem influncia na sua inicializao. O
aluno fortemente recomendado a pensar em variveis como espaos alocados na memria RAM,
inicialmente podendo conter qualquer valor (conhecido como lixo na memria).

16

S I N T A X E

D A

L I N G U A G E M

J A V A

Tipos primitivos da linguagem Java


A linguagem Java utiliza oito tipos primitivos de dados e um tipo especial. Esses tipos primitivos podem
ser utilizados para declarar constantes ou variveis utilizadas em programas Java. Os tipos primitivos
esto divididos em quatro categorias: lgicos, textuais, numricos inteiros e numricos de ponto flutuante.

Tipos lgicos: boolean


Valores lgicos possuem dois estados, normalmente ditos verdadeiro/falso, sim/no e ligado/ desligado.
Em Java um tipo lgico definido pela palavra boolean, e pode assumir dois valores: true ou false.

// Exemplo de varivel que suporta valores booleanos


boolean anoBissexto = false;
boolean anoPar = true;
// Apesar de uma varivel poder ser declarada
// sem receber um valor, ela s poder ser usada
// aps a atribuio de algum valor a ela.
boolean valido;

Tipos textuais: char e String


Caracteres simples so representados pelo tipo char. Um char representa um caracter UNICODE, ou
seja, um nmero inteiro sem sinal de 16 bits, no intervalo de 0 at 216-1. O valor de um literal char deve
ser delimitado por aspas simples:

// Exemplo de representao de caracteres UNICODE


char primeiraLetra = 'a';
char tabulacao = '\t';
// Cdigo UNICODE para o caractere de interrogao
char unicode = '\u0A02';
// Lembre-se: Uma varivel s poder
// ser manipulada aps receber um valor.
char inutil;
// varivel sem utilidade neste momento
inutil = '@';
// varivel til a partir de agora

Palavras so representadas por uma seqncia de dados do tipo char, agrupadas em um tipo especial
de dados: a classe String. Apesar de ser uma classe, uma varivel do tipo String suporta operaes
como se fosse um tipo primitivo de dados. O valor de uma varivel String deve ser delimitado por aspas
duplas "valor".

// Exemplo de uso de variveis do tipo String


String disciplina = "Sistemas Orientados a Objetos I" ;
// Uma varivel pode receber o valor de outra

17

S I N T A X E

D A

L I N G U A G E M

J A V A

String outraVariavel = disciplina;


// A concatenao de Strings pode ser feita atravs do
// operador de soma ( +)
disciplina = "Sistemas " + "Orientados a Objetos I" ;
// Concatenao de String com outro tipo de dados:
disciplina = "Sistemas Orientados a Objetos" + 'I';
disciplina = "Sistemas Orientados a Objetos" + 1;
//
//
//
//

Para comparar duas variveis do tipo String


devemos usar o mtodo equals():
disciplina == "Sistemas orientados..." ? INCORRETO
disciplina.equals("Sistemas orientados...") ? CORRETO

? a concatenao de qualquer tipo de dado com um dado do tipo String resulta em um novo dado do
tipo String.

Tipos numricos inteiros: byte, short, int e long


Existem quatro tipos primitivos de nmeros em Java. Alm disso, os valores numricos podem ser
representados de forma decimal, octal ou hexadecimal:
Valores numricos inteiros em Java:
2
077
0xBABE

decimal
um nmero que comea com zero est representado de forma octal
representao hexadecimal

? todos os valores numricos em Java tem sinal positivo ou negativo.


Um valor numrico sempre considerado do tipo int, a menos que seja acompanhado do sufixo L, que
representa um valor do tipo long. A diferena de um inteiro para um longo a capacidade de dgitos que
podem ser representados, conforme aparece no quadro abaixo.
Valores numricos em Java, representados como long:
2L
077L
0xBABEL

decimal
um nmero que comea com zero est representado de forma octal
representao hexadecimal

// Valores inteiros rep resentveis pelos tipos


// numricos em Java:
byte a
= 127;
// -27 ... 27 -1
short b
= 32767;
// -215 ... 215 -1
int c
= 2147483647;
// -231 ... 231 -1
long d
= 9223372036854775807L; // -263 ... 263 1

18

S I N T A X E

D A

L I N G U A G E M

J A V A

Tipos numricos de ponto flutuante: float e double


Um valor fracionrio pode ser representado em Java atravs dos tipos float e doubl. A diferena entre
esses dois tipos o tamanho da mantissa:
float
double

32 bits
64 bits

Para um nmero ser considerado do tipo ponto flutuante, necessrio a incluso de um ponto, do
caractere E (de expoente) ou do sufixo D ou F, conforme mostra o quadro abaixo:

// Representao de valores numricos de ponto flutuante


float pi = 3.141516;
float taxa = 6.02E23;
double valor= 123.4E+306D;

? todo o valor numrico de ponto flutuante considerado do tipo double, a menos que o programador o
declare explicitamente como float.

Convenes de codificao
Durante a nossa disciplina, adotaremos a seguinte conveno de codificao:
??

Classes as classes devem ser designadas por nomes, comeando por uma letra maiscula e
depois minsculas. Cada nova palavra que formar o nome da classe deve ser capitalizada. Ex:
class Calculadora, class CalculadoraCientifica, ...

??

Intefaces igual s classes. Ex: interface Calculo, interface EquacaoLogaritmica, ...

??

Mtodos mtodos devem nomeados por verbos, seguindo o mesmo formato de capitalizao
das classes. Entretanto, um mtodo sempre deve comear com letra minscula. Ex: public void
calcular(int numero), public void extrairRaiz(int numero), ...

??

Constantes constantes devem ter todas as suas letras em maisculo, com o smbolo de
subscrito para separa as palavras. Ex: final int ANO = 2002, final boolean VERDADE = true, ...

??

Variveis tal qual os mtodos, as variveis devem comear com uma letra minscula e depois
alternar a cada palavra. Procure usar nomes significativos para variveis. Evite declarar variveis
usando apenas um a letra.

Exerccios
d. Altere o programa AloMundo.Java para que ele imprima na tela todos os tipos primitivos de
dados suportados pela linguagem Java.
e. Altere o programa AloMundo para que ele imprima os parmetros recebidos pela linha de
comando de execuo do programa. (Dica: so os valores do array args: args[0], args[1], etc.)

19

S I N T A X E

f.

D A

L I N G U A G E M

J A V A

Crie um programa que receba trs argumentos da linha de comando e imprima-os na mesma
linha, em ordem inversa.
Exemplo:
java Programa a1 a2 a3
Sada:
a3 a2 a1

20

Expresses
Esta seo apresenta a manipulao de variveis e implementao de tomada de
decises em programas Java.

Operadores lgicos e aritmticos


Os operadores Java so similares em estilo e funo aos operadores da
linguagem C/C++. A tabela abaixo enumera esses operadores em ordem de
precedncia:
Delimitadores

. [] () ; ,

Servem para delimitar


partes distintas de um
comando,
mtodo
ou
classe.

Ordem
de
leitur
a:
Unrio

Operador
:

Funo:

++

Unrio

--

?
?
?

+ * / %
<<
>>
>>>
== !=
^
&&
||
?:
= *= %=
+=
-=
<<=
>>=
>>>=
&=
^= |=
instance
of

Incrementa o valor da varivel em uma unidade.


Exemplo: i++; contador++;
Diminui o valor da varivel em uma unidade. Exemplo:
i--; contador--;
Operadores aritmticos
Multiplicao, diviso, resto
Operadores de deslocamento aritmtico e lgico

?
?
?
?
?
?

Igualdade e desigualdade
Potncia
AND
OR
Operador condicional. Exemplo: i=0; (i>2?i=0:i --);
Operadores aplicados sobre a atribuio

Identificador de classes

E X P R E S S E S

Concatenao de Strings com o operador +


Quando o operador + aplicado a dados do tipo String, ele cria um novo dado
do tipo String, concatenando os dois oper andos:

/**
* Concatenao de Strings
*/
String sigla = "SOO-I";
String nome = "Sistemas Orientados a Objetos I";
String titulo = sigla + " - " + nome;
// Esse comando imprimir na tela a frase:
// SOO-I Sistemas Orientados a Objetos I
System.out.prinln(titulo);
int i = 10;
String legenda = "valor = ";
// campo uma varivel do tipo String
String campo = legenda + i;

Alguns mtodos teis em dados do tipo String:


/**
* Strin: mtodos teis
*/
String disciplina = "Sistemas Orientados a Objetos I";
System.out.println("disciplina: " + disciplina);
// Isolando um caractere:
System.out.print("primeiro caractere: " );
System.out.println(disciplina.charAt(0));
System.out.print("segundo caractere: " );
System.out.println(disciplina.charAt(1));
// O primeiro caractere de uma String tem o
// ndice 0, o segundo o ndice 1 e assim por diante
// letra = 's';
char letra = disciplina.charAt(2);
// substrings:
System.out.print("primeiras cinco letras: " );
System.out.println(disciplina.substring(0, 5) );
System.out.print("letras a partir da quarta: " );
System.out.println(disciplina.substring(4) );

22

E X P R E S S E S

// nmero de caracteres em uma String:


System.out.print("tamanho da frase: ");
System.out.println(disciplina.lenght() + " letras");
// usando os caracteres de tab ulao e quebra
// de linha:
System.out.println(""
+ disciplina.lenght()
+ " letras"
+ " \n"
+ " Nova linha\ttabulao"
);

Promoo e Casting
A linguagem Java no suporta atribuies arbitrrias entre variveis de tipos
diferentes. Por exemplo, voc no pode inicializar uma varivel inteira com um
valor de ponto flutuante sem explicitar isso atravs de um processo que
chamamos de casting.
Quando atribumos um valor a uma varivel, e esse valor incompatvel com o
tipo de dado definido para a v arivel, ocorrer uma converso. Em alguns
casos, essa converso ser automtica, em outros o programador deve indicar de
que forma o valor ser convertido ao tipo de dado da varivel.
Quando o processo de converso for automtico, dizemos que ocorreu uma
promoo, ou seja, um valor com um tipo de dado foi promovido a outro tipo de
dado. Veja no exemplo abaixo:

//
// Promoo entre valores de tipos de dados distintos
// Apesar 6 ser um inteiro, o valor da varivel grande
// continua sendo do tipo long
long grande = 6;
// Uma varivel do tipo inteiro no possui
// espao para armazenar um valor longo.
// A instruo abaixo ilegal, e causar um erro de compilao.
int pequeno = 99L;
float a = 12.121F;
float b = 12.121;

// correto
// 12.121 um double - incorreto

Como visto acima, algumas converses no podem ser realizadas de forma


automtica, pois o compilador no pode assumir que tipo de converso ele deve
realizar (o tamanho do tipo de dado a ser recebido por uma varivel maior

23

E X P R E S S E S

que o tamanho pr-definido para o tipo dessa varivel, logo o compilador no


sabe como "ajustar" os bits excedentes). Nesse caso, o programador deve
indicar ao compilador que tipo de converso dever ocorrer, digitando o tipo
de dado que o valor dever assumir entre parnteses:
//
// Casting entre valores de tipos de dados distintos
//
// Apesar 6
// continua
long grande
int pequeno

ser um inteiro, o valor da varivel grande


sendo do tipo long
= 6;
= (int)99L;
// sem problemas

float a = 12.121F;
float b = (float)a;

// sem problemas

Operadores de deslocamento (>>, <<, >>>)


Java prov operadores para a manipulao dos bits em variveis de tipo numrico: o deslocamento
aritmtico >> e o deslocamento lgico >>>.
O operador de deslocamento aritmtico >> executa um deslocamento de um bit para a direita de um
nmero (na prtica, o primeiro argumento desse operador dividido por dois 'n' vezes onde n o
segundo argumento do operador):
8 >> 2 = 2
128 >> 1 = 64
256 >> 4 = 16
* Notao em complemento de dois: o operador >> mantm o sinal do bit mais significativo durante o
deslocamento.

O operador de deslocamento lgico >>> executa um deslocamento no padro dos bits ao invs do
significado aritmtico de um valor numrico. Esse operador sempre adiciona o valor 0 ao bit mais
significativo:
1010 ... >> 2 = 111010 ...
1010 ... >>> 2 = 001010 ...
* Os operadores de deslocamento reduzem seus operandos direita mdulo 32 para um valor do tipo int
e mdulo 64 para um tipo long. Dessa forma, para qualquer valor do tipo int:
int x

x >>> 32 = x

? o operador de deslocamento lgico >>> s pode ser aplicado a valores inteiros, e no efetivo em
valores int e long. Se for aplicado a valor short ou byte, o valor ser promovido a um int antes da
aplicao do operador. Por isso, um deslocamento sem sinal acaba se tornando um deslocamento com
sinal.
24

E X P R E S S E S

Circuitos lgicos
Java possui trs operadores bsicos para implementar circuitos lgicos :
NOT:
AND:
OR:

operador !
operador &&
operador ||

Esses operadores permitem a representao de expresses booleanas, que formam


o argumento para comandos de deciso (IF), seguindo a seguinte tabela:

true
true
false
false

&&
&&
&&
&&

AND:
true = true;
false = false;
true = false;
false = false;

!true
= false;
!false = true;
!(a && b) = !a || !b
!(a || b) = !a && !b

true
true
false
false

||
||
||
||

OR

a || b

a
b

true
false
true
false

=
=
=
=

OR:
true;
true;
true;
false;
a
a && b
b AND

NOT

!a

Os comandos de controle (if, while, switch) utilizam o valor de expresses


booleanas para guiar o fluxo de controle de um programa, como no exemplo
abaixo:
/**
* Comandos de deciso utilizando expresses booleanas
*/
int mes = 2;
if((mes == 12) || (mes == 1 ))
{
System.out.println("frias :)" );
}
if((mes > 1) && (mes < 12 ))
{
System.out.println("semestre em andamento" );
}
if((mes != 2))
{
System.out.println("no tem carnaval ");
}

25

E X P R E S S E S

Exerccios
1. Implemente um programa para calcular a rea de um trapzio, onde:
h = altura
b = base menor
B = base maior
rea = (h . (b + B)) / 2
2. Faa o programa acima calcular utilizando valores de ponto flutuante e depois imprima na tela
duas informaes:
Valor exato da rea:
Valor arredondado para inteiro:
3. Calcule o valor das seguintes equaes:
a. 3 2 1 + 2 + 1 + 3
b. 2 * 3 4 * 5
c. 2 + 6 3 / 7 * 9
d. 3 % 4 8
4. Indique qual o valor verdade das seguintes expresses:
a. (1 > 2)
// exemplo: false
b. (8 == 8)
// exemplo: true
c. ((12 5) > 6)
d. (0 < 3) && (8 < 9)
e. ((i++) > i)
f. ((10 * 90 / 50 2) == 16)

26

Fluxo de controle
Esta seo demonstra como implementar tomada de decises em cdigos Java.

Ramificao if, else


A sintaxe bsica para declaraes if, else a seguinte:
if (expresso_booleana)
{
// bloco de comandos
}
else
{
// bloco alternativo de comandos
}
exemplo:
/**
* Usando if, else
*/
int maior = 10;
int menor = 5;
if (maior > menor)
{
// (10 > 5) = true
System.out.println(maior + ">" + menor);
}
else
{
// (10 > 5) != true
System.out.println(menor + ">" + maior);
}

// Lembre-se que o controle de fluxo feito atravs


// do valor verdade de uma expresso booleana
boolean verdade = (10 > 5);
if (verdade)
{

F L U X O

D E

C O N T R O L E

// (10 > 5) = true


System.out.println(maior + ">" + menor);
}
else
{
// (10 > 5) != true
System.out.println(menor + ">" + maior);
}

Ramificao switch
Switch uma declarao semelhante ao if, mas que usa valores inteiros para a
tomada de decises ao invs de expresses booleanas. (s pode ser usada em
dados dos tipos short, int, byte ou char). Se o tipo de dado no for inteiro,
o comando switch ir executar uma promoo desse valor ao tipo int para
somente depois executar a ramificao .
A sintaxe bsica para declaraes switch a seguinte:
Switch ((int)expresso)
{
// bloco de comandos
case ((int) valor_1):
// bloco de comandos
break;
case ((int) valor_2):
// bloco de comandos
break;
default :
// bloco de comandos padro.
// Se nenhum dos valores acima corresponder
// expresso definida no comando switch, ento
// o programa executar o trecho default.
// o trecho default opcional.
break;
}
exemplo:
/**
* Usando switch
*/
// Considere valorDoTeclado() como um nmero
// inteiro digitado pelo usurio
int valor = valorDoTeclado();
switch (valor)
{
case 0:
System.out.println("cadastro de produto" );

28

F L U X O

D E

C O N T R O L E

break;
case 1:
System.out.println("emitir nota fiscal");
break;
case 2:
System.out.println("cancelar compra");
break;
default:
System.out.println("efetuar venda");
break;
}

Repetio for
A declarao for utilizada para definir que um bloco de comandos deve ser executado 'n' vezes, onde 'n'
um nmero inteiro. A sintaxe do comando for a seguinte:
for (int i = 0; i < 10; i++ )
{
// bloco de comandos
}
exemplo:
/**
* repetio de comandos usando FOR
*/
// Calculando o fatorial de um nmero:
int numero = 10;
int fatorial = 1;
for (int i = numero; i > 0; i --)
{
fatorial = fatorial * i;
}
System.out.println("fatorial de " + valor
+ " = " + fatorial);

// Imprimindo os dias do an o:
for (int mes = 1; mes < 12; mes++ )
{
switch (mes)
{
case 1:
System.out.println("janeiro");
break;
case 2:
System.out.println("maro");
break;
case 3:

29

F L U X O

D E

C O N T R O L E

System.out.println("abril");
break;
// escreva aqui os demais c omandos
}
}

Repetio while
A declarao while utilizada para definir que um bloco de comandos deve ser executado enquanto uma
expresso booleana (condio de parada) no seja verdade.. A sintaxe do comando while a seguinte:
While (expresso_booleana)
{
// bloco de comandos executados enquanto a
// expresso boolena tiver valor verdade = true
}
ou
do
{
// bloco de comandos executados pelo menos uma vez
} While (expresso_booleana);

exemplo:
/**
* repetio de comandos usando FOR
*/
// Calculando o fatorial de um nmero:
int numero = 10;
int fatorial = 1;
int i = numero;
while (i > 0)
{
fatorial = fatorial * i;
i--;
}
System.out.println("fatorial de " + valor
+ " = " + fatorial);

// Lendo a condio de parada do teclado:


int numero = 0;
while (nmero < 10)
{

30

F L U X O

D E

C O N T R O L E

numero = valorDoTeclado();
}
System.out.println("usurio digitou um nmero maior
que 10");

Comandos especiais de controle de fluxo: break, continue e


label
Os comandos de repetio em Java suportam dois tipos de desvios: o break e o continue. O break faz
com que um lao seja interrompido, enquanto o continue usado para "pular" uma execuo e continuar
a partir da prxima.
Exemplo:
// pulando a execuo No 10 e parando na No 15
for (int i=0; i<20; i++)
{
if(i == 10)
{
continue;
}
else if(i == 15)
{
break;
}
System.out.println("contador: " + i);
}

Alm disso, esse desvio pode ser direcionado, ou seja, o programador pode indicar para qual linha do
cdigo a execuo do programa deve ser desviada (uma espcie de GOTO em Java). Essa prtica
altamente desaconselhada, e foi mantida no Java por motivos de compatibilidade com a linguagem C.

? um label em Java s pode ser usado para identificar um comando for, while ou do.
Exemplo:
// usando label para controlar o desvio da execuo
// de um programa Java
desvio: for (int i=0; i<20; i++)
{
if(i == 10)
{
continue desvio;
}
else if(i == 15)
{
// Essa linha nunca ser executada
// pois o lao sempre ser reiniciado

31

F L U X O

D E

C O N T R O L E

// quando o valor de i for igual a 10


break desvio;
}
System.out.println("contador: " + i);
}

Lendo valores do teclado


Mais tarde voc aprender o conceitos de Streams e o acesso a dados lidos de arquivos, teclado, etc.
Por enquanto basta que voc consiga ler valores do teclado para facilitar a implementao dos exerccios
propostos. A leitura do teclado ser brevemente explicada em aula e, no decorrer da disciplina,
revisaremos em detalhes a leitura de dados em dispositivos de entrada e sada.
/**
* FIC - Faculdade Integrada do Cear
* Sistemas Orientados a Objetos I
* Lendo valores do teclado
*/
// Tem que importar a biblioteca de acesso aos
// dispositivos de Entrada e Sada (I/O) do Java:
import java.io.*;
public class Teclado
{
static public void main(S tring[] args)
{
// Tem que usar tratamento de excees,
// conforme explicado em aula.
try
{
// Essas duas linhas criam um "leitor com buffer"
// do dispositivo padro de entrada do Java:
// o teclado (System.in). Mais tarde voc apre nder que esse
// leitor pode ser redirecionado para ler informaes
// de outros dispositivos, como uma conexo com a Internet,
// um Socket, o mouse, etc.
InputStreamReader dados = new InputStreamReader(System.in);
BufferedReader teclado = new BufferedReader(dados);
System.out.print("digite uma frase: ");
String frase = teclado.readLine();
System.out.println("Frase digitada: \t" + frase);
System.out.print("\ndigite um numero inteiro: ");
int numero =
Integer.parseInt(teclado.readLine());
System.out.println("Nmero digitado vezes dois = \t"
+ (numero * 2));
System.out.print("\ndigite um numero fracionario: ");
double flutuante =
Double.parseDouble(teclado.readLine());

32

F L U X O

D E

C O N T R O L E

System.out.println("Nmero digitado dividido por dois =\t"


+ (flutuante / 2));
// outros mtodos:
// char letra = (char)teclado.read();
// Float.parseFloat(teclado.readLine());
// Long.parseLong(teclado.readLine());
}
catch(Exception error)
{
// Se houver um erro na leitura do teclado,
// a execuo do programa ser desviada para
// o bloco 'catch'
System.out.println("[ERRO] "
+ "voce digitou um valor invalido" );
}
}
}

Exerccios
1. Escreva um programa que imprima na tela a soma dos nmeros mpares entre 0 e 30 e a
multiplicao dos nmeros pares entre 0 e 30.
2. Faa um programa para imprimir os nmeros primos de 1 a 123.
3. Faa um programa para ler um nmero do teclado e imprimir na tela se ele par ou mpar.
Imprima tambm se ele primo.
4. O valor pago por um Hotel da Praia de Iracema para seus porteiros de R$ 10,25 por hora de
trabalho. Faa um programa que pergunte ao usurio quantas horas ele trabalhou e imprima na
tela o valor do salrio a ser recebido por ele.
5. Modifique o programa anterior para que o sistema imprima uma mensagem de alerta quando o
valor a ser pago ao funcionrio seja inferior a R$ 50,00: "Ateno, dirija-se direo do Hotel!".
6. Existem 454 gramas em uma libra, e 1000 gramas em um quilo. Faa um programa que converta
quilos para libras e vice-versa. (Dica: use um caractere indicando a ordem da converso,
exemplo "java q 1000" seria o comando para converter 1000 quilos para libra, e "java l 1000"
seria o comando para converter 1000 libras para quilo)

33

Agrupamento de dados (Arrays)

Uma dos fatores de qualidade de software o uso correto de estruturas de dados. Nesta seo
analisaremos o agrupamento de dados, uma estrutura simples mas essencial para a compreenso de como
Java manipula dados na memria.

Declarando e criando Arrays


Arrays so tipos indexados de dados que permitem a representao de agrupamento de dados como
vetores e matrizes.
Podemos declarar arrays de qualquer tipo de dado suportado em Java (primitivo ou agregado tipos
agregados de dados sero discutidos posteriormente). Essa declarao feita pela adio do smbolo []
a um tipo de dado, que pode aparecer antes ou aps o identificador da varivel:
char[]
String[]
Ponto[]
int

arrayDeCaracteres;
arrayDePalavras;
arrayDeObjetosDoTipoPonto;
nmeros[];

Na memria, um array um agrupamento de dados, indexados pelo tamanho do tipo de dado que o array
suporta:
...
0

...

...

N-1

O primeiro ndice de um array sempre 0, e o ltimo ndice o N-1, onde N o nmero de


elementos do array.

? apesar da posio do smbolo [] poder ser no incio ou no final do nome da varivel, fortemente
recomendado que voc sempre aplique o [] aps o tipo da varivel. Isso torna o cdigo muito mais
legvel.
Para criar um array, usamos a palavra chave new:
int[] nmeros = new int[50];
A quantidade de elementos de um array sempre deve ser um valor inteiro. O comprimento de um array
dado pelo mtodo length:

// Imprimindo o comprimento de um array

A G R U P A M E N T O

D E

D A D O S

( A R R A Y S )

char [] alfabeto = new char[24];


int tamanhoDoAlfabeto = alfabeto.length;
System.out.println("alfabeto com " + tamanhoDoAlfabeto
+ " letras");
// Muito importante: um array de 10 elementos tem os
// ndices de 0 a 9

Inicializando os valores de um Array


A linha de comando acima cria uma referncia para um vetor com 50 valores do tipo inteiro. No exemplo
acima, o array de inteiros inicializado automaticamente pelo JVM com o valor ZERO em todas as
posies do array. Isso acontece porque o int um tipo primitivo de dados em Java. Em outros tipos de
dados (agregados), um array no ser inicializado, ou seja, a declarao apenas criar uma referncia a
uma rea de memria que no conter valor algum.
Por exemplo, olhe o seguinte fragmento de cdigo:
// Essas linhas causaro um erro de execuo, pois a posio 0 do array
// contendo as frases no possui nenhum valor (null) e, portanto,
// no pode ser usada como parmetro para nenhum tipo de operao.
String[] frases = new String[10];
int comprimentoDaPrimeiraFrase = frases[0].length();
Exception in thread "main" java.lang.NullPointerException

Para que possamos usar os dados contidos em um array, precisamos antes inicializ-los, conforme os
exemplos abaixo:
// Inicializando arrays
String[] frases = new String[5];
frases[0]
frases[1]
frases[2]
frases[3]
frases[4]

=
=
=
=
=

"primeira frase";
frases[0];
frases[0] + frases[1];
"outro texto qualquer" ;
"ltimo ndice do vetor" ;

// inicializao no momento da declarao de um array:


String[] dias = {"segunda", "tera", "quarta"
, "quinta", "sexta", "sbado", "domingo" };
int[] meses = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
Ponto[] cordenadas = {new Ponto(5, 3), new Ponto(0, 2)};

35

A G R U P A M E N T O

D E

D A D O S

( A R R A Y S )

? arrays de tipos primitivos de dados so inicializados no momento de sua criao. Arrays de tipos
agregados de dados necessitam de inicializao explcita.

Array multi-dimensional
Quando declaramos um array atravs do smbolo [], estamos de fato criando um array unidimensional
(vetor). Alm de vetores, a linguagem Java permite a declarao de arrays n-dimensionais, conforme os
exemplos abaixo:

// array unidimensional (VETOR)


String[] frases = new String[5];
// array bidimensional (MATRIZ)
String[][] tabela = new String[5][15];
// array n-dimensional
double [][][] densidade;
densidade = new double[10][10][10];
//
//
//
//
//

observe que nem todos os valores de um array


precisam estar preenchidos. Sempre que voc for
usar o valor contido em uma posio de um array
voc deve ter certeza que essa posio
foi inicializada

densidade[0][0][0] = 35.034;
densidade[1][0][0] = 30.876;
System.out.println("densidade na coordenada 1,0,0 = "
+ densidade[1][0][0]);
// arrays com mais de trs dimenses so raramente
// encontrados em programas de computador, mas
// so permitidos em Java
float[][][][][][] espacoHexaDimensional;
int[][][][] quartaDimensao = new int[564][2][200][1];
Ponto[][][][][][][][][][][][] hiperespaco;

Array esparso
Java permite a declarao de estruturas esparsas, ou seja, um agrupamento indexado de dados onde
nem todas as dimenses so iguais:
// Matrizes esparsas podem ser representadas em Java
// atravs de arrays com dimenses heterogneas:
int[][] esparso = new int[4][];
esparso[0] = new int[10];
esparso[1] = new int[2];
36

A G R U P A M E N T O

D E

D A D O S

( A R R A Y S )

esparso[2] = new int[5];


esparso[3] = new int[1];
//
//
//
//
//
//

Na memria, o espao de dados ocupado pelo


array acima seria aproximadametne assim:
[ | | | | | | | | | ]
[ | ]
[ | | | | ]
[ ]

Exerccios
1. Faa um programa que enumere os parmetros recebidos via linha de comando.
2. Faa um programa que leia cinco nomes do teclado, e depois imprima esses nomes na ordem
inversa em que foram digitados pelo usurio.
3. Altere o programa acima para que ele continue a ler nomes do teclado at que o usurio digite a
palavra "fim", e ento imprima os nomes digitados na ordem em que foram digitados.
4. Implemente um jogo-da-velha, com as seguintes caractersticas:
a. O tabuleiro formado por um array bidimensional, onde as posies so numeradas
conforme abaixo:
0 1 2
3 4 5
6 7 8
b. Para jogar, os jogadores devem digitar o nmero correspondente ao quadro que desejam
jogar. Caso o quadro j esteja ocupado, ou o valor digitado pelo usurio no seja um
nmero de 0 a 8, o programa deve acusar a jogada invlida e pedir que o jogador digite
novamente.
c. O programa deve considerar dois jogadores (que podem ser nomeados jogadorX e
jogadorO), e utilizar dois smbolos distintos para representar a cada um deles.
d. O programa deve perguntar alternadamente a prxima jogada, ou seja, primeiro pergunta
a jogada do jogadorX, depois do jogadorO e assim sucessivamente.
e. A cada nova jogada o programa deve mostrar o tabuleiro com a situao atual do jogo
(seja criativo). Por exemplo:

O X - -

X
-

Ou

[O] [ ] []
[X] [X] []
[] [ ] []

Dica: voc pode usar os caracteres \t para gerar tabulaes tela de impresso, e o \n
para gerar linhas em branco entre os tabuleiros.
f.

Se um dos jogadores ganhar, o sistema deve mostrar uma mensagem de vitria. Se


houver empate, o programa deve emitir a respectiva mensagem.

g. .

37

Introduo Orientao a Objetos


Esta seo visa estimular o aluno a pensar no conceito de classificao de objetos,
atividade corriqueira do ser humano e que permite grande produtividade quando
adotada como paradigma de programao. A migrao da codificao estruturada para
a orientada a objetos requer disciplina e pacincia, mas capacita o aluno a compreender
tcnicas avanadas de anlise e desenvolvimento de software.

7
7

Motivao ao uso de um novo paradigma, orientado a objetos.


Programadores iniciantes costumam visualizar variveis como elementos isolados em um sistema de
computador. Por exemplo, digamos que um programa deva representar a carteira de estudante dos
alunos da FIC, onde essa identificao seja composta pelo nome e pelo nmero de matrcula.
Na forma estruturada de programao, o aluno poderia usar o seguinte conjunto de variveis:

// Variveis que armazenam as informaes sobre o RG:


String nome = "Fernando Henrique Gomes";
int matricula = 78623423;

Apesar de simples, a forma de representao de dados acima permite dois grandes problemas:
Se quisermos representar informaes sobre um nmero maior de alunos, teremos que declarar muitas
outras variveis:

// Variveis que armazenam as informaes sobre o RG:


String nome0 = "Fernando Henrique Gomes";
int matricula0 = 906231230;
String nome1 = "Ciro Cardoso";
int matricula1 = 903526345;
String nome2 = "Luis Incio Jereissat";
int matricula2 = 003526388;

I N T R O D U O

O R I E N T A O

O B J E T O S

Imagine o exemplo de cdigo acima necessrio para manipular a informao de todos os alunos da FIC,
cerca de oito mil alunos. Imagine a dificuldade de lidar com tantas variveis ? Alm disso, o nmero
mximo de alunos suportados pelo sistema deveria ser previamente conhecido.
Ainda usando programao estruturada, uma forma um pouco melhor de representao dos dados seria
o uso de informaes indexadas em arrays:

String[] nome = new String[5000];


int[] matricula = new int[5000];
// Variveis que armazenam as informaes sobre o RG:
nome[0]
= "Fernando Henrique Gomes";
matricula[0]
= 903564756;
nome[1]
matricula [1]

= "Ciro Cardoso";
= 787564234;

// Mesmo assim seriam necessrias variveis de indexao (confusas):


int fhg = 0;
int cardoso = 1;
// O uso de dados indexados era o paradigma vigente antes da popularizao do
// uso de Orientao a Objetos. Linguagens antigas, como Cobol, tem a indexao
// como formato bsico de acesso a dados na memria. Cobol usa inclusive o tamanho
// dos dados como o separador dos valores gravados na memria.

Outro problema, o principal, a representao feita por tipos de dados, ou seja, o nome uma varivel
do tipo String a o nmero de matrcula uma varivel do tipo inteiro. no h nada no cdigo que os
vincule a uma carteira de estudante.
Note que a nvel conceitual, existe uma associao entre as variveis 'nome' e 'numero',. Elas so parte
do mesmo "objeto", nesse exemplo, uma carteira de estudante.
No final dos anos setenta, com a popularizao dos computadores pessoais e o aumento da presena da
informtica em nossa sociedade, pesquisadores comearam a notar a necessidade de representar os
dados de forma mais fiel forma como eles eram definidos em cada problema. Ou seja, uma carteira de
estudante deveria ter um tipo de dado que representasse a sua estrutura, tal qual ela era conceituada no
mundo real (e no um conjunto de variveis alocadas na memria). Surgiu a Orientao a Objetos,
paradigma que iremos estudar a partir de agora.

Tipos agregados de dados


A maioria das linguagens de programao suporta o conceito de variveis tipadas, ou seja, uma varivel
pode ser do tipo int, double, char, etc. Embora essas linguagens possuam um bom nmero de tipos prdefinidos, seria mais interessante que o programador pudesse definir seus prprios tipos de dados,
como, por exemplo, o tipo "carteira de estudante".
Essa questo resolvida atravs da implementao de Tipos Agregados de Dados (em algumas
linguagens, tambm conhecidos como Tipos Estruturados de Dados ou Registros).

39

I N T R O D U O

O R I E N T A O

O B J E T O S

Dados agregados so tipos de dados definidos pelo programador no cdigo-fonte de um sistema.


Uma vez que um tipo de dado agregado tenha sido definido pelo programador, ele pode ser usado
normalmente para declarar variveis.
Em Java, os tipos agregados de dados so definidos atravs da palavra reservada class:
class CarteiraDeEstudante
{
String nome;
int numero;
}
Note que a palavra class deve ser escrita em minsculo, pois uma palavra-reservada da linguagem
Java. J CarteiraDoEstudante o nome do tipo de dado que est sendo criado, batizado conforme a
preferncia do programador. Essa preferncia deve ser regida por dois fatores:
?? O nome de um tipo de dado criado pelo programador deve ser fiel funo desse tipo de dado.
No nosso exemplo, para representar uma carteira de estudante, no faria sentido criar um tipo de
dado chamado: class Salario.
?? O nome de uma classe deve obedecer ao padro de codificao especificado na empresa em
que o programador est trabalhando. Aqui na nossa disciplina, estamos utilizando o padro
sugerido pela SUN, onde o nome de toda a classe deve comear com uma letra maiscula e ser
alternado a cada palavra que compe o nome. O padro de codificao muito importante para
evitar a confuso de tipos primitivos com tipos definidos pelo programador, entre outros detalhes
que sero discutidos no decorrer da disciplina.

? o conceito de classes bem mais amplo que simplesmente um tipo agregado de dados. As
caractersticas de uma classe sero apresentadas em detalhes ao longo do curso. Por hora, basta que o
aluno tenha conscincia da possibilidade de definir seus prprios tipos de dados em Java.
A partir do momento que um programador definiu um tipo agregado de dados, ele pode declarar variveis
desse tipo utilizando o nome da classe como o tipo da varivel:

// Tipo de dado definido pelo programador


class CarteiraDeEstudante
{
String nome;
int numero;
}
// Variveis declaradas a partir da classe CarteiraDeEstudante:
CarteiraDeEstudante carteira1;
CarteiraDeEstudante carteira2;
CarteiraDeEstudante[] carteirasDaFic = new CarteiraDeEstudante[8000];

As partes integrantes de um tipo agregado de dados pode ser acessadas atravs do operador ponto (.),
como no exemplo abaixo:

carteira1.nome = "Fernando Incio";


carteira1.numero = 02378946;

40

I N T R O D U O

O R I E N T A O

O B J E T O S

carteira2.nome = "Luis Gomes";


carteira2.numero = 03648919;

Na terminologia de Orientao a Objetos, chamamos os elementos que compe uma classe de


membros dessa classe. No nosso exemplo, as variveis nome e numero so chamadas de membros da
classe CarteiraDeEstudante.
Alm disso, quando criamos uma instncia de um tipo agregado de dados, chamamos essa instncia de
objeto.

Criando objetos
Quando declaramos variveis de um tipo primitivo de dados (boolean, byte, chort, char, int, long, float ou
double) o interpretador Java aloca um espao de memria para essa varivel. Quando declaramos um a
varivel de um tipo de dado definido pelo programador (ou da API Java), o espao de memria
necessrio para alocar o valor dessa varivel no alocado imediatamente.
De fato, uma varivel declarada a partir da definio de uma classe no representa a informao
propriamente dita, mas sim uma referncia informao.

? Se voc preferir, voc pode pensar no termo referncia como um ponteiro. Muitas linguagens, como
C/C++, utilizam a terminologia de ponteiros ao invs de referncia.
Antes que voc possa utilizar uma varivel declarada a partir de uma classe, voc deve alocar o espao
de memria necessrio para guardar as informaes referenciadas por essa varivel. Em Orientao a
Objetos dizemos que necessrio criar uma instncia de uma classe. Isso feito em Java pela
palavra reservada new, conforme o exemplo abaixo:
// Tipo agregado de dados que modela uma classe
// de objetos conhecidos como carteiras de estudante
class CarteiraDeEstudante
{
String nome;
int numero;
}

// Um programa de testes, que usa uma varivel


// do tipo carteira de estudante
public class Teste
{
static public void main(String[] args)
{
// Usa-se a palavra reservada new para criar um objeto de um tipo
// de dado definido pelo programador.
// No nosso exemplo, criado um objeto da classe CarteiraDeEstudante
CarteiraDeEstudante carteira = new CarteiraDeEstudante();
carteira.nome = "Fernando Gomes";
carteira.numero = 89762347;
41

I N T R O D U O

O R I E N T A O

O B J E T O S

System.out.println(carteira.nome);
}
}
No exemplo acima, carteira um objeto da classe CarteiraDeEstudante.
Note que, a partir do momento em que o objeto instanciado, seus membros passam a ter um valor real,
que pode ser manipulado com o operador ponto (.).

Alocao de memria durante a criao de objetos


Quando declaramos uma varivel do tipo de uma classe, o JVM apenas aloca o espao necessrio para
armazenar o endereo dessa referncia. Quando um objeto criado e atribudo a essa varivel, atravs
do comando new, que a mquina virtual aloca o espao necessrio para armazenar os valores dos
membros dos objetos.
Imagine o nosso exemplo das carteiras de estudante. A declarao da varivel carteira gera a alocao
do um espao de memria necessrio para guardar a referncia "carteira":
CarteiraDeEstudante carteira;
carteira

???

Aps declarar a varivel, a construo do objeto fora a alocao do espao ocupado pelas informaes
da classe CarteiraDeEstudante:
CarteiraDeEstudante carteira;
carteira = new CarteiraDeEstudante();
carteira

???

nome
numero

""
0

Finalmente, quando atribumos o objeto varivel "carteira", criada a referncia ao objeto recm
construdo:
CarteiraDeEstudante carteira;
carteira = new CarteiraDeEstudante();
carteira

CarteiraDeEstudante@113750

nome
Numero

""
0

referncia

Atribuio de referncias a uma varivel


Java trata as variveis declaradas a partir de uma classe como referncias, ou seja, passamos a chamar
essas variveis apenas como referncias a uma determinada classe.

42

I N T R O D U O

O R I E N T A O

O B J E T O S

Veja o exemplo:
int x = 2002;
int y = x;
CarteiraDeEstudante carteira1 = new CarteiraDeEstudante();
CarteiraDeEstudante carteira2 = carteira1;
Quatro variveis so criadas: duas do tipo int e duas referncias a objetos do tipo CarteiraDeEstudante.
O valor de x 2002, e a segunda linha copia o valor da varivel x na varivel y. Ambas as variveis
inteiras continuam independentes entre si.
J com as variveis carteira1 e carteira2 o comportamento diferente. Quando instanciamos a varivel
carteira1, um objeto da classe CarteiraDeEstudante alocado na memria. Quando atribumos o
contedo dessa varivel carteira2, no estamos criando um novo objeto, mas sim copiando o endereo
do objeto referenciado pela varivel carteira1.
Na memria, o endereamento ficar assim:

x
y
carteira1
carteira2

CarteiraDeEstudante@113750:
nome
""
Numero
0

2002
2002
CarteiraDeEstudante@113750
CarteiraDeEstudante@113750

Termos bsicos em Orientao a Objetos


Alguns termos so bsicos quando estamos descrevendo um sistema desenvolvido a partir do paradigma
de Orientao a Objetos. Abaixo enumeramos alguns desses termos:
Tipo agregado de dados: um tipo de dado definido pelo programador. Agregado pelo fato de ser
definido a partir da agregao de um ou mais tipos primitivos de dados em Java.
Classe: A traduo em linguagem orientada a objetos dos tipos agregados de dados. O conceito de
classe pode ser visto com uma superclasse do conceito de tipos agregados de dados. Alm de agregar
tipos primitivos de dados, uma classe prov outras funcionalidades, que sero apresentadas em detalhes
ao longo do semestre.
Objeto: Uma instncia de uma classe. Podemos considerar uma classe como um gabarito, um modelo a
partir do qual criamos objetos. Podemos declarar, por exemplo, uma classe que representa carteiras de
estudantes. A classe representa um modelo de carteira de estudante. J uma instncia dessa classe
um conjunto de valores aplicados a esse modelo.
Membro: Um membro de uma classe um dos elementos que formam o modelo representado pela
classe. No nosso exemplo, as variveis nome e nmero so membros da classe CarteiraDeEstudante.
Referncia: Em Java, uma varivel definida a partir de uma classe no contm as informaes sobre um
objeto dessa classe. Ao invs disso, a varivel contm o endereo de memria no qual se encontram
esses valores. Tais variveis so chamadas de referncias a um objeto. Um objeto pode ser referenciado
por mais de uma varivel. Porm, uma varivel pode referenciar, no mximo, um objeto.

43

Abstrao de dados

Uma das vantagens da programao orientada a objetos a capacidade de representar um objeto e o


comportamento esperado por esse objeto em um nico trecho de cdigo, conhecido como tipo abstrato de
dados, ou simplesmente classe.

Tipos abstratos de dados


Quando definimos um tipo agregado de dados, podemos tambm definir um conjunto de operaes que
podem incidir sobre esse tipo de dado. Este no um conceito novo. Quando uma linguagem de
programao define um tipo primitivo, tal como um inteiro, ele tambm define um nmero de operaes
que pode ser aplicada a dados desse tipo, como a adio, a subtrao, a multiplicao, a diviso, etc.
Algumas linguagens de programao, incluindo Java, permitem uma estreita associao entre a
declarao de um tipo de dados e a declarao das operaes que incidem sobre as variveis deste tipo.
Essa associao normalmente descrita como um tipo abstrato de dados.
Em Java, voc pode criar um tipo abstrato de dados atravs da implementao de mtodos:

/**
* Classe que modela o processo de avaliao dos alunos da disciplina
* Sistemas Orientados a Objetos I
* @author Felipe Gacho 2002
* @version exemplo
*/
public class Avaliacao
{
public float[] trabalhos = new float[4]; // quatro trabalhos
public float[] provas = new float[2];
// duas provas
/**
* Mtodo que permite a incluso da nota de um trabalho
* @param numeroDoTrabalho O nmero do trabalho a ser atribudo a nota
* @param nota A nota que o aluno tirou no trabalho
*/
public void atualizarNotaDeTrabalho(int numeroDoTrabalho, float nota)
{
trabalhos[numeroDoTrabalho] = nota;
}
/**

A B S T R A O

D E

D A D O S

* Mtodo que permite a incluso da nota de uma prova


* @param numeroDaProva O nmero da prova a ser atribudo a nota
* @param nota A nota que o aluno tirou na prova
*/
public void atualizarNotaDeProva(int numeroDaProva, float nota)
{
provas[numeroDaProva] = nota;
}
/** @return A nota do aluno na primeira avaliao parcial */
public float primeiraParcial()
{
float parcial = (2.0F * provas[0] + trabalhos[0] + trabalhos[1]) / 4.0F;
return parcial;
}
/** @return A nota do aluno na segunda avaliao parcial */
public float segundaParcial ()
{
float parcial = (2.0F * provas[1] + trabalhos[2] + trabalhos[3]) / 4.0F;
return parcial;
}
/** @return A mdia final do aluno */
public float media()
{
float media = (primeiraParcial() + segundaParcial() ) / 2.0F;
return media;
}
}

? no se preocupe com os modificadores public que aparecem na definio dos mtodos da classe
Avaliacao. No decorrer da disciplina iremos estudar os tipos de modificadores de mtodos e classes.

Definio de mtodos
Linguagens como Java, que comportam tipos abstratos de dados, criam uma estreita associao entre os
dados e o cdigo. No descrevemos um mtodo como uma operao sobre objetos do tipo Avaliao. Ao
invs disso, consideramos que objetos do tipo Avaliao "j sabem" como processar as operaes
relativas avaliao de um aluno. Por exemplo:
// mtodo inicial de um programa qualquer
static public void main(String[] args)
{
// Cria uma instncia da classe Avaliao e uma referncia a esse objeto
Avaliacao avaliacaoDoJoao = new Avaliacao();
avaliacaoDoJoao.atualizarNotaDeTrabalho(0, 8.5F);
avaliacaoDoJoao.atualizarNotaDeTrabalho(1, 8.0F);
avaliacaoDoJoao.atualizarNotaDeTrabalho(2, 9.0F);

45

// trabalho 1
// trabalho 2
// trabalho 3

A B S T R A O

D E

D A D O S

avaliacaoDoJoao.atualizarNotaDeTrabalho(3, 7.5F);

// trabalho 4

avaliacaoDoJoao.atualizarNotaDeProva(
avaliacaoDoJoao.atualizarNotaDeProva(

// prova 1
// prova 2

0, 7.2F);
1, 9.5F);

// note que, nesse trecho do cdigo, no foi necessrio calcular a mdia


// propriamente dita. Bastou chamar o mtodo mdia da classe Avaliao.
// Por isso, podemos interpretar que os objetos da classe Avaliacao
// "sabem como realizar a operao de clculo da mdia das notas".
float mediaDoJoao = avaliacaoDoJoao.media();
System.out.println("Mdia do Joo = " + mediaDoJoao);
}
C:\Felipe\fic\Avaliacao>java Avaliacao
Mdia do Joo = 8.3

? A idia de que mtodos so uma propriedade dos dados ao invs de consider-los como algo parte
um passo importante para a construo de um sistema Orientado a objetos. Algumas vezes, voc ir
ouvir o termo message passing. Esse termo usado em algumas linguagens para transmitir a noo de
instruo para que um item de dados realize algo para si prprio. Na verdade, nas linguagens que usam
convencionalmente essa terminologia, ela tambm reflete a natureza da implementao.
Em Java, os mtodos so definidos atravs de uma abordagem muito semelhante a que usada em
outras linguagens, em especial C e C++. A assinatura de um mtodo tem a seguinte forma:
<static / final> modificador tipoDeRetorno identificador (listaDeArgumentos)
{
// bloco de comandos
}
A palavra static significa que o mtodo no precisa estar associado a um objeto especfico. O uso de
static opcional. Dizemos que mtodos estticos so mtodos de classe, ou seja, podemos chama-lo a
partir do nome da classe. Exemplo:
System.out.println();
System.exit(0);
Note que os mtodos out.println(); e exit(0); no esto associados a um objeto da classe System, apenas
definio da prpria classe.
A palavra final tambm opcional e ser discutida mais tarde.
O identificador pode ser qualquer identificador legal, com algumas restries baseadas nos nomes que
j esto em uso. De acordo com o nosso padro de codificao, o nome de um mtodo sempre deve
comear com uma letra minscula e depois capitular a primeira letra das palavras que compem o
identificador.

46

A B S T R A O

D E

D A D O S

O tipoDeRetorno indica o tipo de valor retornado pelo mtodo. Se o mtodo no retornar nenhum valor,
ele deve ser declarado como void. O Java rigoroso quanto aos valores retornados e, se a declarao
estabelece que o mtodo retorna um int, por exemplo, ento voc deve proceder assim em todos os
caminhos possveis de retorno.
O modificador uma palavra reservada pertencente ao grupo de modificadores suportados em Java:
public, protected ou private. O modificador public de acesso indica que o mtodo pode ser chamado a
partir de qualquer outro cdigo e o private indica que um mtodo s pode ser chamado por outros
mtodos da mesma classe onde ele est sendo declarado. Discutiremos o protected mais adiante.
A listaDeArgumentos permite que parmetros sejam passados para um mtodo. Os elementos da lista
so separados por vrgula, enquanto cada elemento consiste em um tipo e um identificador. Por exemplo:

public void atualizarNotaDeTrabalho(int numeroDoTrabalho, float nota)


{
trabalhos[numeroDoTrabalho] = nota;
}

a lista de argumentos do mtodo atualizarNotaDeTrabalho composta de dois argumentos:


?? numeroDoTrabalho: um argumento do tipo inteiro (int)
?? nota:
um argumento do tipo ponto flutuante (float)
Note tambm que esse mtodo no retorna nenhum valor, ou seja, o tipo de retorno void (nulo).

? todos os argumentos em Java so passados por valor. Ou seja, o valor original do argumento no
ser modificado aps o retorno do mtodo. Quando a instncia de uma classe usada como argumento
de um mtodo, o valor que est sendo passado ao mtodo a referncia a esse objeto o valor dos
atributos desse objeto podem ser modificados no mtodo invocado, mas a referncia a esse objeto no.
Exemplo:
public class Valor
{
static public void main (String[] args)
{
// Aqui a varivel 'valor' tem o valor 2
int valor = 2;
somaDez(valor);
// Aqui a varivel 'valor' continua com o valor 2
System.out.println("valor =
" + valor);
}
// Note que esse mtodo private, ou seja, s pode ser acessado por
// objetos da classe Valor. O contexto 'static' ser discutido mais tarde
static private void somaDez(int valor)
{
// Aqui temos outra varivel , que recebeu o contedo do argumento 'valor'

47

A B S T R A O

D E

D A D O S

valor += 10;
}
}

A referncia this
Note nos exemplos anteriores que sempre usamos o operador ponto (.) para acessar os membros de
uma classe. Exemplo:
// Cria uma instncia da classe Avaliao e uma referncia a esse objeto
Avaliacao avaliacaoDoJoao = new Avaliacao();
avaliacaoDoJoao.atualizarNotaDeTrabalho(0, 8.5F);

// trabalho 1

Mas note tambm que dentro da classe Avaliacao, os membros so manipulados sem estarem
associados a um objeto:
public void atualizarNotaDeTrabalho(int numeroDoTrabalho, float nota)
{
// Note que a varivel trabalhos no est sendo
// associada a nenhum objeto
trabalhos[numeroDoTrabalho] = nota;
}

Isso possvel porque em Java, os membros de uma classe possuem, dentro da classe, uma referncia
implcita identificada pela palavra reservada this:
public void atualizarNotaDeTrabalho(int numeroDoTrabalho, float nota)
{
// Referncia ao objeto corrente
this.trabalhos[numeroDoTrabalho] = nota;
}

Essa referncia, na verdade, est associando o membro a um objeto do tipo da classe em que o mtodo
se encontra. Em Java no necessrio que se use a referncia this pois, caso uma referncia no seja
digitada, a referncia this ser assumida pelo interpretador Java (JVM).
Alm disso, a referncia this pode ser usada como argumento para representar o objeto corrente na
chamada de um mtodo:

/**
* Classe que modela o processo de avaliao dos alunos da disciplina
*/
public class Avaliacao
{
public float[] trabalhos = new float[4]; // quatro trabalhos
public float[] provas = new float[2];
// duas provas

48

A B S T R A O

D E

D A D O S

public void toString ()


{
System.out.println("Objeto atual = " + this);
}
//... demais mtodos ...
}

Gerando a documentao de um programa - javadoc


Dentre os programas que compem o ambiente de desenvolvimento Java, um dos mais interessantes
o gerador automtico de documentao, o javadoc. Javadoc um aplicativo que gera arquivos Html a
partir de um ou mais cdigos fonte Java. Essa documentao til para que outros desenvolvedores
consultem a funcionalidade das classes implementadas por terceiros.
Por exemplo: suponha que voc tenha implementado as classes de um sistema de avaliao de alunos
da FIC. E suponha que um outro programador deve usar essas classes para gerar uma interface grfica
que permita que os professores da faculdade atualizem as notas dos alunos via Internet. Esse outro
programador dever ser informado sobre a funcionalidade das classes implementadas por voc, ou seja,
qual a classe que representa uma avaliao, um aluno, etc. e quais os mtodos dessas classes devem
ser usados para atualizar as notas, os dados cadastrais, etc.
Essa informao encontrada na documentao das classes, gerada automaticamente pelo Java
conforme mostra exemplo abaixo:
C:\Felipe\fic\Avaliacao>md docs
C:\Felipe\fic\Avaliacao>javadoc -d docs Avaliacao.java
Loading source file Avaliacao.java...
Constructing Javadoc information...
Building tree for all the packages and classes...
Building index for all the packages and classes...
Generating docs\overview-tree.html...
Generating docs\index-all.html...
Generating docs\deprecated-list.html...
Building index for all classes...
Generating docs\allclasses-frame.html...
Generating docs\index.html...
Generating docs\packages.html...
Generating docs\Avaliacao.html...
Generating docs\serialized-form.html...
Generating docs\package-list...
Generating docs\help-doc.html...
Generating docs\stylesheet.css...
C:\Felipe\fic\Avaliacao>
Os comandos acima executam as seguintes operaes:
A primeira linha gera um novo diretrio onde sero armazenados os arquivos da documentao: md
<diretrio> (em sistemas operacionais UNIX/Linux, o comando o mkdir <diretrio>)

49

A B S T R A O

D E

D A D O S

Depois chamado o aplicativo javadoc, passando como parmetro da linha de comando o nome do
cdigo-fonte (ou dos cdigos-fonte) a serem documentados.
Para ver a documentao recm criada, basta usar um browser para ler o arquivo que foi gerado
automaticamente dentro do diretrio de documentao: ./docs/index.html
Note que a documentao reala partes da documentao, como o nome do autor, a verso da classe,
etc. Esse destaque pode ser definido durante a implementao do cdigo, atravs de TAGS reservadas
pelo javadoc.
Algumas dessas tags, que devem ser usadas dentro de comentrios delimitados por /** */, so
enumeradas abaixo:
@author
@version
@param
@return
@exception

o
a
o
o
o

nome de quem implementou a clas


se (ou da empresa).
verso da classe
nome de um argumento usado por um mtodo
retorno de um mtodo
tipo de exceo ao qual um mtodo est sujeito

O aplicativo javadoc tem vrias opes que permitem ao programador personalizar a documentao de
seus sistemas. Para aprender mais sobre o javadoc, consulte a documentao que acompanha o
ambiente de desenvolvimento Java. (normalmente, essa documentao se encontra no diretrio:
../jdk1.3.1/docs/tooldocs/javadoc/in
dex.html, mas pode variar conforme o sistema
operacional e as opes utilizadas durante a instalao do jdk).

Documentao da API Java


Agora que voc est familiarizado com o formato de documentao usado pelo Java, podemos investigar
a API Java (Application Programming Interface interface de programao de aplicativo).
A API Java um conjunto de classes disponveis aos programadores, desenvolvidas pela SUN e que
visam agilizar a produo de softwares compatveis com a linguagem Java.
Essas classes se encontram no diretrio ../jdk1.3.1/jre/lib/rt.jar. (Os arquivos *.jar podem ser
"investigados" com aplicativos de compactao de arquivos, tais como o WinZIP)
A documentao dessas classes est publicada na documentao do ambiente de desenvolvimento Java
(normalmente no diretrio ../jdk1.3.1/docs/api/index.html). Note que essa documentao foi criada
tambm pelo javadoc, e que tem o mesmo formato da documentao das classes

? vital que o aluno se habitue a consultar essa documentao durante o desenvolvimento de


programas em Java. Nesse primeiro momento, procure navegar pela documentao da API Java,
identificando o formato da informao, os termos,etc. Outra boa iniciativa consultar tambm a
documentao do ambiente de desenvolvimento Java, que normalmente se encontra no diretrio
../jdk1.3.1/docs/index.html. Conhecer amplamente a API Java prerrogativa para todo bom
programador Java.

Exerccios
1. Implemente um classe que represente um aluno da FIC, contendo trs membros:
a. O nome do aluno
b. O nmero de matrcula do aluno
c. Um objeto da classe Avaliacao

50

A B S T R A O

D E

D A D O S

2. Depois implemente o mtodo principal dessa classe com o seguinte comportamento:


/**
* Perguntar ao usurio o nome, nmero de matrcula e as
* seis notas de um aluno. Depois, imprima a identificao e a mdia do aluno,
* dizendo se ele foi:
*
aprovado (mdia > 6.9)
*
dependente de prova final (3.9 < mdia <7.0)
*
reprovado: (mdia < 4.0)
*/
static public void main(String[] args)
{
}

3. Copie e salve a classe Avaliacao.java no mesmo diretrio em que voc gravou a sua classe
Aluno. Compile as classes Avaliacao.java e Aluno.java, e depois execute o programa Aluno.class
4. Comente os membros que voc implementou na classe Aluno e gere a documentao das duas
classes. Observe o resultado.

51

Encapsulamento e sobrecarga de
mtodos

Esta seo apresenta o controle sobre a acessibilidade dos membros de uma classe e a
implementao de classes com comportamento dinmico atravs da sobrecarga de
mtodos.

Acessibilidade dos membros de uma classe


Considere a criao de uma classe, por exemplo, a classe Avaliacao vista na aula passada. Quando
instanciamos um objeto da classe Avaliacao, seus membros podem acessados por quaisquer outros
objetos presentes na Mquina Virtual Java (JVM). Isso definido pelo modificador public que antecede a
declarao desses membros.
// Acessando os membros da classe carteira de estudante:
Avaliacao notas = new Avaliacao();
// Note que um valor invlido pode ser atribudo
// a um membro pblico de uma classe
notas.trabalhos[0] = -4.5F; // Nota menor que zero
notas.provas[1] = 20F;
// Nota maior que 10

Algumas vezes, entretanto, precisamos evitar que valores invlidos ou comportamentos invlidos sejam
atribudos aos membros de uma classe. No exemplo acima, uma nota jamais poderia ser negativa ou
maior que dez. Como os membros da classe Avaliacao so todos pblicos, a consistncia desses
membros deve ser garantida externamente ao cdigo da classe, o que torna a consistncia dos objetos
dessa classe muito frgil.
Para contornar isso, a Orientao a Objetos define outras formas de acessibilidade aos membros de uma
classe, atravs dos modificadores final, protected e private. Atravs desses modificadores, o
programador pode ENCAPSULAR os membros de uma classe, de forma a garantir a sua consistncia. O
membro de uma classe pode ser:
o Pblico declarado com o modificador public, e acessvel por qualquer objeto instanciado na
mquina virtual. Normalmente declaramos pblicos apenas alguns mtodos de uma classe. Os
membros variveis so todos declarados privados, salvo raras excees.
o Privado declarado com o modificador private, e acessvel somente por mtodos da de objetos
da prpria classe onde o membro foi declarado.

E N C A P S U L A M E N T O

S O B R E C A R G A

D E

M T O D O S

o Protegido declarado com o modificador protected, e acessvel somente por mtodos de


subclasses da classe onde o membro foi declarado ou da prpria classe onde o membro foi
declarado. Esse modificador ser estudado junto com os conceitos de herana e polimorfismo,
mais tarde em nossa disciplina.
o Constante um membro declarado com o modificador final no pode ter a sua definio
modificada por nenhum objeto, nem mesmo um objeto da classe onde o membro foi definido.
Dizemos que um membro final uma constante. No caso de herana, uma subclasse no pode
sobrecarregar um mtodo declarado como final na superclasse. (isso ser estudado mais
adiante).

O modificador final
Membros declarados com o modificador final so membros constantes, ou seja, cujo valor no pode ser
mais modificado.
Exemplo:

/**
* Classe que modela o processo de avaliao dos alunos da disciplina
* Sistemas Orientados a Objetos I
* @author Felipe Gacho 2002
* @version exemplo
*/
public class Avaliacao
{
final int numeroDeProvas=2; // um membro final deve ser inicializado na declarao
final int numeroDeTrabalhos=4; // ou no construtor (veremos construtores mais tarde)
public float[] trabalhos = new float[numeroDeTrabalhos];
public float[] provas = new float[numeroDeProvas];

// Um mtodo declarado FINAL no poder ser sobrescrito em subclasses da


// classe Avaliacao (veremos isso mais adiante)
final public void teste()
{
// Essa linha causar um erro de compilao
numeroDeProvas = 5;
}
}
C:\Felipe\fic\Avaliacao>javac Avaliacao.java
Avaliacao.java:48: cannot assign a value to final variable numeroDeProva
s
numeroDeProvas = 5;
^
1 error
C:\Felipe\fic\Avaliacao>

53

E N C A P S U L A M E N T O

S O B R E C A R G A

D E

M T O D O S

O modificador private
Membros declarados com o modificador private so acessveis somente por mtodos da prpria classe
onde foram definidos.
Aqui est o segredo da consistncia: nos mtodos pblicos o programador codifica um a srie de
verificaes validade das operaes e das modificaes dos valores dos membros variveis da classe
(crtica). Caso a chamada ao mtodo no agrida consistncia do objeto, o mtodo atualiza os valores
ou executa a requerida operao. Por exemplo:

public class Avaliacao


{
final int numeroDeProvas = 2;
final int numeroDeTrabalhos = 4;
// Observe que os membros agora so privados. S podem ser acessados
// pelo objeto que os possui.
private float[] trabalhos = new float[numeroDeTrabalhos];
private float[] provas = new float[numeroDeProvas];
/**
* Mtodo que permite a incluso da nota de um trabalho
* @param numeroDoTrabalho O nmero do trabalho a ser atribudo a nota
* @param nota A nota que o aluno tirou no trabalho
*/
public void atualizarNotaDeTrabalho(int numeroDoTrabalho, float nota)
{
// Verifica se o ndice da nota vlido
if(numeroDoTrabalho>-1
&& numeroDoTrabalho<numeroDeTrabalhos)
{
// verifica se a nota vlida
if(nota>=0F && nota<=10F)
{
// Notas s sero atribudas se forem vlidas
// e para o ndice correto. Ou seja,
// os membros variveis de um objeto
// dessa classe sempre
// estaro consistentes
trabalhos[numeroDoTrabalho] = nota;
}
else
{
System.out.println("nota invlida");
}
}
else
{
System.out.println("nmero do trabalho invlido");
}
}
// demais definies da classe (corpo da classe)
54

E N C A P S U L A M E N T O

S O B R E C A R G A

D E

M T O D O S

Encapsulamento
O acesso exclusivo por mtodos aos membros variveis de uma classe e a implementao da verificao
de consistncia nesses mtodos formam o conceito de encapsulamento.
Encapsulamento a garantia que os objetos de uma classe sempre sero consistentes quanto aos
valores e comportamento esperados para esse objeto. O nome vem da idia de que o objeto protegido
por uma cpsula, acessvel somente atravs de mtodos que possuem um controle rgido de
consistncia. Isso muito importante na distribuio de classes, pois um programador pode declarar
objetos de uma determinada classe em seus programas, confiando que o comportamento desse objeto
obedecer documentao da classe.

Sobrecarga de mtodos
Algumas vezes, um problema pode exigir que uma classe permita que uma mesma operao seja
aplicada a diversos tipos de dados. Por exemplo: suponha que voc esteja implementando uma classe
chamada Matematica, com o intuito de prover as quatro operaes aritmticas: soma, subtrao,
multiplicao e diviso. Note que essas operaes podem ser aplicadas a nmeros inteiros ou
fracionrios, e seria tedioso para o programador ficar diferenciando os mtodos para cada tipo de
argumento (ex: somaDeInteiros(), somaDeDouble(), etc..)
A soluo para isso conhecida em Orientao a Objetos como sobrecarga de mtodos, exemplo:

public class Matematica


{
/**
* Mtodo que soma dois inteiros
* @param operando1 um nmero inteiro
* @param operando2 um nmero inteiro
* @return a soma dos dois operandos
*/
public int soma (int operando1, int operando2)
{
return operando1 + operando2;
}
/**
* Mtodo que soma um nmero com ele mesmo
* @param operando um nmero inteiro
* @return a soma do numero com ele mesmo
*/
public int soma (int operando)
{
return operando + operando;
}

/**

55

E N C A P S U L A M E N T O

S O B R E C A R G A

D E

M T O D O S

* Mtodo que soma dois nmero de ponto flutuante


* @param operando1 um nmero de ponto flutuante
* @param operando2 um nmero de ponto flutuante
* @return a soma dos dois operandos
*/
public float soma (float operando1, float operando2)
{
return operando1 + operando2;
}

? algumas linguagens, como C++, permitem a sobrecarga de operadores, mas Java no permite a
sobrecarga de operadores.
Os critrios para a sobrecarga de mtodos so os seguintes:
o

A lista de argumentos deve ser diferente o suficiente para evitar a ambigidade entre os
mtodos. O programador deve prever o uso de promoes e casting, que podem causar
confuso na chamada dos mtodos.

O tipo de retorno dos mtodos pode ser diferente, mas no basta para que seja caracterizada
a sobrecarga. A lista de argumentos deve apresentar alguma diferena, como o nmero de
argumentos ou o tipo desses argumentos.

Exerccios
7.

Reescreva a classe Avaliacao.java da aula passada, garantindo que os valores das notas e o
clculo das mdias seja sempre consistente. Discuta com seus colegas quais modificadores
devem ser aplicados aos membros dessa classe para que os objetos sejam sempre consistentes.

8.

Reescreva a classe Aluno.java da aula passada, realizando testes de consistncia a partir da


classe Avaliacao.java que voc reescreveu acima

9.

Generalize a classe Avaliacao.java permitindo que uma disciplina possa tambm adotar valores
inteiros para as mdias de seus alunos. Teste com a classe Alunos.java.

56

Construtores

10

Conforme avanamos no estudo de programao orientada a objetos, aumentamos o


grau de abstrao de nosso discurso - passamos a citar objetos como se eles fossem
palpveis dentro de nosso sistema. Entretanto, uma viso mais atenta nos lembra que
os objetos continuam sendo abstraes de bits armazenados na memria RAM do
computador. Nesta seo o aluno orientado a pensar na forma como os sistemas
criam objetos e como os membros de suas classes so organizados na memria em tempo
de execuo.

Processo de instanciao de objetos


Quando declaramos uma varivel de um tipo abstrato de dado, uma classe, estamos apenas criando um
a referncia a um objeto dessa classe. Esse objeto s passar a existir quando o comando new for
interpretado pela JVM. Esse comando instancia um objeto a partir do construtor definido para a classe
em questo.
A instanciao de um objeto em Java obedece ao seguinte roteiro:
1. O espao para o novo objeto alocado na memria da mquina virtual e inicializado com valores
padro. Em Java, nenhum objeto pode ser instanciado com os valores de seus membros
aleatrios (tal qual ocorre em C++). Por exemplo, quando declaramos um array de inteiros de 30
posies em Java, esse array ser preenchido com o valor ZERO no momento de sua alocao
na memria .
2. A seguir executada a inicializao explicita dos membros do objeto, caso essa inicializao
faa parte do cdigo da classe desse objeto.
3. Finalmente, o construtor da classe executado.

Inicializao explcita de membros variveis


Quando instanciamos um objeto de um determinada classe, os membros variveis desse objeto recebem
os seguintes valores padro:
Tipo:
int, byte ou long
float, double
Char
String
Demais classes

Valor inicial:
0
0.0
'' (valor 0)
""
Null

C O N S T R U T O R E S

Muitas vezes, porm, pretendemos definir os valores padro para os membros dos objetos de uma
classe. Tal definio feita atravs da inicializao explcita de membros variveis. Exemplo:

/**
* Classe que modela o processo de avaliao dos alunos da disciplina
* Sistemas Orientados a Objetos I
* @author Felipe Gacho 2002
* @version exemplo
*/
public class Avaliacao
{
// Membros de classe, constantes, normalmente so declarados
// estticos (static), pois a referncia de todas as instncias
// dessa classe faro referncia ao mesmo espao de memria alocado
// para esses membros. Padro de codificao: variveis finais so
// declaradas sempre com todas as letras maisculas, e as palavras
// so separadas por subscritos (_)
static final int NUMERO_DE_PROVAS;
static final int NUMERO_DE_TRABALHOS;
private String nomeDaDisciplina = "SOO-I";
// O uso do modificador private faz com que esse
// membros variveis sejam membros do objeto e no da classe
private float[] trabalhos;
private float[] provas;
// Note que isso um bloco inicializador e no um mtodo, pois no
// tem assinatura.
{
try
{
trabalhos = new float[NUMERO_DE_TRABALHOS];
provas = new float[NUMERO_DE_PROVAS];
}
catch(Exception erro)
{
// O objetivo do bloco inicializador evitar que eventuais
// erros de inicializao explcita fiquem sem tratamento.
erro.printStackTrace();
System.exit(0);
}
}
// Por ser esttica, essa inicializao ser executada antes de outras
// inicializao que no sejam estticas, como a inicializao acima.
static
{
NUMERO_DE_PROVAS = 2;
NUMERO_DE_TRABALHOS = 4;
}

58

C O N S T R U T O R E S

// restante do corpo da classe....


}

Construtores
Algumas vezes, os valores dos membros de um objeto s sero conhecidos no momento de sua
instanciao. Esse comportamento dinmico previsto em Orientao a Objetos atravs da
implementao de construtores. Em Java, um construtor um mtodo, identificado com o nome da
classe a que pertence, podendo conter argumentos. Exemplo:

/**
* Classe que modela o processo de avaliao dos alunos da disciplina
* Sistemas Orientados a Objetos I
* @author Felipe Gacho 2002
* @version exemplo
*/
public class Avaliacao
{
// inicializadores (vide exemplo anterior)
// Construtor padro, sem argumentos
Avaliacao()
{
System.out.println("objeto da classe Avaliacao");
}

// Construtor com argumentos


Avaliacao(int[] notas)
{
if(notas.length != (numeroDeProvas + numeroDeTrabalhos))
{
System.out.println("erro nos parmetros do construtor");
// O comando return pode ser usado para encerrar a
// execuo de um construtor
return;
}
else
{
// A referncia this opcional (implcita)
this.atualizarNotaDeProva(0, notas[0]);
atualizarNotaDeProva(1, notas[1]);
this.atualizarNotaDeTrabalho(0, notas[2]);
this.atualizarNotaDeTrabalho(1, notas[3]);
this.atualizarNotaDeTrabalho(2, notas[4]);
this.atualizarNotaDeTrabalho(3, notas[5]);
}
}

59

C O N S T R U T O R E S

? quando no declaramos nenhum construtor para uma classe, o interpretador da JVM considera um
construtor padro, onde todos os membros dos objetos criados sero inicializados com seus respectivos
valores padro.

Exerccios
1. Construa um sistema de cadastro de avaliaes de alunos, utilizando os conceitos das aulas 8, 9
e 10. Lembre-se que os objetos do seu sistema devem ser todos consistentes, e que o sistema
deve obedecer ao padro de codificao. Seu programa deve ter pelo menos as trs primeiras
classes, identificadas abaixo (nomes sugeridos):
a. Aluno.java uma classe que representa a classe dos alunos da FIC. Um aluno da FIC,
para o nosso exerccio, um objeto que dentre os seus membros possui:
i. Carteira de estudante
ii. Um relatrio de avaliao
b. Avaliacao.java uma classe que representa uma avaliao padro dos alunos da FIC,
composta pela nota de duas provas e quatro trabalhos. (voc pode definir seus prprios
critrios de avaliao, mas eles tem que ser claros).
c.

CarteiraDeEstudante.Java uma classe que representa uma carteira de estudante,


contendo pelo menos o nome e o nmero de matrcula do aluno. Voc pode definir outros
membros dessa classe, como o nmero do curso, o nome da faculdade, etc. Dica: crie
um construtor que lhe permita preencher os dados da carteira de estudante do aluno no
ato da instanciao dos objetos dessa classe.

d. CadastroDeAvaliacao.java o sistema propriamente dito (a nica classe que precisa


ter mtodo static public void main(String[] args){}), essa classe identifica e
executa comandos digitados pelo usurio. Essa classe pode usar um array de tamanho
pr-estabelecido para guardar os objetos que representam os alunos. Uma forma mais
elegante que esse array seja dimensionado no momento da instanciao dessa classe.
Dica: crie um construtor que lhe permita dimensionar o array que armazena os objetos.
2. Gere a documentao do seu sistema com o javadoc.

60

Herana e polimorfismo

11

A relao entre as classes de um sistema orientado a objetos.

O conceito de classificao
Quando implementamos uma classe, estamos modelando alguma coisa, um empregado, um automvel,
um animal, etc. Muitas vezes, porm, precisamos refinar esse modelo para representar subgrupos de
objetos dentro dessa classe.
Por exemplo, suponha que voc crie uma classe para representar os funcionrios da FIC:

public class Funcionario


{
private String nome;
private String funcao;
private Date dataDeAdmissao;
private double salario;
public void decimoTerceiro(Date dataAtual)
{
// clculo do dcimo terceiro salrio
}
public void alterarSalario(double novoSalario)
{
salrio = novoSalario;
}
// restante do corpo da classe
}

Agora imagine que voc deseja representar os seguintes tipos de funcionrios da FIC: um coordenador
de curso, um professor e um auxiliar de limpeza. Note que essas trs classes de funcionrios possuem
muitos membros variveis em comum, como data de admisso, salrio, funo, nome, etc. E possuem
tambm alguns mtodos em comum, como o clculo do dcimo terceiro, alterao de salrio, etc. Porm,
cada uma dessas classes possui um conjunto de mtodos exclusivos, ou seja, que s se aplicam a seus
objetos e no a objetos de outras classes. Por exemplo: um auxiliar de limpeza tem o mtodo public
void limpar();, o coordenador tem o mtodo public void criarTurma(Turma aula); e o
professor tem o mtodo public void lecionar();. Observe tambm que um coordenador por sua
vez um professor, e portanto possui todos os mtodos de um professor e mais alguns exclusivos da
classe Coordenador.

H E R A N A

P O L I M O R F I S M O

Se fssemos criar uma classe para cada uma dessas categorias de funcionrios, acabaramos repetindo
muito cdigo, alm do qu, perderamos a importante relao existente entre os objetos dessas classes:
todos so funcionrios.
Para resolver isso, a Orientao a Objetos define o conceito de herana, permitindo que subclasses
sejam criadas a partir de uma classe original, mais genrica e conhecida como superclasse.
No nosso exemplo, teremos a seguinte hierarquia de classes:

nvel 0

SUPERCLASSE

nvel 1

SUBCLASSE

nvel 2

SUB SUBCLASSE

Funcionrio

Professor

Auxiliar
de limpeza

Coordenador

Uma das grandes vantagens do uso de subclasses o aumento da confiabilidade e facilidade de


manuteno dos sistemas. Se, por acaso, precisarmos mudar o comportamento da classe Funcionario,
as demais classes refletiro essa mudana sem a necessidade de serem todas reimplementadas. Por
exemplo, se a regra para o clculo do dcimo terceiro salrio for alterada pelo governo, bastar ao
desenvolvedor alterar um nico trecho de cdigo, justamente o mtodo "public void
decimoTerceiro(Date dataAtual)" da classe Funcionrio. Caso contrrio o desenvolvedor teria que alterar
todas as classes que implementassem o clculo de dcimo terceiro salrio.
Observe tambm que quanto mais abaixo na hierarquia, mais especializado se torna uma classe. A idia
que as classes superiores sejam bastante genricas, permitindo a representao mais abrangente
possvel das entidades que inspiraram o projeto dessa classe.

A palavra reservada extends


Em Java usamos a palavra reservada extends para definir uma subclasse. Essa palavra traduz a idia
de que uma classe est estendendo as caractersticas e a funcionalidade de sua superclasse. No nosso
exemplo teramos:
// Essa classe herda todos os atributos e a funcionalidade da classe Funcionario
public class AuxiliarDeLimpeza extends Funcionario
{
public void limpar(Sala aula)
{
// mtodo que limpa uma sala de aula
}
62

H E R A N A

P O L I M O R F I S M O

// restante do corpo da classe


}
// Essa classe herda todos os atributos e a funcionalidade da classe Funcionario
public class Professor extends Funcionario
{
public void lecionar (Disciplina aula)
{
// mtodo que processa o ensino da disciplina referenciada por 'aula'
}
// restante do corpo da classe
}
// Essa classe herda todos os atributos e a funcionalidade da classe Funcionrio e tambm
// da classe Professor
public class Coordenador extends Professor
{
public void criarTurma(Turma turma, Curso curso)
{
// mtodo que cria uma nova turma de alunos
}
// restante do corpo da classe
}
Note que as classes estendidas de Funcionrio herdam todas as caractersticas dessa classe. Por
exemplo, um objeto da classe Professor tem os membros variveis nome, funo, etc. bem como os
mtodos alterarSalario e decimoTerceiro:

// Fragmento de cdigo
{
Coordenador sid = new Coordenador();
Professor pardal = new Professor();
// Esses seriam comandos vlidos, considerando que o valor dos membros
// j tenham sido inicializados
System.out.println(pardal.decimoTerceiro());
System.out.println(sid.funcao);
}

Herana em Java
Em Orientao a Objetos usamos a palavra herana para expressar a idia de que uma classe herda
todas as caractersticas e funcionalidade de uma outra classe. No nosso exemplo, as classes Professor e
AuxiliarDeLimpeza herdam os membros da classe Funcionrio. A classe Coordenador herda os membros
da classe Funcionrio e tambm herda os membros da classe Professor.
Um detalhe importante que na linguagem Java no existe herana mltipla. No que a
herana mltipla seja um conceito errado, pelo contrrio, linguagens como C++ implementam herana
63

H E R A N A

P O L I M O R F I S M O

mltipla e esse um conceito bastante polmico e discutido em congressos sobre linguagens de


programao. Os criadores da Java optaram por exigir herana simples por acreditarem que assim o
cdigo de torna mais legvel e confivel, embora reconheam que, s vezes, isso causa um trabalho
extra aos desenvolvedores Java. A modelagem de alguns sistemas se torna redundante sem herana
mltipla, mas na grande maioria dos casos isso no ocorre. Uma alternativa diante da ausncia de
herana mltipla o uso de interfaces, um recurso de modelagem que ser discutido mais adiante na
disciplina.
Outro aspecto importante o fato de que os construtores no so herdados pelas subclasses. Uma
classe estendida de outra herda todos os membros dessa superclasse menos os seus construtores.

A superclasse Object
Em Java, toda a classe implicitamente estendida da classe Object, definida na API da linguagem
como:
public class Object;
A superclasse do nosso exemplo poderia ter sido declarada assim:
public class Funcionario extends Object;
o mesmo que
public class Funcionario

Polimorfismo
Descrever um professor como um funcionrio no apenas uma forma conveniente de expressar a
relao entre essas duas classes, tambm uma forma de reaproveitamento de modelos. Quando
criamos um modelo de funcionrios da FIC, dizemos que esses funcionrios tem um mtodo chamado
decimoTerceiro(). Quando depois criamos um modelo de professores da FIC baseado no modelo dos
funcionrios, assumimos que os professores tambm so capazes de processar o mtodo
decimoTerceiro(), sem que para isso tenhamos que reimplementar esse mtodo.
Essa relao leva idia de polimorfismo (do grego poli + morfos = vrias formas). Um objeto polimrfico
um objeto que pode ter formas diferentes, funcionalidades diferentes mas continua a pertencer a uma
nica classe.
No nosso exemplo, um professor e um auxiliar de limpeza so entidades com caractersticas e
comportamentos diferentes, porm ambos continuam sendo funcionrios. Por esse motivo, dizemos que
a classe Funcionrio polimrfica, ou seja, no existe um formato nico para os indivduos que
constituem a classe Funcionrio.
Java, como a maioria das linguagens orientadas a objeto, permite que um objeto seja referido com uma
varivel que de um dos tipos da classe-pai:
// fragmento de cdigo
{
// Instanciao vlida de objetos
private Funcionario cleto = new Coordenador();
private Funcionario gaucho = new Professor();
private Object robo = new AuxiliarDeLimpeza();
}
64

H E R A N A

P O L I M O R F I S M O

? quando criamos uma referncia a um tipo abstrato de dados, uma classe, o compilador Java
considera que o objeto atribudo a essa referncia ser do tipo declarado e no do tipo usado para criar o
objeto. No exemplo acima, os objetos atribudos s referncias tero as seguintes caractersticas:
cleto
ter as caractersticas de um funcionrio e no de um coordenador.
gaucho
ter as caractersticas de um funcionrio e no de um professor.
robo
ter as caractersticas de um objeto e no de um auxiliar de limpeza.

Argumentos e colees heterogneas


Parece estranho criar uma referncia para um objeto da classe Funcionario e deliberadamente atribuirlhe uma instncia da classe Coordenador. verdade, mas h motivos para que voc queira alcanar
esse efeito.
Ao usar essa abordagem, voc pode escrever mtodos que aceitem um objeto "genrico", nesse caso,
um Funcionario, e trabalhar adequadamente em qualquer subclasse dele. Assim, em uma determinada
aplicao, voc pode implementar um mtodo que tem um objeto do tipo Funcionario como argumento e
realiza operaes sobre ele, independente da forma como esse objeto foi instanciado:
// fragmento de cdigo
{
static public void main(String[] args)
{
Funcionario[] funcionarios = new Funcionario[3];
// coleo heterognea
funcionarios[0] = new Coordenador();
funcionarios[1] = new Professor();
funcionarios[2] = new AuxiliarDeLimpeza();
// chamando um mtodo com argumentos heterogneos
emitirRelatorio(new Professor()); // emitirRelatorio(Professor)
emitirRelatorio(funcionarios[0]); // emitirRelatorio(Funcionario)
}
// Mtodo que usa uma superclasse como argumento:
// Note que esse mtodo pode receber o argumento da classe
// Funcionrio ou de qualquer uma de suas subclasses.
static public void emitirRelatorio(Funcionrio empregado)
{
System.out.println(empregado.nome + ", " + empregado.salario);
}
}

Uma coleo heterognea um agrupamento de coisas diferentes. Em Orientao a Objetos, voc pode
criar colees de quaisquer objetos que tenham em comum uma classe ancestral. No exemplo acima, o
array funcionarios uma coleo heterognea de objetos que compartilham a superclasse Funcionario.
Podemos imaginar outras aplicaes do uso de colees heterogneas, por exemplo, escrever um
mtodo que coloca os funcionrios em ordem por salrio ou data de admisso sem a preocupao com a
funo desses funcionrios, se eles so coordenadores, professores ou auxiliares de limpeza.
65

H E R A N A

P O L I M O R F I S M O

? Como em Java toda classe uma subclasse de Objeto, voc pode usar um array de objetos da classe
Object como uma coleo de quaisquer outros objetos. Os nicos membros variveis que no podem ser
colocadas em uma coleo de objetos do tipo Object so membros declarados como tipos primitivos de
dados.
Mais tarde estudaremos em detalhes outras formas de usar colees em Java. Veremos que a
linguagem prov algumas classes especficas para o tratamento de colees, cuja superclasse a
java.util.AbstractCollection .Java especialmente elegante no tratamento de colees, o que
justifica uma (futura) aula especfica sobre esse assunto.

O operador instaceof
Sabendo-se que voc pode circular objetos usando referncias s suas classes-pai, muitas vezes voc
pode querer saber o que voc realmente tem. Esse o objetivo do operador instanceof. Imagine que
nossa classe hierrquica seja estendida, de modo que temos:
// fragmento de cdigo
{
static public void main(String[] args)
{
cumprimentar(new Professor());
cumprimentar(new Coordenador());
cumprimentar(new AuxiliarDeLimpeza());
cumprimentar(new Funcionario());
}
// Note que esse mtodo usa a instncia do objeto recebido
// como argumento para adotar um comportamento diferenciado
// para cada subclasse de Funcionrio. Ou seja,
// o operador instanceof permite a tomada de decises
// a partir da classificao dos objetos.
static public void cumprimentar(Funcionario empregado)
{
if(empregado instanceof Coordenador)
{
System.out.println(
"Seja bem vindo Sr. " + empregado.nome);
}
else if(empregado instanceof Professor)
{
System.out.println(
"Bom dia professor " + empregado.nome);
}
else if(empregado instanceof AuxiliarDeLimpeza)
{
System.out.println(
"Fala a, grande " + empregado.nome);
}
else
{
// Funcionrio genrico

66

H E R A N A

P O L I M O R F I S M O

System.out.println("ol.");
}
}
}

Exerccios
1. Implemente uma superclasse Animal, e depois trs subclasses: Mamferos, Peixes e Aves.
Depois crie um programa de testes que lhe permita criar instncias dessas classes.
2. Modifique as classes do exerccio anterior, implementando um mtodo que imprime na tela o som
de cada animal criado a partir dessas classes. Por exemplo, um cachorro deve latir, uma ave
deve gralhar e um peixe no deve fazer barulho.
3. Altere o programa de testes do primeiro exerccio para que ele crie aleatoriamente 10 animais, e
depois imprima na tela o som de cada um deles, identificando se um mamfero, um peixe ou
uma ave.
4. Aumente o nmero de classes de seu exerccio, especializando ainda mais os tipos de animais
representveis por elas. Por exemplo, inclua uma classe Cachorro, subclasse de Mamfero, ou
uma classe Acara, subclasse de Peixe. Depois v especializando ainda mais, criando as classes
Poodle e AcaraBandeira.
5. Desenhe em um papel a hierarquia entre as classes que voc criou no exerccio anterior.

67

Classes abstratas e interfaces

12

Uma das contribuies maiores da Orientao a Objetos foi a estratificao funcional


da mo de obra envolvida no desenvolvimento de um programa de computador. Hoje
em dia os programadores no mais concebem e implementam seus cdigos a partir de
sua livre intuio - so orientados por sofisticados mecanismos de anlise e modelagem
de sistemas que freqentemente geram esboos (esqueletos) de programas. Esses cdigos
incompletos representam a viso abstrata do sistema e dependendo do padro de projeto
utilizado podem ser fortemente baseados em interfaces.

Classes abstratas e concretas


Quando descrevemos uma hierarquia de classes, nem todas as classes so previstas de serem
instanciadas. Por exemplo, observe a hierarquia de classes das figuras geomtricas (vide a 2 lista de
exerccios):

ABSTRATA

CONCRETA

Geometria

Retangulo

Circulo

Quadrado

Triangulo

Equilatero

Note que, apesar de Geometria ser uma classe, no faz muito sentido imaginar um "objeto geometria".
No mundo real, sempre identificamos uma forma geomtrica atravs de uma subclasse de Geometria:
um quadrado, um tringulo, etc. Por isso dizemos que a classe Geometria abstrata. De fato, o mais
correto dizer superclasse abstrata, pois a existncia de objetos dessa classe sempre depender da
implementao de alguma subclasse (concreta).
Uma superclasse abstrata possui as seguintes caractersticas:
??

No pode ser instanciada, mesmo que possua construtor (algumas linguagens, como Java,
permitem a implementao de construtores em classes abstratas, mas no faz sentido, pois
esses construtores no sero acessveis).

T R A T A M E N T O

??
??

D E

E X C E E S

Pode possuir membros abstratos, ou seja, mtodos cujo comportamento s ser definido em
suas subclasses.
Pode possuir membros concretos, ou seja, mtodos comuns - com o comportamento j previsto
na prpria classe abstrata.

? mtodos abstratos s podem ser implementados em classes abstratas. Por outro lado, mtodos
concretos tambm podem ser implementados em classes abstratas.
O motivo de implementarmos uma superclasse abstrata permitirmos a representao correta da relao
e hierarquia entre outras classes: concretas e/ou abstratas. No exemplo acima, se retirarmos a classe
Geometria do diagrama, as demais classes continuaro a existir, mas no tero uma relao definida
entre elas. Ou seja, poderemos construir objetos Quadrados, Tringulos, etc., mas no teremos tratar
esses objetos como pertencentes a uma mesma superclasse.

O modificador abstract
Em Java, usa-se o modificador abstract para definir uma classe abstrata:

/** Superclasse abstrata. */


abstract class Geometria
{
abstract public double area();
public abstract double perimetro();
}

Note que os mtodos da classe Geometria foram declarados tambm abstratos. Isso significa que as
subclasses de Geometria devero implementar esses mtodos ou ento serem igualmente
abstratas.

? no existe uma ordem rgida entre os modificadores de uma classe ou mtodo. No exemplo acima,
por exemplo, a ordem dos modificadores public e abstract foi digitada propositalmente diferente nos dois
mtodos. Isso foi apenas para exemplificar a liberdade que existe na ordem dos modificadores.
Entretanto, fundamental que o programador escolha uma nica ordem de aplicar os modificadores,
tornando o cdigo mais elegante e legvel.
Existem subclasses abstratas ? sim, existem. Em alguns casos, subclasses de uma superclasse abstrata
sero tambm abstratas. Por exemplo, imagine que a hierarquia Geometria vista anteriormente seja uma
generalizao entre geometria plana e geometria espacial:

Geometria

Plana

Retangulo

Elipse

Espacial

Triangulo
69

Cubo

Esfera

T R A T A M E N T O

D E

E X C E E S

Nessa nova hierarquia, as classes Plana e Espacial tambm devero ser abstratas, apesar de serem
subclasses da classe Geometria.
* O aluno deve exercitar bastante a idia de generalizao e especializao proposta pela hierarquia de
classes. Essa a idia central do paradigma de Orientao a Objetos e inspirada no que se acredita
ser a base do pensamento humano.

Restrio de herana pelo modificador final


Nas sees anteriores, vimos o uso do modificador final para definirmos membros variveis com valores
constantes. Alm de definir valores constantes, o modificador final pode ser usado para restringir a
herana de classes e mtodos:

/** Classe final que no pode ser extendida. */


final class Quadrado extends Retngulo
{
// O construtor Quadrado implicitamente final
Quadrado(double lado)
{
super(lado, lado);
}
}

O exemplo acima define a classe Quadrado como final, ou seja, nenhuma outra classe opder estender a
classe Quadrado. O construtor da classe no foi implementado com o modificador final. Apesar disso, o
construtor final porque todos os mtodos de uma classe final so implicitamente final. Tambm
podemos ter mtodos final, ou seja, uma classe normal possuir um dos seus mtodos modificados como
final. Nesse caso, essa classe pode ser estendida, mas a subclasse no poder sobrecarregar esse
mtodo final.

As referncias this e super


At aqui acessamos objetos atravs de referncias explicitamente criadas no cdigo dos programas.
Entretanto, quando um objeto instanciado na memria, so criadas duas referncias implcitas: super e
this. A referncia super diz respeito superclasse de um objeto e a referncia this referencia o prprio
objeto.
Para referenciarmos a superclasse de um objeto usamos a palavra reservada super. Note no exemplo
anterior, que o construtor da classe Quadrado chama um mtodo super(lado, lado);. Isso significa que o
construtor da classe Quadrado est chamando o construtor de sua superclasse Retngulo, e passando
os argumentos exigidos por esse construtor.
Outro exemplo de utilizao da referncia super com o operador ponto:

/** Classe final que no pode ser extendida. */


final class Quadrado extends Retngulo

70

T R A T A M E N T O

D E

E X C E E S

{
Quadrado(double lado)
{
// Chamando o construtor da superclasse
super(lado, lado);
}
public double area ()
{
// Chamando um mtodo da superclasse com o uso do operador ponto
return super.area();
}
}

O uso da referncia this justificado para definir o contexto de uma varivel e tambm para permitir
sobrecarga de construtores:

/** Exemplo inspirado na hierarquia de classes apresentada na aula 11 */


class Professor extends Funcionario
{
String nome;
double salrio;
// Semi default
Professor ()
{
// Acessando o construtor principal, passando parmetros padro
this ("", 0.0);
}
// Construtor com argumentos
Professor (String nome, double salario)
{
// A referncia this usada para distinguir o escopo das variveis
this.nome = nome;
this.salario = salario;
}
}

Exerccios
h. Desenhe uma hierarquia de classes capaz de representar os animais de um zoolgico,
considerando as seguintes restries:
1. O zoolgico deve ter pelo menos trs zonas diferentes, por exemplo: zona dos felinos,
das aves, dos rpteis, etc.
2. Cada seo deve ter pelo menos trs tipos diferentes de animais.

71

T R A T A M E N T O

i.
j.

D E

E X C E E S

3. Defina uma hierarquia de classes que inclua mtodos relativos alimentao dos
animais, locomoo, etc. Que permita a modelagem fiel das caractersticas de cada
animal.
Implemente as classes da hierarquia acima, incluindo o uso dos conceitos de classe abstrata, e
as referncias this e super.
Implemente um programa de testes, que lhe permita criar um zoolgico a partir da instanciao
dos vrios animais presentes na hierarquia anterior.

72

Tratamento de excees

13

Quando usamos um software, esperamos que ele seja tolerante falhas pelo menos s falhas mais
comuns relativas sua funo. Quando um programador identifica uma falha possvel de ocorrer
durante a execuo de seus programas, ele pode codificar estratgias de tolerncia e/ou correo desta
falha, em um processo conhecido como tratamento de excees.

O que so excees ?
Uma exceo um evento ou valor ilegal, porm previsto na modelagem de um sistema. Por exemplo,
quando criamos um programa que pede ao usurio a digitao de um valor inteiro e esse usurio digita
um valor fracionrio, dizemos que o valor digitado pelo usurio ir gerar uma exceo. Entretanto, essa
exceo pode, e deve, ser previsto na implementao desse programa.

Diferena entre excees e erros


A diferena entre exceo e erro que uma exceo prevista pelo programador durante a
implementao de um sistema, enquanto o erro algo inesperado, no tratado e que, na maioria das
vezes, aborta o sistema.
Exceo:

Erro:

O usurio digitou um valor invlido. (previsvel) O teclado sofreu algum avaria fsica e parou
de enviar sinais ao computador. O usurio no
pode mais digitar valores com o teclado.
(imprevisvel)
Soluo: a implementao de um tratamento Soluo: no tem soluo, pois um programa
para a exceo gerada pela digitao de um comum de computador no pode reparar um
valor invlido.
perifrico de um computador um teclado em
curto, por exemplo. Um erro, caso seja
detectado, geralmente causa o encerramento
do programa que o detectou.

? os erros so sinalizados pelo sistema operacional no qual a mquina virtual Java est rodando. Ou
seja, geralmente, a mquina virtual no permite o acesso de um cdigo Java origem de um erro (uma
das funes do sandbox), tornando a tentativa de tratamento dos erros impossvel.

Um exemplo de exceo pode ser visto no fragmento de cdigo abaixo, onde o programa tenta acessar
um ndice inexistente no array alunos:

T R A T A M E N T O

D E

E X C E E S

public class Sistema


{
// Um cadastro com no mximo cinqenta alunos
private Aluno[] alunos = new Aluno[50];
public void relatorio(int indice)
{
// Suponha que o argumento usado na chamado desse mtodo
// tenha sido maior do que 50. Isso geraria uma exceo.
System.out.println(alunos[indice]);
}
}
Exception in thread "main" java.lang.ArrayIndexOutOfBou
ndsException
at Sistema.relatorio(Sistema.java:10)

No exemplo acima, o mtodo relatrio(); contm apenas um comando, o que tornaria possvel a
preveno de excees atravs de um comando de deciso:
public void relatorio(int indice)
{
// Preveno de falhas atravs de comandos de deciso
if(indice>-1 && ndice<50)
{
System.out.println(alunos[indice]);
}
else
{
System.out.println("aluno inexistente");
}
}
Imagine, porm, que um determinado mtodo realize dezenas de operaes com os argumentos
recebidos. As excees, caso fossem tratadas via comandos de deciso, acarretariam em um cdigo
pouco legvel e de difcil manuteno. Esse cdigo seria cheio de decises que nada teriam a ver com a
lgica do mtodo em si, mas apenas serviriam para evitar erros. Uma forma mais elegante e eficiente de
fazer esse tratamento conhecida pelo termo tratamento de excees.

Tratamento de excees
Quando uma falha ocorre na execuo de um programa, o trecho de cdigo onde essa falha ocorreu
pode gerar uma exceo. Gerar uma exceo a sinalizao ao processo ativo na mquina virtual de
que alguma falha ocorreu. Esse processo ento pode "capturar" a execuo do programa e, quando
possvel, tornar a execuo do cdigo novamente vlido dentro do comportamento previsto para esse
programa.

74

T R A T A M E N T O

D E

E X C E E S

Tratamento de excees em Java


O tratamento de excees em Java segue o mesmo estilo de C++, visando um cdigo mais tolerante a
falhas. Existem trs comandos bsicos que permitem esse tratamento de excees: try, catch e finally.
Esses comandos so usados em conjunto, suprindo o programador de recursos que garantam o
desenvolvimento de cdigos robustos:
??

??
??

try: o bloco de comandos que so passveis de gerarem uma exceo. Quando o programador
sabe que um determinado conjunto de instrues pode gerar algum tipo de exceo, ele agrega
esses comandos dentro de um bloco try. O cdigo contido dentro de um bloco try chamado de
cdigo protegido.
catch: o bloco de comandos alternativos ao try, ou seja, se os comandos do bloco try gerarem
uma exceo ento os comandos do bloco catch sero executados no lugar deles. O bloco catch
opcional, mas normalmente implementado junto a um bloco try.
finally: um comando utilizado para delimitar um grupo de instrues que ser sempre
executada ao final de um bloco try-catch, independente de qual dos blocos anteriores foi
processado pela mquina virtual.

A lgica dos blocos acima descritos simples:


1. Tenta executar os comandos do bloco try
2. Se os comandos do try geraram uma exceo, ento executa os comandos do bloco catch. Um
bloco de comandos catch sempre deve seguir um bloco de comandos try, e o programador deve
ter o cuidado de garantir que o bloco catch no ir gerar uma exceo.
3. Independente das excees geradas na execuo dos blocos try ou catch, os comandos do bloco
finally sero executados.
public void relatorio(int indice)
{
// Tratamento de excees
try
{
// Tenta executar esse comando
System.out.println(alunos[indice]);
}
catch(ArrayIndexOutOfBoundsExceptionerro)
{
// Se houver algum erro no bloco anterior,
// esse comando ser executado
System.out.println("aluno inexistente");
}
catch(Exception erro)
{
// Pode-se usar um catch para cada tipo de erro
// possvel no bloco try
System.out.println("exceo inesperada");
}
finally
{
// Esse comando ser executado sempre
System.out.println("executou finally");
}
}

75

T R A T A M E N T O

D E

E X C E E S

Um exemplo mais comum do uso do bloco finally quando o cdigo do bloco try acessa recursos de
entrada e sada do sistema, como uma conexo a um servidor, por exemplo. Nesse caso, se o bloco try
abrisse uma sesso no servidor e depois gerasse uma exceo antes de fechar a sesso, essa sesso
permaneceria aberta at algum timeout. No caso, o bloco finally teria o comando de encerramento de
sesso http, garantindo que a sesso seria encerrada, independente de ter havido algum erro no bloco
try ou no.

? o nico caso em que os comandos do bloco finally no sero executados quando um comando
System.exit(); for executado em um dos blocos try ou catch.

A hierarquia das excees


Observe que, no exemplo acima, que a exceo "capturada" no bloco catch uma referncia a um objeto
da classe ArrayIndexOutOfBoundsException. De fato, todas as excees em Java so objetos
instanciados a partir da seguinte hierarquia:
Exemplo: hierarquia da classe ArrayIndexOutOfbounds.

Throwable

Exception

RuntimeException

Error

java.lang.Object
|
+--java.lang.Throwable
|
+--java.lang.Exception
|
+--java.lang.RuntimeException
|
+--java.lang.IndexOutOfBoundsException
|
+-java.lang.ArrayIndexOutOfBoundsException

Onde:
??

??

??

Error: Indica uma falha de difcil recuperao durante a execuo de um programa. Um exemplo
a tentativa de instanciao de uma classe em uma mquina virtual que no possui mais
memria livre. No previsto que um programa recupere esse tipo de falha, embora seja
possvel.
RuntimeException: usado para representar um problema de implementao ou de projeto de
um sistema. Ou seja, usado para indicar condies que jamais deveriam correr durante a
execuo normal do programa. Pelo fato de que esses erros jamais devem ocorrer em condies
normais, o seu tratamento feito em tempo de execuo a deciso sobre o melhor tratamento
deixado a cargo do usurio. Por exemplo, a tentativa de alocao de um objeto em uma
mquina virtual cuja memria est totalmente ocupada retorna um erro de execuo. O sistema
normalmente avisa ao usurio que no h memria disponvel, dando-lhe a chance de fechar
outros aplicativos ou optar por outros comandos do programa.
Exception: so erros plausveis, previsveis. Erros causados normalmente pelo contexto em que
o programa ser rodado, por exemplo: arquivo no encontrado, URL mal digitada, etc. Esses
erros so normalmente gerados por falhas do usurio. Muitas vezes complicado imaginar todas

76

T R A T A M E N T O

D E

E X C E E S

as excees possveis quando o correto comportamento de um programa depende do usurio,


mas tratar o maior nmero possvel dessas excees uma obrigao do bom programador.

? se os mtodos de um programa tratarem todas as excees possveis, dizemos que o programa


robusto. Evidentemente, nem sempre possvel prevenir todas as excees, mas o grau de robusteza de
um cdigo tem uma relao direta com a qualidade desse cdigo. O programador deve sempre
programar pensando em "quanto mais robusto melhor".

Tratamento pendente de excees


Caso um mtodo possa gerar uma exceo, esse mtodo deve deixar claro o tipo de ao que deve ser
tomada para contornar essa exceo.
Existem duas formas de fazer isso: um bloco try-catch, conforme visto anteriormente ou ento a simples
sinalizao das excees, deixando o seu tratamento para fora do trecho de cdigo que gerou essa
exceo.
Para no misturar o tratamento de excees com a lgica de um programa, uma tcnica muito utilizada
a declarao de mtodos com excees pendentes, ou seja, cujo tratamento dever ser feito pelo
programa que chamar esse mtodo.
Em Java, essa pendncia do tratamento de uma exceo definida pela palavra reservada throws:
// A palavra reservada throws seguida pela lista de excees que podem
// ocorrer na execuo do cdigo do mtodo. Esse mtodo s poder ser
// chamado de dentro de um bloco try-catch, pois a pendncia dever ser
// tratada no cdigo que est chamando esse mtodo.
public void relatorio(int indice) throws ArrayIndexOutOfBoundsException
{
// A vantagem do tratamento de excees pendentes que o cdigo dos
// mtodos fica restrito lgica do programa.
System.out.println(alunos[indice]);
}

Excees implementadas pelo programador


Como as excees em Java so instncias de alguma subclasse de Throwable, possvel implementar
outras classes estendidas de Throwable ou de uma de suas subclasses. Essas subclasses
implementadas pelo programador sero igualmente excees.
Tal qual vimos na aula 11, usaremos a palavra reservada extends para implementarmos novas excees:

public class AlunoInexistente extends Exception


{
// Esse mtodo sobrecarrega o mtodo homnimo da classe Exception
public String getMessage()
{
return "indice do aluno no existe";
}
}

77

T R A T A M E N T O

D E

E X C E E S

Aps compilarmos o cdigo acima, poderemos usar a nova exceo normalmente em outros programas:
public void relatorio(int indice)
{
// Tratamento de excees
try
{
// Tenta executar esse comando
System.out.println(alunos[indice]);
}
catch(AlunoInexistente erro)
{
// Se houver algum erro no bloco anterior,
// esse comando ser executado
System.out.println(erro.getMessage());
}
}

Sinalizando uma exceo (throw)


O programador pode optar em alguns casos por "forar" uma exceo, ou seja, sinalizar de uma exceo
em determinados casos previamente conhecidos. Essa sinalizao programada deve ser feita em
mtodos definidos com tratamento de excees pendentes:
public void relatorio(int indice) throws AlunoInexistente
{
if(indice>-1 && ndice<50)
{
throw new AlunoInexistente();
}
else
{
System.out.println(alunos[indice]);
}
}

Throwable.printStackTrace() e Throwable.getMessage()

O aluno deve consultar a documentao da classe java.lang.Throwable e identificar os mtodos


possveis de serem chamados e/ou sobrecarregados quando instanciamos ou implementamos excees.
Dois desses mtodos so particularmente teis e devem ser utilizados sempre que possvel:

78

T R A T A M E N T O

D E

E X C E E S

??

printStackTrace(): esse mtodo imprime na tela as informaes de depurao da exceo: o tipo


de exceo, em que linha, em qual mtodo e em qual classe a exceo foi gerada.

??

getMessage(): uma verso simplificada do printStackTrace(). Imprime na tela apenas a


mensagem padro da exceo que foi gerada. No caso da implementao de uma nova exceo
pelo programador, possvel definir qual mensagem ser gerada.

public class Teste


{
static public void main(String[] args)
{
new Teste();
}
Teste()
{
Sistema s = new Sistema();
// Tratamento de excees
try
{
s.relatrio();
}
catch(AlunoInexistente erro)
{
// O mtodo getMessage retorna uma String
System.out.println(erro.getMessage());
}
catch(Exception erro)
{
// O mtodo printStackTrace imprime direto na tela
erro.printStackTrace();
}
finally
{
// Descartando o objeto Sistema
s = null;
}
}
}

Excees mais comuns


medida que o aluno for praticando o tratamento de excees, e principalmente a herana de classe da
API Java, ele passar a conhecer a srie de excees mais comuns da linguagem Java. Para facilitar
essa familiaridade, algumas dessas excees so descritas abaixo:
??

ArithmeticException problemas com operaes numricas, tipicamente diviso por zero:


int i = 10 / 0;

79

T R A T A M E N T O

D E

E X C E E S

??

NullPointerException gerado pela tentativa de acessar um objeto atravs de uma


referncia nula, ou seja, antes do objeto ser instanciado.
Image[] imagens = new Image[100];
System.out.println(imagens[1]);

??

NegativeArraySizeException gerado pela tentativa de criar um array de tamanho


negativo:
Image[] imagens = new Image[-100];

??

ArrayIndexOutOfBoundsException gerado pela tentativa de acesso a um ndice fora dos


limites de um array:
Image[] imagens = new Image[100];
System.out.println(imagens[200]);

??

SecurityException gerado pelo sandbox, quando um programa tenta acessar um recurso


que a mquina virtual protege. Por exemplo, o gerenciador de segurana da JVM gera uma
exceo desse tipo para applets* que tentam:
o Acessar um arquivo local
o Abrir uma conexo socket diferente da conexo a qual o applet est vinculado
o Executar outro programa dentro do ambiente de execuo (Runtime).

* veremos applets mais tarde na disciplina.

Exerccios
k.

Reescreva os exerccios sobre OO, usando o tratamento de excees para garantir a robusteza
dos programa.

80

Interface grfica com o usurio

14

Controlando o posicionamento de componentes visuais em programas que possuem interface grfica com o
A API Java conta com um pacote chamado AWT Abstract Window Toolkit, que permite ao
desenvolvedor criar interfaces grficas com o usurio (GUI Graphical User Interface) a partir da
instanciao ou especializao de classes de componentes grficos. As verses atuais do jdk contm um
grande nmero de componentes grficos que sero enumerados em sala de aula. Nesta seo, o aluno
encontra as diretrizes bsicas da construo de interfaces grficas com Java.

Componentes grficos o pacote AWT


Componentes grficos so classes que contm membros associados a informaes visuais, como cores,
dimenses e bordas. Quando pensamos em componentes grficos, estamos pensando no usurio no
faz sentido criar um programa com interface grfica se ele no tiver interao com um ser humano.
Aspectos de ergonomia de software so importantes, tais como combinao de cores e fontes utilizadas
na interface grfica. As principais classes do pacote AWT so apresentadas na figura abaixo:
Color

BorderLayout

Point

FlowLayout

Insets

GridLayout

Dimension

GridBagLayout

package java.awt

Font

CardLayout

FontMetrics

Polygon

Graphics

Rectangle

Image

Toolkit
MenuComponent

Component

GridBagConstraints

I N T E R F A C E

G R F I C A

C O M

U S U R I O

A classe java.awt.Component, representada na elipse mais abaixo do diagrama acima, representa


um importante papel na construo de interfaces grficas: a superclasse dos componentes visuais
AWT. O prximo diagrama mostra a hierarquia da classe Component e suas especializaes.

java.awt.Component
Button

List

Canvas

Scrollbar

Label
Checkbox

TextComponent
Container

Window
Frame

Choice

Panel
Dialog

TextArea

TextField

Applet
FileDialog

Os detalhes do uso de cada um desses componentes sero apresentados em aula a partir do exemplo
abaixo. Observe que alguns componentes tm duas ou mais classificaes. Isto ocorre porque o
componente pertence todas as classes de sua hierarquia, a partir da raiz lembre-se que todos as
classes em Java so especializaes de Object.

Container

Window

Frame

Choice
Button

List

TextArea

Checkbox

Scrollbar
Panel

Label

TextComponent
82

TextField

CheckboxGroup

I N T E R F A C E

G R F I C A

C O M

U S U R I O

Cdigo do exemplo de componentes AWT


import java.awt.*;
import java.awt.event.*;
/**
* Classe demonstrativa de componente grficos AWT
* XI Semana da Tecnologia da Informao - INSOFT
*
* @author Felipe Gacho
* @version demo
*/
public class ComponentesAWT extends Frame implements WindowListener {
/** Boto */
private Button botao = new Button("INSOFT");
/** Checkbox - boto de seleo */
private Checkbox checkbox = new Checkbox("Selecione esta caixa");
/** Os botes de opo podem ser organizados em grupo */
private CheckboxGroup grupoDeOpcoes = new CheckboxGroup();
/**
* Choice - Caixa de seleo. Observe que o choice ser inicializados
* posteriormente, pois depende de vrios comandos para ser construdo.
*/
private Choice choice = null;
/**
* List - uma lista de opes, semelhante ao Choice porm com a caixa de
* opes fixa. Este componente tambm no pode ser totalmente construdo
* totalmente com uma linha de cdigo.
*/
private List list = null;
/**
* Label - um componente no editvel de texto, usado normalmente como
* ttulo de outros componentes.
*/
private Label label = new Label("digite o seu nome: ");
/** TextField - campo de entrada de textos. */
private TextField nome = new TextField();
/** TextArea - rea para edio de textos. */
private TextArea texto = new TextArea("");
/** Panel - um painel que pode conter componentes grficos */
private Panel painel1 = new Panel();
/** Panel - um painel que pode conter componentes grficos */
private Panel painel2 = new Panel();
83

I N T E R F A C E

G R F I C A

C O M

U S U R I O

static public void main(String[] args) {


ComponentesAWT gui = new ComponentesAWT();
gui.setSize(400, 300);
gui.setVisible(true);
gui.addWindowListener(gui);
}

/** Construtor da interface grfica */


ComponentesAWT() {
super("XI Semana da Tecnologia - INSOFT");
// Inicializando um componente Choice:
choice = new Choice();
choice.add("segunda");
choice.add("tera");
choice.add("quarta");
choice.add("quinta");
choice.add("sexta");
// Inicializando um componente List: voc diz o nmero de opes
// que devem aparecer e se o componente aceita seleo mltipla
list = new List(3, false);
list.add("Brazil");
list.add("Canada");
list.add("Chile");
list.add("Dinamarca");
list.add("Espanha");
painel1.setLayout(new GridLayout(2, 2, 3, 3));
painel1.add(botao);
painel1.add(list);
painel1.add(texto);
// Exemplo de aninhamento de containers:
Panel container1 = new Panel();
container1.setLayout(new FlowLayout());
container1.add(new Checkbox("iniciante", grupoDeOpcoes, true));
container1.add(new Checkbox("avanado", grupoDeOpcoes, false));
Panel container2 = new Panel();
container2.setLayout(new GridLayout(2, 1));
container2.add(checkbox);
container2.add(container1); // ? Veja, um container dentro de outro
painel1.add(container2);
painel2.setLayout(new BorderLayout(2, 2));
painel2.add(label, BorderLayout.WEST);
painel2.add(nome, BorderLayout.CENTER);

84

I N T E R F A C E

G R F I C A

C O M

U S U R I O

this.setLayout(new BorderLayout(2, 2));


add(choice, BorderLayout.NORTH);
add(painel2, BorderLayout.SOUTH);
add(painel1, BorderLayout.CENTER);
}

/**
* Executado quando a janela se torna ativa no contexto do gerenciador de janelas
* do sistema operacional, ou seja, a janela se tornou o foco de interao com
* o usurio. Isto acontece no Windows quando uma janela selecionada pelo
* usurio.
*/
public void windowActivated(WindowEvent e) { }
/** Executado aps o fechamento da janela */
public void windowClosed(WindowEvent e) { }
/**
* Executado quando o usurio requisita o fechamento da janela
*/
public void windowClosing(WindowEvent e) {
// Esta linha representa a sada padro de um programa.
System.exit(0);
}
/**
* Executado quando a janela deixa de ser o foco de interao
* com o usurio.
*/
public void windowDeactivated(WindowEvent e) { }
/**
* Executado quando a janela recupera o foco de interao
* com o usurio, normalmente quando o usurio retorna a aplicao de
* minimizada para normal.
*/
public void windowDeiconified(WindowEvent e) { }

/** Executado quando a janela for minimizada */


public void windowIconified(WindowEvent e) { }
/** Executadoaps a abertura da janela */
public void windowOpened(WindowEvent e) { }
}

85

I N T E R F A C E

G R F I C A

C O M

U S U R I O

Gerenciadores de Layout
Uma das principais caractersticas da linguagem Java a sua portabilidade, que dispensa os
desenvolvedores de preocupaes com aspectos de hardware. Interfaces grficas, entretanto, possuem
dependncia dos dispositivos nos quais sero exibidas a resoluo, cores e suporte a eventos so
exemplos de aspectos relevantes em um projeto que envolve interface grfica com o usurio (GUI). Na
maioria das linguagens, o programador define previamente a aparncia da GUI, incluindo o tamanho e
posicionamento dos componentes, e este aspecto fixo e imutvel a menos que haja uma mudana no
cdigo.
Imagine um programa codificado para rodar em um monitor com resoluo de 800 x 600 pixels sendo
executado em um monitor de apenas 640 x 400 pixels. Provavelmente isto acarretar problemas de
posicionamento dos componentes ou eventualmente a perda de visibilidade destes componentes.
Linguagens compiladas como C++ ou Delphi exigem que o programador saiba de antemo as
caractersticas de hardware para os quais ele est programando, ou ento adotar estratgias de
verificao destas caractersticas no momento da abertura ou instalao dos programas o que agrega
complexidade ao algoritmo e reduz a a portabilidade dos programas.
Em Java no tratamos o posicionamento e dimensionamento dos componentes grficos rgidamente,
mas sim atravs de processos independentes chamados de gerenciadores de layout. Isto permite que um
cdigo gerado no sistema operacional Windows, em uma resoluo alta, seja executado sem perda de
forma ou funo em outros sistemas operacionais, como Linux ou Machintosh ou at mesmo em
dispositivos especiais, como Palms ou telefones celulares.

Containers
Interfaces grficas em Java so construdos a partir da idia de containers, repositrios de componentes
grficos que possuem um processo gerenciando a disposio e dimenso destes componentes. O
interpretador Java requisita ao sistema operacional uma regio de vdeo e, a partir desta regio, calcula a
dimenso que cada componente deve assumir em tempo de execuo esta organizao chamada de
Layout (disposio em ingls). Este processo de gerenciamento transparente ao usurio e
normalmente s executado na primeira vez em que o programa entra em execuo ou aps um
redimensionamento da janela. Abaixo exemplificaremos os principais gerenciadores de layout para
conteiners AWT:
o

FlowLayout

CardLayout

GridLayout

BorderLayout

GridBagLayout

86

I N T E R F A C E

G R F I C A

C O M

U S U R I O

Flow layout
Exemplo de gerenciador de componentes baseado em fluxo:

java.awt.FlowLayout
idia: adicionar componentes da esquerda para a direita, centralizados em
realo largura do container. Caso os componentes ultrapassem a largura
do container, ento o gerenciador adiciona os comopnentes excedentes na
linha de baixo, e assim sucessivamente. como se a interface fosse
formada por vrias linhas, e existisse uma corrente formada por
componentes (uma fila). Cada novo componente adicionado interface
um novo elo dessa corrente, que fica distribuda sobre as linhas da
interface. Componente1 ? Componente2 ? Componente3 ? ...
/**
* @author Felipe Gacho
* @version exemplo.SOO-I
*/
public class Fluxo extends Frame
{
Fluxo()
{
// Ajusta o gerenciador de layouts baseado em corrente de componentes
setLayout(new FlowLayout());
// Criando trs componentes grficos (botes)
Button botao1 = new Button("boto 1");
Button botao2 = new Button("boto 2");
Button botao3 = new Button("boto 3");
// adicionando os componentes
add(botao1);
add(botao2);
add(botao3);
// Tornando a janela (o Frame) visvel
setSize(200,200);
setVisible(true);
}
/** disparador da aplicao */
static public void main(String[] args)
{
new Fluxo();
}
}

87

I N T E R F A C E

G R F I C A

C O M

U S U R I O

CardLayout
Exemplo de gerenciador de cartes:

java.awt.CardLayout
idia:
Carto 1
Carto 2
Carto 3

import java.awt.*;
import java.awt.event.*;
/** * O gerenciador de cartes atua como se existisse uma pilha de cartes, cada carto sendo
* um container. O usurio somente pode observar/manipular o carto
* do topo da pilha. Cada carto tem um nome, definido pelo programador
* Para se trocar de carto, usa-se o comando 'show()', conforme mostra o cdigo abaixo.
*
* @author Felipe Gacho
* @version exemplo.SOO-I
*/
public class Cartao extends Frame
{
private String[] paineis = {"first", "second", "third"};
int painelAtual = 0;
private Button proximo = new Button("prximo");
private Button anterior = new Button("anterior");
private CardLayout gerenciador = new CardLayout();
private Panel painelCentral = new Panel();
Cartao()
{
// chamando o construtor da superclasse Frame
super("exemplo de CardLayout");
painelCentral.setLayout(gerenciador);
Panel painel1 = new Panel();
Label textoDoPainel1 = new Label("PAINEL 1", Label.CENTER);
painel1.setBackground(new Color(0, 200, 148));
painel1.add(textoDoPainel1);

88

I N T E R F A C E

G R F I C A

C O M

U S U R I O

Panel painel2 = new Panel();


Label textoDoPainel2 = new Label("PAINEL 2", Label.CENTER);
painel2.setBackground(Color.blue);
painel2.add(textoDoPainel2);
painel2.add(new Button("outro componente"));
painel2.add(textoDoPainel2);

Panel painel3 = new Panel();


Label textoDoPainel3 = new Label("PAINEL 3", Label.CENTER);
painel3.setBackground(Color.green);
painel3.add(textoDoPainel3);
painel3.add(new Choice());
painelCentral.add(painel1, "first");
painelCentral.add(painel2, "second");
painelCentral.add(painel3, "third");
Panel controles = new Panel();
controles.add(anterior);
controles.add(proximo);
setLayout(new BorderLayout());
add(painelCentral, BorderLayout.CENTER);
add(controles, BorderLayout.SOUTH);

// Programao inline altamente desaconselhvel. S foi usada aqui


// para o exemplo no ficar muito grande. O ideal declarar uma classe
// que implemente o controlador de eventos.
proximo.addActionListener(
new ActionListener()
{
public void actionPerformed(ActionEvent evento)
{
mostrarProximoPainel();
}
}
);
// Programao inline altamente desaconselhvel. S foi usada aqui
// para o exemplo no ficar muito grande. O ideal declarar uma classe
// que implemente o controlador de eventos.
anterior.addActionListener(
new ActionListener()
{
public void actionPerformed(ActionEvent evento)
{
mostrarPainelAnterior();
}
}
);
// Tornando a janela (o Frame) visvel
89

I N T E R F A C E

G R F I C A

C O M

U S U R I O

setSize(300, 275);
setVisible(true);
}
public void mostrarProximoPainel()
{
if(painelAtual< 2)
{
painelAtual++;
gerenciador.show(painelCentral, paineis[painelAtual]);
}
}
public void mostrarPainelAnterior()
{
if(painelAtual>0)
{
painelAtual--;
gerenciador.show(painelCentral, paineis[painelAtual]);
}
}
/** disparador da aplicao */
static public void main(String[] args)
{
new Cartao();
}
}

90

I N T E R F A C E

G R F I C A

C O M

U S U R I O

BorderLayout
Exemplo de gerenciador de componentes baseado em moldura:

java.awt.BorderLayout
idia: considerar a interface como uma moldura, dividida em
cinco partes:
uma borda superior, uma borda inferior, uma borda esquerda,
uma borda direita e uma rea central.
A rea central prevalece sobre as demais quando esta
"moldura" for redimensionada, ou seja, o componente que est
no centro da interface redimensionado em igual proporo ao
redimensionamento do container enquanto os demais
componentes apenas preenchem os espaos que forem
adicionados em suas respectivas bordas.

/**
* Observe que o componente que est no centro da interface o "ncora", ou seja
* este componente ocupar sempre a maior parte da interface. Os demais sero tambm
* redimensionados, mas sempre respeitando o espao do componente central.
*
* @author Felipe Gacho
* @version exemplo.SOO-I
*/
public class Borda extends Frame
{
Borda()
{
// chamando o construtor da superclasse Frame
super("exemplo de BorderLayout");
// Ajusta o gerenciador de layouts para "grade"
// setLayout(new GridLayout(ESPACO_ENTRE_COLUNAS, ESPACO_ENTRE_LINHAS));
setLayout(new BorderLayout(2, 2));
// Item central da interface
TextArea entradaDeTexto = new TextArea("escreva aqui o seu texto...");
add(entradaDeTexto, BorderLayout.CENTER);
// Item da borda superior da interface
Choice escolha = new Choice();
escolha.addItem("texto jurdico");
escolha.addItem("poesia");
escolha.addItem("tese de mestrado");
add(escolha, BorderLayout.NORTH);
// Item da borda direita da interface

91

I N T E R F A C E

G R F I C A

C O M

U S U R I O

Label leste = new Label("Leste");


add(leste, BorderLayout.EAST);
// Item da borda esquerda da interface
Label oeste = new Label("Oeste");
add(oeste, BorderLayout.WEST);
// Item da borda inferior da interface
CheckboxGroup grupoDeSeletores = new CheckboxGroup();
Checkbox opcao1 = new Checkbox("itlico", grupoDeSeletores, false);
Checkbox opcao2 = new Checkbox("negrito", grupoDeSeletores, false);
Checkbox opcao3 = new Checkbox("normal", grupoDeSeletores, true);
// Alterando a fonte de componentes AWT
opcao1.setFont(new Font("Roman", Font.ITALIC, 14));
opcao2.setFont(new Font("Roman", Font.BOLD, 14));
opcao3.setFont(new Font("Roman", Font.PLAIN, 14));
Panel painelInferior = new Panel();
painelInferior.add(opcao1);
painelInferior.add(opcao2);
painelInferior.add(opcao3);
add(painelInferior, BorderLayout.SOUTH);
// Tornando a janela (o Frame) visvel
setSize(300, 275);
setVisible(true);
}
/** disparador da aplicao */
static public void main(String[] args)
{
new Borda();
}
}

92

I N T E R F A C E

G R F I C A

C O M

U S U R I O

GridLayout
Exemplo de grade de componentes:

java.awt.GridLayout
idia: criar uma grade na qual os componentes so
adicionados, da esquerda para a direita e de cima para
baixo.
? ? Todos os componentes da grade so redimensionados junto com as clulas.
? ? Todas as clulas possuem o mesmo tamanho.
/**
* Observe que as clulas do layout em forma de grade ocupam sempre o
* mesmo espao, e os componentes so redimensionados junto com as clulas
*
* @author Felipe Gacho
* @version exemplo.SOO-I
*/public class Grade extends Frame
{
Grade()
{
// chamando o construtor da superclasse Frame
super("exemplo &nbspde &nbspGridLayout");
// Ajusta o gerenciador de layouts para "grade"
// setLayout(new GridLayout(NUMERO_DE_LINHAS, NUMERO_DE_COLUNAS,
//
ESPACO_ENTRE_COLUNAS, ESPACO_ENTRE_LINHAS));
setLayout(new GridLayout(2, 2, 3, 2));
// Criando trs componentes grficos (botes)
Button botao1 = new Button("boto &nbsp1");
Button botao2 = new Button("boto &nbsp2");
Label label1 = new Label("nome:", Label.RIGHT);
TextField campo = new TextField("campo &nbspde &nbspentrada");
// adicionando os componentes
add(botao1);
add(botao2);
add(label1);
add(campo);
// Tornando a janela (o Frame) visvel
setSize(300, 75);
setVisible(true);
}
/** disparador da aplicao */
static public void main(String[] args) {
new Grade();
}
}

93

I N T E R F A C E

G R F I C A

C O M

U S U R I O

GridBagLayout
Exemplo de gerenciador de grade assimtrica de componentes:

java.awt.GridBagLayout
idia: segue a mesma idia adicionar os componentes a
uma grade, porm uma grade assimtrica, ou seja, o
espao ocupado pelos componentes no
obrigatoriamente igual.
Para fazer esse agrupamento assimtrico de
componentes, o gerenciador GridbagLayout adota um
conjunto de restries a cada componente. Essas
restries so definidas pelo programador em um objeto
da classe: java.awt.GridBagConstraints.
O gerenciamento assimtrico de componentes se baseia na idia que existem as dimenses do espao
disponvel para a visualizao de um determinado componente e as dimenses desse componente.
Esses dois espaos no so necessariamente iguais e, dependendo do caso, o gerenciador deve
calcular de que forma o espao disponvel ser preenchido pela representao grfica do componente.
O conjunto de restries reconhecido pelo gerenciador GridBagLayout enumerado abaixo:
Variveis de instncia da classe java.awt.GridBagConstraints:
? ? anchor: define onde o componente ser posicionado dentro da rea disponvel para ele:
GridBagConstraints.CENTER, GridBagConstraints.NORTH, GridBagConstraints.NORTHEAST,
GridBagConstraints.EAST, GridBagConstraints.SOUTHEAST, GridBagConstraints.SOUTH,
GridBagConstraints.SOUTHWEST, GridBagConstraints.WEST e
GridBagConstraints.NORTHWEST.
? ? gridx e gridy: indica a clula onde o componente dever ser inserido, onde os valores gridx=0 e
gridy=0 indicam a linha e coluna dessa clula lembre-se que o GridbagLayout, mesmo
assimtrico, continua sendo um grid e, portanto, utiliza a idia de clulas. Use
GridBagConstraints.RELATIVE para indicar que o componente deve ser colocado direita da
posio atual ou abaixo da posio atual.
? ? gridwidth e gridheight: indica o nmero de clulas em uma linha da grade e quantas linhas sero
ocupadas por um componente. O valores padro para essas variveis 1. Use
GridBagConstraints.REMAINDER para indicar que o componente ser o ltimo de uma linha e
GridBagConstraints.RELATIVE para indicar que o componente deve preencher a linha at o
prximo e ltimo componente.
? ? fill: usado quando a rea de visualizao do componente maior que o tamanho do componente.
Nesse caso, o programador pode indicar de que forma o componente deve ser visualizado:
o GridBagConstraints.NONE no muda o tamanho do componente (padro)
o GridBagConstraints.HORIZONTAL preenche todo o espao horizontal disponvel com o
componente.
o GridBagConstraints.VERTICAL preenche todo o espao vertical disponvel com o
componente.
o GridBagConstraints.BOTH preenche todo o espao disponvel com o componente,
horizontal e vertical.
? ? ipadx e ipady: define o espaamento entre as dimenses previstas de um componente e as
dimenses reais, mostradas na tela uma borda interna e invisvel do componente. A largura do
componente ser, no mximo, a sua largura menos ipadx*2 (uma vez que a borda interna aplica
94

I N T E R F A C E

G R F I C A

C O M

U S U R I O

aos dois lados do componente). Similarmente, a altura do componente ser a sua altura menos
ipady*2.
? ? insets: parecido com o ipad, porm define a borda externa do componente, ou seja, o
espaamento entre o componente e o espao disponvel para a sua visualizao.
? ? weightx e weighty: determina o "peso" dos componentes, ou seja, como eles se comportaro
durante o redimensionamento do container gerenciado pelo GridBagLayout. Quando o container for
redimensionado, o gerenciador calcula as novas dimenses dos componentes de acordo com o
seu peso. necessrio indicar o peso de pelo menos um componente em cada linha, caso
contrrio, todos os componentes ficaro centralizados na linha, sem peso.
/**
* Exemplo de GridBagLayout
* @author Felipe Gacho
* @version exemplo SOO-I
*/
public class GradeAssimetrica extends Frame
{
/**
* Mtodo que adiciona componentes na interface
* @param componente O componente a ser adicionado interface
* @param gerenciador O gerenciador de layouts utilizado
* @param restricoes O objeto com as restries associadas ao componente
*/
private void adicionarComponente(Component componente,
GridBagLayout gerenciador,GridBagConstraints restricoes)
{
// Registra os restries do componente no gerenciador de layouts
gerenciador.setConstraints(componente, restricoes);
add(componente); // Adiciona o componente
}
GradeAssimetrica()
{
super("FIC - exemplo de GridbagLayout");
GridBagLayout gerenciador = new GridBagLayout();
GridBagConstraints restricoes = new GridBagConstraints();
// Define o objeto 'gerenciador' como o gerenciador de componentes da Janela
this.setLayout(gerenciador);
// GridBagConstraints.BOTH faz o componente ocupar toda a rea disponvel
// horizontal e vertical.
restricoes.fill = GridBagConstraints.BOTH;
restricoes.weightx = 0.5; // Componente com peso horizontal 0.5x
adicionarComponente(new Label("nome: "), gerenciador, restricoes);
// Componente ocupando a linha at o final - REMAINDER = nova linha
restricoes.gridwidth = GridBagConstraints.REMAINDER;
restricoes.weightx = 3.0; // Componente com peso horizontal 2x
adicionarComponente(new TextField( ), gerenciador, restricoes);
// O RELATIVE faz o componente ocupar a linha at o prximo componente

95

I N T E R F A C E

G R F I C A

C O M

U S U R I O

restricoes.gridwidth = GridBagConstraints.RELATIVE;
restricoes.weightx = 0.0; // Componente com peso padro - igual aos outros
restricoes.weighty = 3.0;
adicionarComponente(new Button("boto 1"), gerenciador, restricoes);
// depois de um RELATIVE sempre deve vir um REMAINDER
restricoes.gridwidth = GridBagConstraints.REMAINDER;
adicionarComponente(new Button("boto 2"), gerenciador, restricoes);
restricoes.gridwidth = 1;
restricoes.gridheight = 2;
restricoes.weightx = 0.0;
restricoes.weighty = 1.0;

// recupera os padres de alocao de espao


// na grade

Button botao3 = new Button("boto 3");


botao3.setBackground(Color.cyan);
adicionarComponente(botao3, gerenciador, restricoes);
adicionarComponente(new Button("boto 4"), gerenciador, restricoes);
adicionarComponente(new Button("boto 5"), gerenciador, restricoes);
adicionarComponente(new Button("boto 6"), gerenciador, restricoes);
restricoes.gridwidth = GridBagConstraints.REMAINDER;
// Adicionando um container dentro do de uma clula
Panel painel = new Panel();
painel.setLayout(new GridLayout(2,2,2,2));
painel.add(new Label("campo 1"));
painel.add(new TextField());
painel.add(new Label("campo 2"));
painel.add(new TextField());
adicionarComponente(painel, gerenciador, restricoes);
restricoes.weighty = 1.7;
restricoes.fill = GridBagConstraints.BOTH;
Label fic = new Label("FACULDADE INTEGRADA DO CEAR", Label.CENTER);
fic.setBackground(Color.black);
fic.setForeground(Color.white);
fic.setFont(new Font("Serif", Font.BOLD, 16));
adicionarComponente(fic, gerenciador, restricoes);
setSize(375,300);
setVisible(true);
}
static public void main(String[] args)
{
new GradeAssimetrica();
}
}

96

Applets

15

Um dos maiores apelos da linguagem Java est na facilidade de imlpementao de programas executveis
atravs da Internet. Tais programas rodam em qualquer sistema operacional que possua um navegador
web, e so conhecidos como Applets.(do ingls Application Let)

O que um Applet ? (java.awt.Applet)


Um applet um programa Java que pode ser executado via Internet, atravs de um browser. A principal
diferena entre um applet e os demais programas implementados em Java a forma como esses
programas sero inicializados. Em uma aplicao Java usamos o mtodo main() para inicializar a
aplicao, enquanto nos applets esse processo de inicializao um pouco mais complexo.
Devido ao fato de um applet rodar dentro de um browser, ele no pode ser executado diretamente por
linha de comando, tal qual uma aplicao Java. Ao invs disso, devemos criar um cdigo HTML que
contm informaes sobre o cdigo a ser carregado e executado pela mquina virtual contida no browser
os navegadores web mais populares geralmente contm uma mquina virtual embutida em seu cdigo.
Quando o navegador reconhece que o cdigo html que ele est interpretando possui uma referncia a
um Java applet, ele ativa essa mquina virtual para executar esse applet.

? existem alguns detalhes sobre a compatibilidade de applets em navegadores que sero melhores
apresentados em sala de aula. A maioria desses detalhes refere-se a questes comerciais polmicas e
de verses de produtos envolvendo a SUN, fabricante do Java, e as fabricantes dos navegadores:
Netscape, Microsoft, etc. Ao aluno importante apenas a informao de que para um applet ser
executado por algum navegador web, esse navegador deve ter alguma mquina virtual compatvel com
Java dentro dele (ou acessvel por ele).
Outro detalhe importante a ser observado que applets so programas completos de computador, e
no scripts a serem executados por um servidor ou interpretados pelo browser, como JavaScript, Asp e
scripts interpretados por CGIs. Quando uma pgina Html que contm um applet lida pelo browser, todo
o cdigo do Applet carregado na memria da JVM do browser, para da ento ser executado. Quando
implementamos um applet devemos lembrar que todo o seu cdigo dever ser transmitido via Internet
para que ele possa rodar, logo, o programador deve ter o cuidado de no criar applets muito grandes.

Restries de segurana em applets


Pelo fato de serem distribudos via Internet, os applets representam aplicaes potencialmente perigosas
para o usurio. Imagine um applet que leia o seu disco rgido e, sempre que encontrar um arquivo
contendo senhas, o transmita para o endereo de algum hacker. Esse hacker poderia usar esse arquivo
para descobrir suas senhas pessoais e ento fazer um grande estrago com isso.
Para prevenir tais problemas, a mquina virtual Java exerce um controle rgido de acesso ao sistema
operacional quando executa applets, atravs da classe SecrityManager. Esse controle, realizado

A P P L E T S

atravs do j citado modelo de segurana sandbox, permite que uma aplicao applet rode em um
contexto limitado quanto sua liberdade de operaes.
O quo seguro ser a execuo de um applet configurvel atravs dos browsers que, geralmente,
probem os seguintes processos:
??
??
??

Execuo de outros programas via Runtime


Acesso a arquivos
Chamada de mtodos nativos do sistema operacional

??

Abrir uma conexo Socket com outro endereo seno o prprio endereo onde o applet reside.

? quando Frames ou caixas de dilogo (Dialog) so abertas a partir de um applet, um rodap


adicionado a eles, informando o usurio que se trata de uma aplicao via web, insegura. Isso foi feito
para evitar que uma aplicao applet "iluda" um usurio leigo a digitar, por exemplo, o nmero de seu
carto de crdito que poderia ser ento retornado ao servidor de origem do applet.
As restries de segurana de um applet podem ser alteradas atravs de arquivos de configurao da
mquina virtual em Intranets ou atravs de um certificado de segurana vinculado ao applet na Internet
chamado de Applet assinado. O uso de applets assinados ser comentado em aula, mas est fora do
escopo do nosso curso. Caso seja do seu interesse o uso de certificados de segurana, procure em sites
de busca pelas palavras chave: Java Signed Applet. Existem dezenas de pginas bem detalhadas
sobre esse assunto.

O primeiro applet
A criao de um applet feita a partir do pacote java.applet.*; conforme mostra o exemplo abaixo:

import java.awt.*;
import java.applet.*;
/**
* FIC - Faculdade Integrada do Cear
* O primeiro applet
* @author Felipe Gacho
* @version exemplo.applet
*/
public class AloWeb extends Applet
{
// Uma varivel de instncia, do tipo String
private String texto;
// Mtodo inicial do applet
public void init ()
{
texto = "Al Internet";
}
// Imprime o contedo de 'texto' na posio 25, 25 do applet
public void paint(Graphics g)

98

A P P L E T S

{
g.drawString(texto, 25, 25);
}
}

Para se criar um applet, necessrio a declarao de uma classe com a seguinte assinatura:
import java.applet.*;
public class <identificador> extends Applet
{
// ...
}
Alm disso, as demais consideraes sobre programas Java permanecem valendo o cdigo do
exemplo acima deve ser salvo em um arquivo AloWeb.Java e compilado antes de poder ser executado
dentro de um browser.
importante que o aluno pesquise a documentao sobre a classe java.applet.Applet para compreender
melhor as caractersticas desses componentes, principalmente quanto a sua posio na hierarquia de
classes da API Java:

java.lang.Object

java.awt.Component

java.awt.Container

java.awt.Window

java.awt.Panel

java.awt.Frame

java.applet.Applet

Observe que um applet uma extenso de um painel, portanto o comportamento de uma interface
grfica applet o mesmo de um aplicativo Java que use painis como container padro. O gerenciador
de layout padro para o applet herdado da classe Panel: FlowLayout.

? embora um applet seja uma subclasse de Panel, no faz sentido usa-lo como um componente de um
programa Java. Independentemente disso, existem aplicativos hbridos, ou seja, quando um programa
codificado para ser executado tanto como aplicao de console como aplicativo web. As vantagens e
desvantagens da implementao de programas hbridos sero discutidas em sala de aula.
99

A P P L E T S

Ciclo de vida de um applet


O ciclo de vida de um applet prev a execuo dos mtodos abaixo, na ordem em que esto
enumerados:
1st.
2nd.
3rd.
4th.
5th.
6th.

Construtor
public void int()
public void start()
public void paint(Graphics g)
public void stop()
public void destroy()

onde:
Construtor

um construtor normal de uma aplicao Java, que leva o nome da classe a


que pertence e geralmente usado para inicializar variveis. Blocos de
inicializao tambm podem ser usados em applets. O programador no
deve incluir a lgica do programa no construtor, mas sim no mtodo start
explicado abaixo.

init()

Uma vez que o construtor j tenha sido executado, o objeto applet j existe
na memria e a mquina virtual do browser executa o mtodo init(). O
mtodo init() usado para inicializar variveis e, principalmente, para definir o
aspecto grfico do applet: mudar o gerenciador de layout e adicionar
componentes. IMPORTANTE: o mtodo init() chamado apenas na primeira
vez que o applet carregado pelo browser. Se o usurio atualizar a pgina
Html que contm um applet, esse mtodo no ser executado novamente.

start()

Esse mtodo chamado aps o init() e usado para usado para executar a
lgica do applet. Esse mtodo ser chamado na primeira vez que um applet
for carregado, sempre que a pgina for atualizada ou quando o browser for
restaurado aps ter sido minimizado. Por exemplo, se voc implementar uma
animao ou execuo de sons em seu applet, essa animao ou som
sempre ser interrompida quando o browser for minimizado e reiniciar
quando a janela do browser for restaurada.
Dizemos que quando o mtodo start chamado o applet se torna vivo.

paint(Graphics g)

Veja a seo "contexto grfico AWT" abaixo.

stop()

O mtodo stop chamado sempre que um applet deixar de estar vivo, ou


seja, o browser for minimizado ou o usurio trocar de pgina. O programador
pode usar esse mtodo para liberar recursos de multimdia, como sons e
animaes. Dizemos que quando o mtodo stop chamado o applet deixa
de estar vivo.

destroy()

Mtodo chamado pelo browser automaticamente aps o trmino do mtodo


stop(). Serve para indicar mquina virtual vinculada ao browser que o
applet no est mais ativo e pode ser desalocado da memria, bem como
todos os recursos associados a ele. Pode ser sobrecarregado pelo
programador para incluir uma determinada funcionalidade no encerramento
da execuo do applet, por exemplo, abrir uma janela de despedida, iniciar
100

A P P L E T S

ou suspender threads, etc.

Outros dois mtodos importantes na implementao de applets so:


getCodeBase()

getDocumentBase()

Esse mtodo retorna o endereo onde a classe principal do applet est


armazenada.
.
Esse mtodo retorna o endereo da pgina Html que contm o applet

Contexto grfico AWT


Toda a interface grfica AWT baseada em um intrincado mecanismo de exibio de componentes,
gerenciado por um processo isolado da aplicao chamado de Thread AWT.
Essa thread ativada em duas situaes:
??

Quando um componente grfico for exibido na tela do computador. Isso ocorre quando um programa
ativado e est pronto para ser exibido ao usurio

??

Quando um componente grfico precisar ser atualizado, ou seja, precisar ser redesenhado por
alguma razo: mudanas de caractersticas grficas do componente, redimensionamento,etc.
Quando isso ocorre, primeiro a thread AWT precisa remover a imagem antiga para depois aplicar a
nova imagem do componente.

Mais adiante no curso iremos estudar o conceito de threads. Por hora basta que o estudante saiba que
existe um processo externo ao programa sendo executado, controlado automaticamente pela mquina
virtual e chamado de thread AWT.
Apesar da imagem dos componentes ser gerada automaticamente pela thread AWT, o programador pode
interferir no aspecto visual dos componentes atravs dos seguintes mtodos:
??
??
??

public void paint(Graphics g)


public void repaint()
public void update(Graphics g)

onde:
paint(Graphics g)

Sempre que a imagem de um componente grfico AWT (ou extendido de


AWT, como os componentes Swing) for ser exibida na tela de um
computador, o mtodo paint() ser chamado pela mquina virtual. Se o
programador no sobrecarregar esse mtodo, a JVM ir usar uma imagem
padro para o componente em questo.
Uma facilidade da classe java.awt.Graphics, chamada de clip
rectangle, utilizada para que nem toda a rea ocupada por um
componente precise ser redesenhada a cada atualizao desse
componente. Por exemplo, quando voc tem duas janelas sobrepostas no
Windows, e parte da janela que est atrs aparece, se voc minimizar a
janela que est na frente apenas a parte que no aparecia da janela detrs
ser redesenhada.
Se o programador desejar alterar a imagem do componente ou desenhar

101

A P P L E T S

diretamente sobre ele, dever sobrepor esse mtodo.


Um applet um componente AWT que no possui imagem grfica
padro. Para que alguma imagem aparea quando o applet for executado,
o programador deve sobrepor o mtodo paint(..). Caso contrrio, o espao
ocupado pelo applet ficar vazio, com a cor do fundo cinza.
repaint()

Esse mtodo fora a atualizao da imagem do componenet, atravs de


uma chamada ao mtodo update(). muito usado para prover uma forma
interativa de modificao na imagem do componente, por exemplo, quando
um usurio seleciona uma nova imagem de uma lista e essa imagem deve
ser visualizada no centro de um applet.

update(Graphics g)

Esse mtodo fora a thread AWT a chamar um mtodo nativo chamado


update(), que tem o seguinte comportamento:
? ? limpa a rea ocupada pelo componente grfico, preenchendo essa
rea com a cor de fundo do componente.
? ? Ajusta a cor padro do contexto grfico para a cor de frente do
componente grfico.
? ? Chama o mtodo paint() do componente.

A ordem de execuo dos mtodos descritos acima apresentada no esquema abaixo:

Thread AWT esperando a prxima notificao


repaint()
atualizao
componente

update()

Limpar a rea
Chamar o mtodo paint(..)

paint(...)

Aprendendo a usar o appletviewer


O appletviewer um aplicativo que acompanha o ambiente de desenvolvimento jdk e visa facilitar os
testes durante a implementao de applets Java. Ao invs de usar um browser para testar um applet, o

102

A P P L E T S

desenvolvedor pode ativar o applet diretamente a partir do aplicativo chamado appletviewer, com a
seguinte linha de comando:
appletviewer [-debug] url
onde:
-debug: permite que o appletviewer mostre no console informaes sobre a alocao dos objetos
durante a execuo do applet, e eventuais erros de execuo.
url: o endereo onde o cdigo Html que contm uma referncia ao applet est armazenado.
Exemplo:
C:\>cd jdk1.3.1
C:\jdk1.3.1>cd demo
C:\jdk1.3.1\demo>cd applets
C:\jdk1.3.1\demo\applets>cd tic*
C:\jdk1.3.1\demo\applets\TicTacToe>appletviewer
example1.html

? uma grande fonte de aprendizado para a implementao de applets o conjunto de exemplos que
acompanham a documentao do jdk, pois tem o cdigo fonte disponvel para que o aluno aprenda.
Procure identificar em que diretrio esses exemplos esto copiados e execute-os para ter uma boa idia
de como um applet se comporta. Alm disso, procure em sites de busca pelas pelavras chave: Java e
Applets. Voc ver que existem centenas de pginas com demonstraes de applets e dicas de como
criar applets mais bonitos ou teis.

O cdigo HTML de carga do applet


Conforme citamos no incio deste texto, para executar um applet via Internet necessrio que a
referncia a esse applet aparea em uma pgina Html. Ao interpretar uma pgina Html que contm um
applet, o browser identifica a tag <applet> e ativa a mquina virtual vinculada a ele.
Essa tag <applet> apresentada abaixo, com as definies opcionais em itlico:
<applet>
archive = listaDeArquivos
code = nome do applet
width = largura em pixels
height = altura em pixels
codebase = endereo onde o applet est armazenado
alt = cdigo para ser exibido em browser sem suporte applets
name = nome da instncia do applet
align = alinhamento em relao ao espao disponvel para exibio
vspace = espao vertical em pixels
hspace = espao horizontal em pixels

103

A P P L E T S

param name = atributo


alternateHTML
</applet>

value = valor

onde:
Archive

Lista de arquivos contendo recursos a serem carregados antes da execuo do


applet. Normalmetne so arquivos contendo imagens, sons ou classes
implementados por terceiros. O nome dos arquivos deve ser separado por ','

code

Atributo obrigatrio que indica o nome da classe principal do applet. O nome da


classe no deve incluir o caminho da classse no servidor se a classe se
encontrar em um caminho diferente do Html que a chamou, esse novo caminho
deve ser definido no atributo codebase. Caso o applet pertena a um pacote, o
nome do pacote deve ser inserido ao nome da classe, por exemplo:
fic.jogo.jogoDaVelha.class

width
heigth

Esse atributos obrigatrios indicam as dimenses que o applet dever ocupar na


pgina Html, em pixels.

codebase

Especifica a url onde o cdigo se encontra. Se esse atributo no for definido, o


browser assume o endereo da pgina Html como sendo o mesmo da classe
principal do applet.

alt

Se o browser suportar a execuo de applets mas por algum motivo o applet no


puder ser executado, o texto especificado pelo atributo alt ser mostrado no
lugar do applet.

name

Atributo opcional usado para nomear a instncia do applet. Isso til para prover
a comunicao entre dios mais applets rodando na mesma pgina Html.

align

Atributo opcional de alinhamento do applet em relao ao espao disponvel


para a sua exibio na pgina Html:
left, right, top, texttop, middle, absmiddle, baseline,
bottom e absbottom.

vspace
hspace

Atributos opcionais que especificam o nmero de pixels a serem deixados de


espao entre as bordas do applet e o espao disponvel para a sua exibio.

param name
value

So atributos que permitem a passagem de parmetros ao applet. Usado para


configurar o comportamento de um determinado applet, que l os parmetros
utilizando o mtodo getParameter();

Como exemplo de Html que contm um applet, mostramos abaixo o Html responsvel pela exibio do
Tic-Tac-Toe, o exemplo que acompanha o jdk mostrado anteriormente:

<html>
<head>
<title>TicTacToe v1.1</title>
</head>
<body>

104

A P P L E T S

<h1>TicTacToe v1.1</h1>
<hr>
<applet
code=TicTacToe.class
width=120
height=120
>
alt=" o applet no est rodando, verifique suas configuraes"
</applet>
<hr>
<a href="TicTacToe.java">The source.</a>
</body>
</html>

Lendo parmetros do Html com um applet


Uma das formas mais comuns de configurar o comportamento de um applet a definio de parmetros
no cdigo Html. Por exemplo, abaixo temos uma applet que mostra uma figura carregada a partir da url
onde o applet est armazenado. Observe que o nome da figura a ser exibida pelo applet aparece como
um parmetro no Html e no no prprio cdigo do applet, Isso til, pois se quisermos mudar o nome da
figura, ou no soubermos de antemo o nome da figura, poderemos mudar apenas o cdigo Html, sem a
necessidade de modificar e compilar o cdigo do applet.

<html>
<head>
<title>Mostrando uma imagem</title>
</head>
<body>
<applet
code=Figura.class
width=200
height=200
>
<param name=imagem value=foto.gif>
</applet>
</body>
</html>
--------------import java.awt.*;
import java.applet.*;
import java.net.*;
/**
* Exemplo de leitura de parmetro com applets
* @author Felipe Gacho
*/
public class Figura extends Applet
{

105

A P P L E T S

Image figura;
// Aqui a figura ser carregada
public void init()
{
URL endereo = getDocumentBase();
String nomeDaFigura = getParameter("imagem");
figura = getImage(endereco, nomeDaFigura);
}
// Aqui a figura ser desenhada na tela
public void paint(Graphics g)
{
g.drawImage(figura, 0, 0, this);
}
}

Os parmetros encontrados em pginas Html so sempre do tipo String, mas voc pode convert-los
usando os mtodo das classes wrapper, por exemplo:
int velocidade = Integer.parseInt(getParameter("velocidade"));

Manipulando imagens
Para que um applet use uma imagem grfica, necessrio que essa imagem seja do tipo *.gif, ou
*.jpg. Os aspectos relativos ao uso de imagens e sons sero discutidos em sala de aula, mas o aluno
deve ter sempre em mente o fato de que applets so aplicativos carregados via Internet e, dependendo
da velocidade de conexo com o servidor, o uso excessivo de imagens ou de imagens muito grandes
deve ser evitado.
Abaixo mostramos um mtodo bastante til, que l imagens a partir de um determinado endereo da
internet. Voc pode incluir esse mtodo no cdigo de seus applets. Esse cdigo ser melhor explicado
em sala de aula.
/**
* Mtodo que carrega imagens na memria, a partir da URL onde o
* applet est sendo carregado. O uso de um 'mediaTracker' fundamental para
* evitar problemas quanto velocidade de carga de uma imagem. Se voc no
* usar um mediaTracker, o seu cdigo pode tentar usar uma imagem antes dela
* estar plenamente carregada na memria, o que causaria um erro de execuo.
* @param nomeDaImagem O nome da imagem a ser carregada
* @return A imagem requisitada ou null caso no haja tal imagem na url do applet
*/
public Image carregarImagem(String nomeDaImagem)
{
try
{
Image imagem = getImage(getDocumentBase(), nomeDaImagem);
MediaTracker carregador = new MediaTracker(this);
carregador.addImage(imagem, 0);
carregador.waitForID(0);

106

A P P L E T S

return imagem;
}
catch(Exception erro)
{
erro.printStackTrace();
System.exit(0);
return null;
}
}

Exerccios
10. Escreva um applet que mostre o seu nome no centro da tela.
11. Escreva o cdigo Html necessrio para rodar o applet do exerccio 1 e teste o seu applet com o
appletviewer.
12. Implemente um applet que desenhe crculos coloridos na tela. O tamanho e a cor dos crculos
podem ser aleatrios.
13. Procure na web por exemplos de applets e procure identificar como esses applets foram
implementados. Dica: voc pode aproveitar a seo de apoio didtico como ponto de partida. Boa
viagem.

107

16

Interfaces grficas baseadas em


behaviorismo O pacote Swing

Padres de projeto permitem ao desenvolvedor de software o aumento da produo e a garantia da


qualidade de seus programas. Nesta seo, o aluno apresentado ao pacote Swing um conjunto de
componentes grficos baseados no padro MVC.

O que Swing ?
Swing o nome dado ao pacote de classes desenvolvidas pelo "Projeto Swing" parte de um contexto
maior chamado de JFC Java Foundation Classes. O Swing consiste em um conjunto de componentes
grficos (extenses dos componentes AWT e novos componentes como representao de rvores e
painis tabulados), que agregam o conceito de look and feel (L&F), ou seja, a capacidade de um mesmo
componente assumir aparncias diferentes sem a necessidade de mudanas no seu cdigo. Por
exemplo, voc pode criar uma aplicao Java que se adapte aparncia grfica do sistema operacional
em que for executado assumindo um aspecto semelhante as demais janelas Windows, Linux, Solaris,
Macintosh, etc. Os componentes Swing so totalmente criados em Java (100% pure Java) e foram
desenvolvidos no conceito de interface peso-leve do usurio. A a idia codificar apenas a
funcionalidade do componente e a sua relao com o modelo de dados ao qual est associado, deixando
a sua aparncia a cargo do gerenciador de interface do usurio (UI Manager), um novo recurso
incorporado s mquinas virtuais a partir da verso 1.3 do ambiente de desenvolvimento Java (jdk1.3.1).
Nesta aula no iremos detalhar a manipulao dos componentes Swing. Ao invs disso, focaremos a
ateno no conceito de Modelo-Viso-Controle, o padro de projeto adotado pela maioria dos
componentes Swing. Aconselha-se fortemente ao aluno que leia a excelente documentao sobre Swing
e analise os exemplos que acompanham o jdk.

Containers Swing
Comearemos a nossa visita ao mundo das interfaces Swing apresentando a classificao de seus
principais containers em relao API Java:
??
??
??

javax.swing.JFrame
javax.swing.JPanel
javax.swing.JApplet

I N T E R F A C E S

G R F I C A S

B A S E A D A S

E M

B E H A V I O R I S M O

( S W I N G )

java.lang.Object

java.awt.Component

java.awt.Container

javax.swing.JComponent

java.awt.Window

java.awt.Panel

javax.swing.JPanel

java.awt.Frame

java.applet.Applet

javax.swing.JFrame

javax.swing.JApplet

Observe que a grande mudana de classificao em relao aos componentes AWT que os painis
Swing passaram a ter uma superclasse distinta dos painis AWT, embora ambos continuem a ser
containers. Essa diferenciao foi promovida pela implementao da classe JComponent, que foi
concebida a dar suporte ao uso de modelos separados da interface, conforme veremos mais adiante no
curso. Os demais containers, JFrame e JApplet, apresentam variaes apenas estticas e, por isso
mesmo, aparecem no mesmo ramo de seus pares AWT - Frame e Applet respectivamente.
Alm dos container tradicionais, apresentados acima, o pacote Swing introduziu uma srie de novos
containers que, por possurem funes especficas na construo de interfaces inerentes a determinados
tipos de problemas, no sero detalhados aqui:
? ? BasicSplitPaneDivider usado para interfaces onde os painis so redimensionveis.
? ? Box usado para
? ? CellRendererPane
? ? DefaultTreeCellEditor.EditorContainer

? Observe que os containers Swing tem como superclasse o container AWT, logo, todos os conceitos
sobre gerenciamento de componentes em containers AWT seguem valendo.

Introduo a padres de projeto (design patterns)


No comeo dos anos 90, um grupo de pesquisadores conhecidos como "A gangue dos 4", lanou o
clebre livro Design Patterns, Elements of Reusable Object-Oriented Software (The Gang of Four -

109

I N T E R F A C E S

G R F I C A S

B A S E A D A S

E M

B E H A V I O R I S M O

( S W I N G )

GOF, Addison-Wesley: 1995). Nesta publicao, os autores Erich Gamma, Richard Helm, Ralph Johnson
e John Vlissides identificaram padres no desenvolvimento de sistemas industriais, ou seja, observaram
que vrios programadores acabavam gerando solues muito semelhantes para os problemas mais
freqentes no desenvolvimento de programas de computador. Detectaram tambm que o
desenvolvimento de tais projetos exigia um grande esforo de reflexo acerca da ontologia dos
problemas, consumindo muito tempo para ser desenvolvido e com a qualidade vinculada experincia
dos analistas responsveis pelo projeto. Por essa razo, a gangue dos quatro resolveu documentar os
padres mais usados, permitindo aos novos programadores e analistas a reduo do tempo necessrio
para identificar os aspectos centrais dos problemas mais comuns em computao. Ao todo, foram
detectados 23 padres de comportamento na modelagem de sistemas, subdivididos em trs grandes
grupos:
??

Creational design patterns relacionado instanciao dos objetos ou grupos de objetos. Por
exemplo, um sistema pode necessitar limitar o nmero de instncias ativas de uma determinada
classe ou ento permitir que as caractersticas de uma classe sejam definidas em tempo de
execuo. Padres definidos: Abstract factory, Builder, Factory Method, Prototype
e Singleton.

??

Structural design patterns associado relao entre as classes de um projeto, ou seja, a


comunicao entre elas, ordem em que os objetos so instanciados, etc. Padres definidos:
Adapter, Bridge, Composite, Decorator, Facade, Flyweight e Proxy.

??

Behavioral design patterns estudo do comportamento dos objetos em relao ao seu meio
ambiente, tratando isoladamente as caractersticas de um objeto e o seu comportamento. Grande
parte dos componentes Swing foram implementados usando o padro behaviorista chamado
Observer, que iremos descrever com mais detalhes na prxima seo. Padres definidos: Chainof-responsability, Command, Interpreter, Iterator, Mediator, Meme
nto,
Observer, State, Strategy, Template e Visitor.

? O termo design pattern, embora possa ser literalmente traduzido como padro de projeto, deve
ser visto como um jargo tecnolgico, ou seja, usado em ingls, mesmo por falantes nativos de outras
lnguas. Alm disso, o estudo de design patterns tornou-se referncia de qualidade para todo profissional
de informtica. indispensvel que o aluno leia algum material completo sobre o assunto, que ser
retomado com mais profundidade na disciplina de Sistemas Orientados a Objetos II.

Programao behaviorista - o paradigma modelo-visocontrole (MVC)


O termo behaviorismo remete idia de ao e reao, adotada por alguns estudiosos da mente
(psiclogos, psiquiatras, etc.) como teoria de formalizao do comportamento humano. A idia bem
simples: voc tem uma entidade que reage aos estmulos do meio ambiente, como por exemplo, uma
pessoa gritar quando recebe um choque eltrico, uma bola se mover quando chutada, uma lmpada
acender quando o seu interruptor ligado, etc.
No ser humano, esse conceito um tanto quanto polmico, pois no se pode afirmar o quanto do nosso
comportamento puramente behaviorista e o quanto de natureza emocional, ainda pouco conhecida.
J em entidade artificiais, como componentes de programao, o reflexo condicionado perfeitamente
aplicvel, pois todos os estmulos e reaes de um componente sero previamente conhecidos, no
havendo espao para reaes anmalas, de natureza emocional ou catica.

110

I N T E R F A C E S

G R F I C A S

B A S E A D A S

E M

B E H A V I O R I S M O

( S W I N G )

Exemplo: voc pode criar um boto e associar a esse boto um determinado mtodo em seu programa.
Voc sabe que, sempre que esse boto for pressionado, ele ir executar o mtodo que est associado a
ele. Ao e reao: o usurio clica sobre o boto e o programa executa algum mtodo, sempre o mesmo
mtodo e quantas vezes o usurio quiser a reao do boto ao estmulo "clique do usurio" prdefinida e, portanto, consistente em relao ao modelo do sistema.
Tradicionalmente, a funcionalidade de um programa de computador codificada junto ao seu modelo de
dados e, s vezes, junto sua interface grfica. A proposta do paradigma controle-modelo-viso (CMV)
desassociar esses trs aspectos do software, deixando os programas mais portveis e simples de serem
compreendidos. Um sistema behaviorista deve incluir trs estruturas codificadas geralmente em
separado:
??

Modelo: a enumerao das estruturas de dados associadas ao problema, ou seja, uma classe que
encapsule um conjunto de dados primitivos ou agregados . O modelo tambm deve prover mtodos
que permitam a manipulao de seus dados atravs da interao com processos computacionais
controlados pelo usurio ou por sistemas de computao. Um modelo dito observvel, ou seja,
outras entidades do sistema podem monitorar o seu comportamento, reagindo a mudanas nos
valores de seus dados.

??

Controle: so processos computacionais que tem acesso aos dados de um modelo, podendo
manipular esses dados de forma consistente. Por exemplo: se tivermos um sistema baseado em
banco de dados relacional, as tabelas da base de dados sero o modelo do sistema, enquanto os
processos de insero/remoo/atualizao dos dados sero o controle do sistema. Podemos dizer
informalmente que o controle forma de comunicao entre o modelo e a viso de um sistema CMV,
sendo que, em muitos casos, encontramos o modelo e o controle codificados na mesma classe.

??

Viso: informa o valor dos dados do modelo a outros processos do sistema ou ao usurio, ou seja,
um processo observador do modelo. Em sistemas behavioristas, a viso normalmente a interface
grfica do usurio

A figura acima representa a idia geral de um sistema behaviorista, ou seja, o usurio manipula o modelo
de dados atravs de mecanismos de controle e, cada vez que o valor dos dados do modelo for alterado,
essa modificao refletida na interface do usurio (viso). A figura acima mostra um exemplo simples
de sistema CMV, mas importante o aluno lembrar que podemos ter sistemas distribudos, com mltiplos
usurios e diferentes controles e vises para o mesmo modelo de dados. Sistemas multiusurios
apresentam problemas complexos de sincronizao de acesso ao modelo de dados que sero abordados

111

I N T E R F A C E S

G R F I C A S

B A S E A D A S

E M

B E H A V I O R I S M O

( S W I N G )

mais adiante, na aula sobre threads. Outro detalhe interessante a ser lembrado o fato de que o modelo
pode ser manipulado por outros sistemas de computador. Ou seja, no exemplo acima aparece um
usurio como agente ativo no sistema, mas a figura do usurio poderia ser substituda por algum
processo automtico controlado por software e/ou hardware. Imagine um sistema bancrio que aplica
dinheiro automaticamente na poupana a cada vez que o saldo for superior a R$ 1.000,00. O usurio,
correntista, fica mexendo em sua conta bancria sem interagir diretamente com as aplicaes
financeiras. O prprio sistema bancrio que detecta o saldo suficiente e dispara um processo de
aplicao bancria ou resgate de aplicao.
Muitas situaes so imaginveis, a maioria delas prevista em design patterns, o que d uma boa noo
sobre a necessidade de um estudo detalhado sobre Design Patterns.
Qual a vantagem de se codificar o modelo, o controle e a viso em classes separadas?
Imagine que voc desenvolva um sistema de controle de estoque de uma loja, formado por alguns
formulrios de entrada de dados, emisso de relatrios e que tenha tambm o controle fiscal. Agora
imagine que o governo altere as normas fiscais vigentes no Pas. Caso voc tenha codificado seu
sistema em uma nica classe, voc ter que alterar os trechos de cdigo relativos ao controle fiscal,
procurando esses trechos entre outros cdigos que nada tem a ver com o controle fiscal como, por
exemplo, aspectos da interface, dos relatrios, etc. Ou ento imagine que o gerente de marketing de sua
empresa sugeriu mudar drasticamente o visual do sistema, permitindo aos compradores da loja o acesso
direto consulta de preos atravs de uma nova interface que agrega informaes com marketing.
Mesmo que voc tenha codificado seu sistema em mdulos separados, se esses mdulos possuem
referncias entre eles, ou seja, ponteiros entre as classes, voc ter um grande trabalho de reformulao
da interface grfica e, principalmente, de garantir a consistncia do sistema talvez tenha que refazer
tudo.
Embora um software possa ser modulado atravs de tcnicas convencionais, a presena de referncias
entre os mdulos impede uma dinmica eficiente na manuteno desses sistemas. Se voc tiver, por
exemplo, uma classe de controle fiscal com um ponteiro para a classe que gera a interface grfica, e
essa interface grfica for renomeada ou removida do sistema, ser necessrio modificar tambm a classe
de controle fiscal para que o sistema continue consistente. Ou ento se voc quiser reaproveitar uma boa
interface grfica em um novo modelo, voc ter uma complicada tarefa de verificar todos os ponteiros
entre as duas classes.
O CMV vem justamente propor uma forma modular de atualizao de sistemas, onde a modificao de
um aspecto do sistema no interfere nos demais. Por exemplo, em um sistema CMV, podemos ter vrias
interfaces grficas diferentes refletindo os dados de um nico modelo, ou ento diferentes formas de
controle atuando sobre esse mesmo modelo por exemplo: a interface dos usurios s permite consulta
enquanto a dos gerentes permite modificao nos valores. Quem faz a comunicao entre os

mdulos de um sistema behaviorista no so mais os componentes do software,


diretamente via referncias, mas sim a prpria mquina virtual que possui suporte a
esse tipo de programao - baseada em eventos chamados de notificaes. De fato,
o comportamento de um sistema behaviorista gira em torno do modelo de dados sempre que algum
formato ou valor for modificado no modelo de dados, o objeto que representa esse modelo notifica a JVM
sobre que tipo de alterao ele sofreu. A mquina virtual, por sua vez, se encarrega de repassar a
notificao a todos os observadores que esto associados a esse modelo. Note que o modelo no sabe
se existem observadores sobre ele e nem o qu esses eventuais observadores fazem com as
notificaes recebidas, pois no existe nenhuma referncia direta entre o modelo (observvel) e os
observadores. A comunicao entre os mdulos de um sistema CMV aparece na figura abaixo:

112

I N T E R F A C E S

G R F I C A S

B A S E A D A S

E M

controle

B E H A V I O R I S M O

( S W I N G )

Viso AWT

alterao
Viso
Swing

Servidor
web

modelo
notificao
notificao

notificao

notificao

Mquina Virtual Java (JVM)


No diagrama acima, cada elipse representa uma classe diferente, ou seja, a remoo ou modificao de
uma das classes do sistema no afeta o comportamento das demais. Um detalhe a ser lembrado que
no faz sentido pensar em observadores sem modelo, porm um modelo sem observadores
perfeitamente aceitvel normalmente em sistemas automticos, com pouca ou nenhuma interferncia
do usurio. Outra vantagem do uso de CMV que as partes que compem o sistema podem ser
desenvolvidas em separado, por pessoas/equipes diferentes e/ou sem a necessidade de sincronia.

? Os mdulos de um sistema podem tambm ser testados em separado, por softwares de teste. O uso
de ferramentas de teste vem crescendo em popularidade entre as empresas de tecnologia, bem como a
preciso dessas ferramentas. interessante que o aluno saiba da existncia dessas ferramentas e
procure informaes de como elas so utilizadas. Dica: d uma olhada em www.junit.org.

Implementando um modelo em Java (Observable)


Um modelo em Java pode ser implementado de duas maneiras:
??

Contendo uma lista de observadores (Listeners)

??

Estendendo a superclasse java.util.Observable

A discusso entre essas diferentes abordagens ser dispensada aqui, deixando ao aluno o cargo de
aprofundar o estudo sobre implementao de objetos observveis em Java. A principal diferena entre a
lista de observadores e a classe Observable relacionada inexistncia de herana mltipla em Java.
Quando estendemos uma classe superclasse Observable, estamos impedindo que a classe do modelo
seja derivada de outra classe, com funcionalidades eventualmente relevantes ao sistema que est sendo
implementado. Mas, na maioria das vezes, um modelo deve apenas representar os dados do sistema e
no necessita de outras funcionalidades exceto de ser um objeto observvel. Para tal, declaramos a
classe que ir representar o modelo no seguinte formato:
import java.util.*; // Pacote Java.til contm a classe Observable
/** Classe observvel (modelo) */
public class <Identificador> extends
{

Observable

113

I N T E R F A C E S

G R F I C A S

B A S E A D A S

E M

B E H A V I O R I S M O

( S W I N G )

private int valor = 0;


// Exemplo de mtodo de acesso aos dados do modelo
public void ajustarValor (int valor)
{
this.valor = valor;
setChanged();// ? Registro de modificao do modelo
notifyObservers(); // ? Notificao de modificao nos valores do modelo
}
// restante do corpo da classe...

Implementando vises para um modelo


Uma viso uma classe Java que implementa a interface java.util.Observer, conforme o exemplo abaixo:
import java.util.*; // Pacote Java.til contm a classe Observer
/** Classe observvel (modelo) */
public class <Identificador> implements Observer
{
public void update(Observable modelo, Object component)
{
System.out.println(o"recebeu notificao de " + modelo) ;
}
// restante do corpo da classe...
}

Criando o primeiro aplicativo MVC


Mostraremos um exemplo simples, com os seguintes componentes:
??

Modelo: contm um valor inteiro, limitado entre 0 e um determinado limite superior. Para facilitar o
aprendizado de interao entre modelos e vises, iremos implementar a interface
javax.swing.BoundedRangeModel no modelo. Isso faz com que os mtodos de atualizao dos
valores do modelo sejam sobrecargas de mtodos dessa interface:
o setValue(int valor);
que permite a um controlador modificar o valor atual do modelo.
o getValue();
que permite a um controlador saber o valor atual do modelo.

??

Controle: contm uma referncia a um modelo do contador e, ao ser ativado, incrementa


sistematicamente o valor do modelo at que seja alcanado o seu limite. Para ser de simples
entendimento, o controlador possui apenas um mtodo, construtor, que executa a toda a funo prdefinida ao controlador.

114

I N T E R F A C E S

??

G R F I C A S

B A S E A D A S

E M

B E H A V I O R I S M O

( S W I N G )

Viso: implementaremos duas interfaces grficas, uma Swing e outra AWT, permitindo ao aluno
observar o comportamento de diferentes vises associadas a um mesmo modelo:

O cdigo desse exemplo ser detalhado em aula, mas para voc rodar em casa faa o seguinte:
??
??
??

Baixe o arquivo zipado contendo os cdigos fonte do exemplo


Descompacte os cdigos em algum diretrio de teste
No diretrio de testes, digite os seguintes comandos:
o

javac *.Java

java CMV

? Aps rodar o exemplo, procure olhar o cdigo fonte e descobrir como ele funciona, como foi
implementado. Se voc no compreender o funcionamento do CMV, ou parte dele, pergunte ao
professor.

115

17

Acesso a dispositivos de entrada e


sada - I/O

Dispositivos de entrada e sada so utilizados para persistncia ou transferncia de dados. Java apresenta
uma elegante abordagem Padres de projeto permitem ao desenvolvedor de software o aumento da
produo e a garantia da qualidade de seus programas. Nesta seo, o aluno apresentado ao pacote
Swing um conjunto de

O que so I/O Streams ?


A linguagem Java no trata dispositivos de entrada e sada e forma especfica, ou seja, com classes
especficas para cada dispositivo. A invs disso, Java implementa o conceito de Streams, que podem ser
vistos como canais por onde trafegam bytes entre um processo computacional e uma origem ou destino
de dados: arquivos, impressora, mouse, teclado, vdeo, conexo via Socket com outros programas, etc. A
ordem do fluxo de dados, entrada ou sada, relevante na escolha do Stream a ser utilizado. Alm disso,
podemos ter Streams com buffer de dados e/ou com filtros de dados, que veremos a seguir.
A figura abaixo mostra os dois tipos bsicos de Streams utilizados pela linguagem Java:

Programa
Java

Programa
Java

Input Stream
leitura

filtro
buffer

filtro
buffer

Dispositivos de entrada:
?? Mouse
?? Teclado
?? Leitura de arquivos
Dispositivos de sada:

Output Stream
escrita

??Impressora
??Tela de sada (console)
??Escrita em arquivos

?? Input Stream: canal utilizado para a leitura de bytes a partir de um dispositivo de entrada.
?? Output Streams: canal utilizado para a escrita de bytes em um dispositivo de sada.
?? Filtered Streams: canal com um filtro acoplado a dispositivos de entrada ou sada, e que permite a
escrita ou leitura de tipos de dados ao invs de simples bytes.

?? Buffered Streamas: canal que permite a leitura ou escrita de dados atravs de um depsito de bytes,
ou seja, o programador pode definir uma quantidade de bytes transferida a cada comando de escrita
ou leitura.

Leitura de dados (java.io.InputStream)


Os mtodos bsicos em Streams de entrada so:

int read()
int read(byte[])
int read(byte[], int, int)
Esses trs mtodos so usados na leitura dos dados disponveis em um Stream. Note que o retorno dos
mtodos um nmero inteiro, indicando o byte lido do Stream ou ento o nmero de bytes lidos do
Stream. Caso no haja bytes disponveis para a leitura, ou tenha ocorrido algum erro durante a leitura, o
retorno desses mtodos ser 1. O parmetro byte[] que aparece dentro dos dois ltimos mtodos
representa a referncia a um array de bytes onde o mtodo deve guardar os bytes lidos do dispositivo de
entrada o nmero de bytes a ser lido o tamanho desse array. No ltimo mtodo, os dois parmetros
inteiros representam o intervalo dentro do array onde os bytes devem ser armazenados, e o nmero de
bytes a ser lido a diferena entre os dois valores.

? para um melhor desempenho de seus programas, procure definir o tamanho do array de bytes usado
para a leitura de dados com o mximo tamanho suportado pelo dispositivo de entrada.

void close()
Mtodo que fecha um Stream, e que deve ser executado sempre que o seu programa no precisar mais
ler dados de um dispositivo. A permanncia de canais abertos a dispositivos de entrada sem necessidade
prejudica o desempenho de seu programa e causa um risco integridade dos dados desses dispositivos.

int available()
Mtodo que retorna a quantidade disponvel de bytes em um dispositivo de leitura, muito usado na leitura
de arquivos cujo tamanho no previamente conhecido.

void skip(long)
Esse mtodo descarta um determinado nmero de bytes do Stream.

boolean markSupported()
Alguns dispositivos de entrada permitem operaes push back, ou seja, a utilizao de um marcador de
posio do primeiro byte disponvel no Stream. O mtodo markSupported() utilizado para detectar se o
dispositivo ao qual o Stream est associado suporta push back, ou seja, retorno verdadeiro. Caso
contrrio, o retorno do mtodo ser falso.

void mark(int)
void reset()

117

Se o dispositivo suportar push back, o programador pode usar o mtodo mark para definir a posio
inicial de leitura ou o mtodo reset para restaurar a ordem original dos bytes disponveis no dispositivo de
leitura. O exemplo mais comum de push back verificado em arquivos de acesso randmico conforme
descrito mais adiante nesse texto.

Escrita de dados (java.io.OutputStream)


Os mtodos bsicos em Streams de sada so:

void write(int)
void write(byte[])
void write(byte[],int, int)
Esses trs mtodos so usados na escrita de dados em um dispositivo de sada, com um comportamento
semelhante aos mtodo de leitura descritos na seo anterior.

void close()
Mtodo que fecha o acesso a um dispositivo de sada. Sempre que o programa encerrar as operaes de
escrita em um dispositivo de sada, ele deve fechar o Stream associado a esse dispositivo.

void flush()
Mtodo que fora o Stream a descarregar todos os bytes que j foram enviados ao dispositivo de sada.
Algumas vezes, existe uma defasagem entre o momento que um programa chama uma escrita de dados
em um dispositivo de sada e o Stream realmente escreve nesse dispositivo. O comando flush fora a
escrita imediatamente. Quando o mtodo close chamado sobre um Stream de sada, o mtodo flush
automaticamente executado antes do fechamento do Stream, para garantir que todos os bytes enviados
a um dispositivo de sada tenham efetivamente sido escritos nesse dispositivo.

As classes de manipulao de Streams em Java (o pacote


java.io)
A hierarquia de classes do pacote java.io, relativos Streams de entrada, aparece na figura abaixo. Para
Streams de sada vale a mesma hierarquia, s que voc deve substituir a palavra Input por Output em
todas as classes.

118

InputStream
SequenceInputStream

FileInputStream

PipedInputStream

ByteArrayInputStream

FilterInpuStream

StringBufferInputStream

DataInputStream

PushbackInputStream

BufferedInpuStream

LineNumberInputStream

?? FileInputStream e FileOutputStream
So classes usadas para a manipulao de arquivos, permitindo que voc especifique o caminho
completo do arquivo como parmetro do construtor desses objetos classes. Para que um objeto
FileInputStream seja construdo com sucesso, o arquivo especificado no construtor deve existir e estar
disponvel para leuitura (no bloqueado). No caso de um FileOutputStream, se o arquivo destino j
existir, ele ser sobrescrito. A forma de construo dos Streams associados a arquivos aparece abaixo:
FileInputStream entrada = new FileInputStream("c:/documentos/teste.txt");
FileOutputStream saida = new FileInputStream("saida.txt");

? o separador de pastas utilizados em endereos de Streams Java segue o padro UNIX, ou seja, o
''/'. Se voc quiser adotar o padro windows, voc deve colocar duas barras: '\\' pois somente uma ser
confundida com a definio de algum caractere especial. Exemplo: "c:/teste/arq.txt" o mesmo que
"c:\\teste\\arq.txt". Por questo de portabilidade, acostume-se a sempre usar o padro UNIX, com a barra
invertida '/'.
?? BufferedInputStream e BufferedOutputStream
Um dos problemas de se usar as classes InputStream e OutputStream, que elas s permitem a
transferncia byte a byte dos dados, o que lento devido ao processo fsico de transferncia de bytes
entre dispositivos de armazenamento e a memria. Para contornar isso, foram definidos Streams com
buffer, ou seja, que permitem a leitura ou escrita de quantidades maiores de bytes, normalmente
controlados por algum delimitador. Isso faz com que o nmero de acessos ao dispositivo de
armazenamento diminua - um disco, por exemplo aumentando o desempenho geral do sistema. Em
casos onde o nmero de bytes a ser lido ou escrito pequeno (<1Mb), essa diferena desprezvel, mas
em grandes transferncias de dados a diferena notria. Streams com buffer so normalmente
utilizados como superclasses de leitores com buffer, apresentados na prxima seo.

119

?? DataInputStream e DataOutputStream
O raciocnio em bytes pouco intuitivo, ento a API Java prov classes que permitem a manipulao de
tipos primitivos de dados, tornando a lgica de mtodos de leitura e escrita mais clara em relao ao
qu est sendo transferido entre um dispositivo de armazenamento e a memria da mquina virtual.
Alguns mtodos dessas classes aparecem descritos abaixo:
public class DataInputStream extends FilterInputStream implements DataInput

byte readByte()
long readLong()
double readDouble()
public class DataOutputStream extends FilterOutputStream implements DataOutput

void writeByte(byte)
void writeLong(long)
void writeDouble(double)
Apesar da Strings serem muitas vezes tratados como tipos primitivos de dados, e existir mtodos de
leitura e escrita de String nas classes DataInputStream e DataOutputStream, voc deve sempre optar por
manipular a transferncia de Strings em Streams como serializao de objetos, que veremos na
seqncia desse texto.

? fortemente recomendado que voc leia as informaes sobre converso de caracteres que aparece
na documentao da classe DataInputStream.
?? PipedInputStream e PipedOutputStream
Essas classes permitem a transferncia de bytes entre Threads, ou seja, a origem e o destino da
transferncia no so dispositivos de armazenamento mas sim processos na memria. Alm disso, por
serem threads, esses processos tem comportamento diferenciado e, muitas vezes, obrigam a
transferncia de bytes a ser sincronizada para evitar problemas de inconsistncia de dados e/ou deadlock. A thread de origem deve instanciar um objeto PipedoutputStream, enquanto a thread destino deve
instanciar um objeto PipedInputStream.

Leitores e Escritores de dados em Streams com buffer


As classes descritas anteriormente permitem que um processo computacional leia e escreva bytes em
um dispositivo de armazenamento ou em outro processo. Porm, por questes de clareza de cdigo e
desempenho costuma-se utilizar essas classes na construo de objetos de leitura e escrita com um
buffer, permitindo a transferncia de grandes quantidades de dados entre a origem e o destino de um
Stream. Tal tcnica aparece no exemplo abaixo, originalmente introduzido na aula 6:
/**
* FIC - Faculdade Integrada do Cear
* Sistemas Orientados a Objetos I
* Lendo valores do teclado
*/
// Tem que importar a biblioteca de acesso aos

120

// dispositivos de Entrada e Sada (I/O) do Java:


import java.io.*;
public class Teclado
{
static public void main(String[] args)
{
// Tem que usar tratamento de exce
es,
// conforme explicado em aula.
try
{
// Essas duas linhas criam um "leitor com buffer"
// do dispositivo padro de entrada do Java:
// o teclado (System.in).
InputStreamReader dados = new InputStreamReader(System.in);
BufferedReader teclado = new BufferedReader(dados);
System.out.print("digite uma frase: ");
String frase = teclado.readLine();
System.out.println("Frase digitada:\t" + frase);

}
catch(Exception erro)
{
}

Converso entre bytes e caracteres


Em Java, quando cria-se um leitor ou escritor a partir de um Stream, a converso entre os bytes
transferidos entre a origem e o destino do Stream sero convertidos segundo o padro de caracteres da
plataforma onde o sistemas est rodando e a tabela UNICODE. Em lugares onde o padro o Latin-1
(Ascii), como no Brasil, a codificao de bytes utilizada ser a ISO 8859-1 (para a nossa sorte, o padro
de codificao Java o mesmo utilizado nos computadores brasileiros, ento no h necessidade de
preocupaes com converses entre smbolos a menos que voc venha a produzir programas para
outros pases). Voc pode definir qual o padro de codificao a ser adotado pela mquina virtual,
devendo para isso consultar a documentao da ferramenta native2ascii que acompanha o jdk.
Esse esquema de converso permite que os programas Java sejam portveis a computadores de todo
mundo, uma vez que os processos da memria sempre trabalharo com o UNICODE. Voc pode passar
o padro de codificao no construtor dos Streams, como mostra o exemplo abaixo:
InputStreamReader leitor = new inputStreamReader(System.in, "8859_1");

O que UNICODE?
Java utiliza uma tabela, chamada de UNICODE, para representar os smbolos utilizados na maioria das
lnguas conhecidas no mundo. Essa tabela usada para converter os smbolos utilizados pela plataforma
onde a mquina virtual est rodando e os programas Java que, na verdade, passam a reconhecer
esses smbolos apenas como entradas na tabela UNICODE e no pelo significado real desses smbolos
na linguagem padro dessa plataforma.

121

Manipulao de arquivos seqenciais


A manipulao de arquivos, seqenciais ou randmicos, passa pela construo de objetos da classe
java.io.File, que prov, alm do acesso fsico ao arquivo, uma srie de mtodos que facilitam o
controle sobre o contedo e as informaes bsicas desses arquivos, como data da ltima modificao,
tamanho, etc.
Criando objetos do tipo File:
// construtor de objeto arquivo no diretrio corrente
File arquivo = new File("origem.txt");
// construtor com diretrio especificado no construtor
File arquivo = new File("/dados/", "origem.txt");
// Uso de variveis para a identificao do diretrio
// e do arquivo a ser aberto
String diretrio = "/";
String arquivo = "teste.txt";
File arquivo = new File(diretrio, arquivo);

A partir de um objeto do tipo File, voc pode criar Streams de entrada ou sada, conforme mostra o
exemplo abaixo:
/**
* Mtodo de leitura de arquivos texto.
* @param arquivo O objeto associado a um arquivo
*/
static public byte[] carregar(File arquivo)
throws Exception
{
FileInputStream dispositivoDeEntrada =
new FileInputStream(arquivo);
byte[] conteudo = new byte[dispositivoDeEntrada.available()];
dispositivoDeEntrada.read(conteudo);
return conteudo;
}
/**
* Mtodo de gravao em arquivos texto.
* @param arquivo O objeto associado a um arquivo
* @param contedo O texto a ser escrito no arquivo
*/
static public void salvar(File arquivo, String conteudo)
throws IOException, Exception
{
FileOutputStream streamDeSaida = new FileOutputStream(arquivo);
streamDeSaida.write(conteudo.getBytes());
streamDeSaida.close();
}
Apesar das classes FileInputStream e FileOutputStream permitirem a passagem do nome dos arquivos
em seus construtores, fortemente recomendado que voc sempre crie um objeto da classe File para

122

referenciar um arquivo, evitando problemas de dependncia organizao dos arquivos no sistema em


que a mquina virtual est rodando. E lembre-se de usar sempre a barra invertida '\' como separador de
diretrios. fortemente recomendado que voc leia a documentao da classe Java.io.File acerca das
facilidades de manipulao das informaes sobre o contedo e as caractersticas bsicas dos arquivos.

Manipulao de arquivos randmicos


Um dos problemas do uso de arquivos seqenciais a necessidade de ler ou escrever todo o contedo
desses arquivos, mesmo que um determinado processo necessite apenas de uma parte de seu
contedo. Imagine que voc tenha um arquivo texto com quinhentos nomes, e precise verificar o
centsimo nome nesse caso, voc ter que ler 99 nomes desnecessrios at obter a informao que
necessita. O ideal, nesse caso, manipular arquivos como se fossem bancos de dados, ou seja, ter a
capacidade de acessar um dado em uma posio especfica dentro do arquivo, sem a necessidade de
percorrer o resto desse arquivo. Java prov classes para a manipulao de arquivos de acesso
randmico, ou seja, arquivos que possuem um ponteiro (file pointer) que permite a localizao dos
dados dentro do arquivo.
Para manipular um arquivo de acesso randmico, constri-se um objeto da classe
java.io.RandomAccessFile, passando como parmetro um objeto do tipo File:
File arquivo = new File("origem.txt");
RandomAccessFile manipulador = new RandomAccessFile(arquivo, "rw");
Note que o primeiro argumento do construtor do manipulador de arquivos randmicos a referncia ao
arquivo, enquanto o segundo argumento o tipo de acesso que ser utilizado:
r
rw

Read Only, significando que o acesso ao arquivo ser apenas para leitura
Read and Write, significando que o acesso permite a leitura e/ou modificao do contedo do
arquivo.

Como a classe RandomAccessFile implementa as interfaces DataInput e DataOutput, o acesso aos


dados de um arquivo de acesso randmico feito atravs dos mtodos definidos nessas interfaces,
basicamente read() e write(). Leia a documentao da classe java.io.RandomAccessFile para a
completa descrio dos mtodo de leitura e escrita, bem como os parmetros desses mtodos.
O posicionamento da leitura ou escrita em arquivos randmicos ajustado ou reconhecido atravs de
dois mtodos:
void seek(long)
long getFilePointer()
long lenght()
O mtodo seek ajusta o ponteiro do arquivo a uma determinada posio, considerando o intervalo padro
do arquivo, que pode ser o tamanho de um tipo de dado ou definido pelo programador. O mtodo
getFilePointer retorna a posio atual desse ponteiro, e o mtodo lenght retorna o tamanho total do
arquivo. Exemplo de posicionamento em um arquivo de acesso randmico:
// Criando a referncia ao arquivo de acesso randmico
File arquivo = new File("vendas.log");

123

RandomAccessFile manipulador = new RandomAccessFile(arquivo, "rw");


// Posicionando o file pointer no final do arquivo
manipulador.seek(manipulador.lenght());
// Todos os comandos write() a partir de agora escrevero dados
// no final do arquivo (append)

? Arquivos de acesso randmico so uma interessante forma de acesso a dados quando lidamos com
quantidades pequenas de informao (<5Mb), ou quando um sistema no justificar a compra e/ou
configurao de um banco de dados. Quando o acesso aleatrio a registros for muito freqente ou a
quantidade de registros for muito grande, o aconselhvel sempre o uso de um banco de dados.
Informaes detalhadas do uso de sistemas gerenciadores de banco de dados podem ser encontrados
facilmente na Internet, como no seguinte endereo :
http://developer.java.sun.com/developer/onlineTraining/Database/JDBC20Intro/JDBC20.html

Serializao de objetos
Um dos aspectos mais elegantes da linguagem Java a capacidade de serializao de objetos e a
transferncia desses objetos serializados atravs de Streams. A serializao de um objeto a gerao
de uma seqncia de bytes que representem o valor de seus membros. Uma vez que tenhamos
serializado um objeto, podemos grav-lo em um dispositivo de armazenamento, como um disco rgido ou
disquete nesse caso dizemos que o objeto serializado persistente.
Um objeto dito persistente quando ele pode ser salvo em algum dispositivo de armazenamento ou
transmitido entre processos computacionais, via rede de computadores.

O que so Grafos de Objetos?


Quando um objeo serializado, apenas os valores de seus dados so preservados mtodos de classe
e construtores no fazem parte da serializao. O processode de-serializao usar a definio da classe
como esquema de reconstruo do objeto na memria. Quando um dos membros de um objeto
serializvel for tambm um objeto, esse objeto ser igualmente serializado. Esse processo recursivo de
serializao gera um grafo, que representa os valores do objeto a serem persistidos.
Algumas classes de objetos no permitem a serializao de seus objetos, devido natureza dinmica
desses objetos. Por exemplo, objetos das classes FileInputStream, FileOutputStream e Threads no so
serializveis. Um objeto que contm uma referncia a um outro objeto no serializvel no pode ser
serializado, sob o risco de causar uma exceo do tipo: java.io.otSerializableException
.
Java prov um modificador especial para permitir que voc crie classes serializveis contendo
referncias a objetos no serializveis: a palavra-chave transient. Exemplo:
// Criando uma classe serializvel
public class Teste implements Serializable
{
// Esse membro ser ignorado no momento da serializao
transient private Thread relgio;
// Os modificadores private, protected e public no
// tem influncia na serializao
private string nome = "digital v1.0";

124

// .... restante da classe


}

// IMPORTANTE: membros estticos no so serializveis.


Escrevendo objetos serializados em um arquivo - para os exemplos sobre serializao utilizaremos
a classe Java.til.Date, que serializvel.
// O construtor vazio da classe Date assume a data e hora atuais
java.util.Date data = new Date();
File arquivo = new File("data.txt");
FileoutputStream saida = new FileoutputStream(arquivo);
ObjectOutputStream escritor = new ObjectOutputStream(saida);
// O processo de gravao e leitura de dados em arquivos sempre
// deve ser feito prevendo-se o tratamento de excees
try
{
escritor.write(data);
escritor.close();
}
Catch(IOException erro)
{
erro.printStackTrace();
}

Lendo objetos serializados de um arquivo


java.util.Date data = null;
File arquivo = new File("data.txt");
FileInputStream entrada = new FileInputStream(arquivo);
ObjectInputStream leitor = new ObjectInputStream(entrada);
// O processo de gravao e leitura de dados em arquivos sempre
// deve ser feito prevendo-se o tratamento de excees
try
{
// O casting sempre deve ser feito, porque o retorno
// de uma leitura via ObjectInputStream sempr
e
// um objeto da superclasse Object, que deve ser convertido
// conforme o tipo de dado utilizado
data = (Date)leitor.readObject();
leitor.close();
System.out.println("objeto lido: " + data);
}
Catch(IOException erro)
{
erro.printStackTrace();
}

125

Exerccios
14. Crie um aplicativo, com interface grfica, que lhe permita ler, criar ou modificar arquivos texto,
seqenciais e randmicos. Dica: d uma olhada na classe javax.swing.JfileChooser.
15. Modifique o seu trabalho 3, permitindo a gravao em disco do jogo como um objeto serializvel.
Faa com que o usurio possa armazenar o seu jogo em disco para poder continuar depois. No
esquea de incluir tambm o mtodo de recuperao desse objeto a leitura do disco.

126