Sunteți pe pagina 1din 108

MANUAL DE JAVA

ndice
INTRODUO......................................................................................5
ADQUIRINDO

SOFTWARE NECESSRIO, PLATAFORMAS SUPORTADAS......................................5

CARACTERSTICAS DA LINGUAGEM.................................................................................6

CLASSES

OBJECTOS...........................................................................9

ESPECIFICANDO

UMA

CLASSE.......................................................................................9

OBJECTOS EM JAVA................................................................................................10

POINTERS, REFERNCIAS E OBJECTOS...................................................35


OBTER VALORES

DO

ENCAPSULAMENTO
TIPO ABSTRATO

UTILIZADOR................................................................................40

COM

DE

PRIVATE, PUBLIC, PACKAGE

PROTECTED.........................................45

DADOS.......................................................................................58

HERANA........................................................................................73
HIERARQUIAS DE TIPOS...........................................................................................73
INTERFACES, UMA ALTERNATIVA PARA HERANA MLTIPLA..................................................82

POLIMORFISMO, CLASSES ABSTRACTAS.................................................85


REDEFINIO DE MTODOS PARA UMA CLASSE HERDEIRA..................................................85
SOBRECARGA ( MTODOS E OPERADORES)....................................................................85
CLASSES ABSTRACTAS E CONCRECTAS..........................................................................88

CONCEITOS AVANADOS.....................................................................99
ATRIBUTOS STATIC.................................................................................................99
MTODOS STATIC................................................................................................100
TRATAMENTO DE EXCEPES....................................................................................101
THREADS...........................................................................................................105

Manual de Curso

Pgina 3

MANUAL DE JAVA
INTRODUO
A maioria dos leitores fica ansiosa para aprender como criar aplicaes para a Internet,
mas depois de satisfeita esta ansiedade voltam para o ponto onde aprendem como
programar na linguagem e no apenas experimentar com a criao de botes, caixas de
dilogo, imagens, etc. Se esse o seu caso, recomendvel um tour pela WWW
antes de comear a programar, um bom site para comear a pesquisar com um
browser compatvel com Java (Netscape Navigator 2.0 ou superior) :
http://www.Javasoft.com/applets
Links para vrios applets, divididos por categorias: games, sound, busines,
animation... Divirta-se...
APPLETS : So pequenos programas escritos em Java que podem ser embebidos em
documentos hipertextos. So exemplos de applets: animaes, imagens, botes, etc.
Applets podem suportar efeitos de multimdia como sons, iteraes com o utilizador
(rato, teclado), imagens, animaes, grficos, etc.
Ao longo do texto, perceber que Java excelente para desenvolver aplicaes
comerciais e para ser utilizada em universidades. Java pode ser vista como uma fuso
de vrias tecnologias que vm sendo desenvolvidas na rea de computao, de modo
que estudantes dessa linguagem tem a oportunidade de tomar contacto com vrios
tpicos recentes: programao concorrente, sistemas distribudos, orientao de
objectos, protocolos da Internet, e uma srie de outros assuntos fceis de praticar
nessa linguagem.

ADQUIRINDO
SUPORTADAS

SOFTWARE

NECESSRIO,

PLATAFORMAS

Um ambiente de programao Java normalmente composto por um kit de


desenvolvimento de aplicaes Java e um browser compatvel com esta linguagem
(recomendvel). Se no tem acesso a esse ambiente de programao, tente estes
endereos:
http:// Java.sun.com
Raiz do hipertexto montado pelos criadores da linguagem. Sob este endereo pode
obter o compilador e outras ferramentas de desenvolvimento de aplicaes Java para
a sua plataforma de programao. Fique atento! Outros programadores esto a criar
ambientes de programao Java.
http://www.netscape.com
Raiz do hipertexto montado pelos criadores do Netscape Navigator . Sob este
endereo pode obter o browser Java compatible da Netscape Comunications
INC.. Outros programadores esto a lanar browsers compatveis com Java.
http://www.microsoft.com
A microsoft
licenciou a tecnologia Java e a incorporou em seu novo browser:
Internet Explorer verso 3.0 ou superior.
BROWSERS: So uma categoria de programas que permitem
visualizar um
documento criado em um certo padro, no caso html (hipertext markup language).
Atualmente os browsers tem se tornado complexos devido a quantidade de padres
existentes (ex. imagens .gif .jpg, etc). A linguagem Java pode contribuir para

MANUAL DE JAVA
minimizar esta complexidade.

CARACTERSTICAS DA LINGUAGEM
Parecida com C, C++
Java tem a aparncia de C ou de C++, embora a filosofia da linguagem seja diferente.
O leitor que programa em qualquer uma delas, ou em uma linguagem orientada por
objectos, sentir-se- mais a vontade e tornar-se- um bom programador em Java.
Java tambm possui caractersticas herdadas de muitas outras linguagens de
programao: Objective- C, Smalltalk, Eiffel, Modula-3, etc. Muitas das caractersticas
desta linguagem no so totalmente novas. Java uma feliz unio de tecnologias
testadas por vrios centros de pesquisa e desenvolvimento de software.
Compilada
Um programa em Java compilado para o chamado byte-code, que prximo das
instrues de mquina, mas no de uma mquina real. O byte-code um cdigo de
uma mquina virtual idealizada pelos criadores da linguagem. Por isso Java pode ser
mais rpida do que se fosse simplesmente interpretada.
Porttil
Java foi criada para ser porttil. O byte-code gerado pelo compilador para a sua
aplicao especfica pode ser transportado entre plataformas distintas que suportam
Java (Solaris 2.3 , Windows-NT , Windows-95 , Mac/Os etc). No necessrio
recompilar um programa para que ele rode numa mquina e sistema operativo
diferente, ao contrrio do que acontece por exemplo com programas escritos em C e
outras linguagens.
Esta portabilidade importante para a criao de aplicaes para a heterognea
Internet. Muitos dos programas exemplo deste manual foram escritos e compilados
numa plataforma Windows-95 e trabalharam perfeitamente quando simplesmente
copiados para uma plataforma Solaris 2.3 . Em Java um inteiro por exemplo, tem
sempre 32 bits, independentemente da arquitectura. O prprio compilador Java
escrito em Java, de modo que ele porttil para qualquer sistema que possua o
interpretador de byte-codes. Um exemplo de programa escrito em Java o browser
hotjava.
Orientada por objectos
A portabilidade uma das caractersticas que se inclui nos objectivos de uma
linguagem orientada por objectos. Em Java ela foi obtida de maneira inovadora em
relao ao grupo actual de linguagens orientadas por objectos.
Java suporta a herana, mas no a herana mltipla. A ausncia de herana mltipla
pode ser compensada pelo uso de herana e interfaces, onde uma classe herda o
comportamento de sua superclasse, alm de oferecer uma implementao para uma ou
mais interfaces.
Java permite a criao de classes abstractas. Outra caracterstica importante em
linguagens orientadas por objectos a segurana.

Segura
A presena da recolha automtica de lixo, evita erros comuns que os programadores
cometem quando so obrigados a trabalhar directamente na memria ( C , C++,
Pascal). A eliminao do uso de ponteiros, em favor do uso de vectores, objectos e
outras estruturas, traz benefcios em termos de segurana. O programador no tem
acesso memria que no pertena ao seu programa e torna-se impossvel cometer
erros comuns tais como reference aliasing ou o uso indevido de aritmtica de
Pgina 6

Manual de Curso

MANUAL DE JAVA
ponteiros. Estas medidas so particularmente teis quando pensamos em aplicaes
comerciais desenvolvidas para a Internet.
Ser strongly typed tambm uma vantagem em termos de segurana, que est
aliada eliminao de converses implcitas do tipo C++.
A presena de mecanismos de tratamento de excepes torna as aplicaes mais
robustas, no permitindo que elas abortem, mesmo quando executadas sob condies
anormais. O tratamento de excepes til para modelar situaes como falhas de
transmisso ou formatos incompatveis de ficheiros.
Suporta concorrncia
A linguagem permite a criao de maneira fcil, de vrios threads de execuo. Este
tpico ser til quando
estudar animaes, e particularmente poderoso nos
ambientes em que aplicaes Java so suportadas, ambientes estes que geralmente
podem mapear os threads da linguagem em processamento paralelo real.
Eficiente
Como Java foi criada para ser utilizada em computadores pequenos, ela exige pouco
espao e pouca memria. Java muito mais eficiente que grande parte das linguagens
de scripting existentes, embora seja cerca de 20 vezes mais lenta do que C. Com a
evoluo da linguagem, sero criados compiladores de byte-codes cada vez mais
optimizados que traro as marcas de performance da linguagem mais prximas das de
C++ e C. Alm disso um dia Java permitir a possibilidade de gerar cdigo executvel
de uma particular arquitectura on the fly, tudo a partir do byte-code.
Suporte para programao de sistemas distribudos
Java fornece facilidades para programao com sockets, remote method call, tcp-ip,
etc.

Manual de Curso

Pgina 7

MANUAL DE JAVA
CLASSES E OBJECTOS
Uma classe um tipo definido pelo utilizador que contm a especificao para os
objectos. A classe envolve e associa funes e dados, controlando o acesso a estes,
defini-la implica especificar os seus atributos (dados) e seus mtodos (funes).
Um programa que utiliza uma interface que controla um motor elctrico provavelmente
definiria a classe motor. Os atributos desta classe seriam: temperatura, velocidade e
tenso aplicada. Estes provavelmente seriam representados na classe por tipos como int
ou float. Os mtodos desta classe seriam funes para alterar a velocidade, ler a
temperatura, etc.
Um programa editor de textos definiria a classe pargrafo que teria como um de seus
atributos uma String ou um vector de Strings, e como mtodos, funes que operam
sobre estas strings. Quando um novo pargrafo digitado no texto, o editor cria a
partir da classe Pargrafo um objecto contendo as informaes particulares do novo
texto. Isto designa-se por instanciao ou criao do objecto.

ESPECIFICANDO

UMA

CLASSE

Suponha um programa que controla um motor elctrico atravs de uma sada srie. A
velocidade do motor proporcional tenso aplicada e esta proporcional aos bits que
vo para sada srie e passam por um conversor digital analgico.
Vamos abstrair de todos os detalhes por enquanto e modelar somente a interface do
motor como uma classe, a pergunta que mtodos e que atributos dever ter a classe,
que argumentos e valores de retorno devero ter os mtodos?
Representao da velocidade
A velocidade do motor ser representada por um atributo inteiro (int). Usaremos a faixa
de bits que precisarmos, caso o valor de bits necessrio no possa ser fornecido pelo
tipo, usaremos ento o tipo long, isto depende do conversor digital analgico utilizado.
Representao da sada srie
O motor precisa conhecer a sua sada srie, a sua ligao com o motor do mundo
real. Suponha uma representao em hexadecimal do atributo endereo de porta
srie, um possvel nome para o atributo: enderecomotor. No se preocupe em saber como
utilizar a representao hexadecimal.
Alterao do valor da velocidade
Internamente o utilizador da classe motor pode desejar alterar a velocidade, cria-se
ento o mtodo: public void altera_velocidade(int novav);. O cdigo anterior corresponde ao
cabealho do mtodo, ele definido junto com a classe motor, associado a ela. O valor
de retorno da funo que implementa o mtodo void, poderia ser criado um valor de
retorno (boolean) que indicasse se o valor de velocidade era permitido e foi alterado ou
no era permitido e portanto no foi alterado.
No faz sentido utilizar, este mtodo separado de uma varivel do tipo motor, mas
ento porque que, na lista de argumentos da funo, no se encontra um motor? Este
pensamento reflecte a maneira de associar dados e cdigo (funes) das linguagens
processuais. Em linguagens orientadas por objectos o cdigo e os dados so ligados de
forma diferente, a prpria declarao de um tipo definido pelo utilizador j engloba as
declaraes das funes inerentes a este tipo. O objecto ao qual aplicado o mtodo
passado de outra forma.

MANUAL DE JAVA
Note que no fornecemos o cdigo do mtodo, isto no importante, a preocupao
com a interface definida pela classe: seus cabealhos de mtodos e atributos. Apenas
pense que sua interface deve ser flexvel de modo a no apresentar entraves para a
criao do cdigo que seria feita numa outra etapa. Nesta etapa teramos que imaginar
que o valor numrico da velocidade deve ir para o conversor onde ir se transformar
numa diferena de potencial a ser aplicada nos terminais do motor, etc.
Um diagrama simplificado da classe motor com os atributos e mtodos:

Exerccios
Lembre-se de algum programa em que trabalhou, cite que tipos de classes seriam
criadas se esse programa fosse escrito em Java, que atributos e que mtodos estariam
associados a esses objectos?
Exemplo: Eu trabalhei em um programa de contas a pagar e contas a receber. Se
esse programa fosse escrito em Java eu definiria a classe conta_bancaria. Os atributos
seriam: saldo, taxa_de_juros, limite_de_saque, etc. Minha opo seria por represent-los
como variveis do tipo double (no se preocupe em utilizar os tipos da linguagem inda ).
Entre os mtodos desta classe estariam funes para efectuar saques, depsitos e
juros.

OBJECTOS EM JAVA
Objectos so instncias de uma classe. Quando um objecto criado necessita de ser
inicializado, ou seja, para uma nica classe de nome EstudanteDeGraduacao, podemos ter
vrios objectos durante a execuo de um programa.
Estudante de graduao Andre; Identificao 940718; Curso Informatica | Estudante de
graduao Luiza , Identificao 893249, Curso Medicina... A classe representa somente o
molde para a criao dos objectos, estes sim contm informao.
O atributo Identificao tem valor 940718 para a instncia (objecto) Andr da classe
Estudantes de Graduao.
INSTNCIAS: Um objecto existente durante um momento da execuo de um
programa uma instancia de uma classe.
Uma classe e suas instancias:

Cada estudante (ou instancia) poderia ser


modelado, desenhado como:

Objectos podem conter objectos, ou seja, os atributos de um objecto podem ser


objectos, da mesma classe ou no. Objectos podem ser passados pela rede,
Pgina 10
Manual de Curso

MANUAL DE JAVA
armazenados em um ambiente fsico. Objectos possuem um estado e um
comportamento. Mtodos podem receber objectos como argumentos, podem declarar
objectos como variveis locais, podem executar outros mtodos. Pode executar um
mtodo (mandar uma mensagem) para colocar objectos em outras mquinas atravs
de sua rede.
Um objecto pode ser visto como um RECORD, s que com uma tabela de funes que
podem ser executadas para ele. Na verdade esta definio no muito terica, mas
um bom comeo para os programadores que esto habituados com linguagens
processuais. Na verdade podemos fazer com objectos muito mais do que fazemos com
records e procedimentos em Pascal.
Em Java, ao contrrio de C++ e Modula-3, no existem funes desvinculadas de
classes, funes isoladas. Isto implica que todo trecho de cdigo que for escrito deve
pertencer a uma classe, mais precisamente deve ser um mtodo desta. O programa
mais simples em Java deve conter pelo menos uma classe e um mtodo de incio de
programa, e este programa que faremos agora.
Esta filosofia simples e semelhante a adoptada em Eiffel, tudo o que se pode fazer
com procedimentos, funes isoladas e variveis de procedimentos, tambm se pode
fazer com classes e mtodos. C++ tinha que permitir a criao de funes isoladas
para manter a compatibilidade com C, mas Java no. Quando neste texto usarmos o
termo funo no lugar de mtodos estaremos mais interessados em enfatizar a parte
de implementao em detrimento da interface, pensar que em Java toda funo
implementa um mtodo de uma classe.
O leitor no habituado com o paradigma de orientao por objectos, pode considerar
estranhas as afirmaes acima, e a pergunta mais comum neste momento : Mas
ento como sabe aonde vai comear o programa?. Antes da resposta a essa pergunta,
leia o primeiro programa exemplo.

PROGRAMA HELLO INTERNET!


Este exemplo visa apresentar um programa simples para imprimir uma mensagem no
ecr, este provavelmente ser seu primeiro programa em Java.
Compilando um primeiro programa:
1-Certifique-se que adicionou a sua
lista de paths ao path do compilador
e interpretador Java.

Cdigo:
//Comentario de uma linha
public class HelloInternet {

2-Crie o ficheiro ao lado em um


directrio e guarde com o nome:
HelloInternet.Java

public static void main (String args[])


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

3-execute o compilador Java para


este ficheiro: Javac HelloInternet.Java
4-Seu directrio deve ter recebido
um
novo
ficheiro
aps
essa
compilao: HelloInternet.class

}
}

5-Chame o interpretador Java para


este ficheiro (omita a extenso .class
de ficheiro): Java HelloInternet
Manual de Curso

Pgina 11

MANUAL DE JAVA
6-Observe o resultado no ecr: Hello
Internet!

Hello Internet!

Explicao passo a passo do programa exemplo


//Comentario de uma linha
Comentrios em Java seguem a mesma sintaxe de C++, // inicia uma linha de
comentrio, todo o restante da linha ignorado. Existe tambm um outro tipo de
comentrio formado por /* Insira aqui o texto a ser ignorado */ , este tipo de comentrio
pode ser intercalado em uma linha de cdigo. Comentrios so tratados como
espaos em branco.
public class HelloInternet {
class a palavra reservada que marca o incio da declarao de uma classe. Public
o que especfica, por enquanto guarde public class como o incio da declarao de
uma classe. Toda classes sero declaradas deste modo, at o tpico Encapsulamento
De Atributos E Mtodos Com PackagesEncapsulamento De Classes Com Packages.
HelloInternet
o nome dado a esta classe. O abre chaves marca o incio das declaraes da
classe que so os atributos e mtodos. Esta classe s possui uma declarao, a do
mtodo main, note que um mtodo, ao contrrio de C++, s pode ser declarado
{internamente} a classe a qual pertence, evitando as confuses sobre escopo.
Desta forma, todo pedao de cdigo em Java deve pertencer ao abre chaves, fecha
chaves da definio de uma classe.
public static void main (String args[]) {
System.out.println("Hello Internet!");
}
public
o qualificador do mtodo que indica que este acessvel externamente a esta
classe (para outras classes que eventualmente seriam criadas), no se preocupe
com ele agora, apenas declare todos os mtodos como public.
static
um outro qualificador ou specifier, que indica que o mtodo deve ser
compartilhado por todos os objectos que so criados a partir desta classe. Os
mtodos static podem ser invocados, mesmo quando no foi criado nenhum objecto
para a classe, para tal deve-se seguir a sintaxe:
<NomeClasse>.<NomemetodoStatic>(argumentos);. o mtodo main precisa dessa
qualificao porque executado sem que se crie nenhum objecto de sua classe (a
classe HelloInternet).

Curiosidade
Pgina 12

Manual de Curso

MANUAL DE JAVA
Se gosta de paradoxos e j conhece um pouco de orientao por objectos, pense que
se o mtodo main tivesse que ser executado para um objecto (o que no o caso) este
objecto teria que ter sido criado em algum outro lugar ento este lugar seria o incio do
programa e main deixaria de ter esta finalidade.
A linguagem de programao Eiffel adopta uma tcnica diferente para resolver este
problema: todo programa comea com a criao de um objecto, este objecto chamado
ROOT, ele pode conter atributos que so inicializados e um mtodo de inicializao,
construtor do objecto, que o incio do cdigo do programa.

Manual de Curso

Pgina 13

MANUAL DE JAVA
void
Semelhante ao void C++ ou C, o valor de retorno da funo, quando a funo no
retorna nenhum valor ela retorna void, uma espcie de valor vazio que tem que ser
especificado.
main
Este um nome particular de mtodo que indica ao compilador o incio do
programa, dentro deste mtodo e atravs das iteraes entre os atributos,
variveis e argumentos visveis que o programa se desenvolve.
(String args[])
o argumento de main e por consequncia do programa todo, ele um vector de
Strings que formado quando so passados ou no argumentos atravs da
invocao do nome do programa na linha de comando do sistema operacional,
exemplo:

Java HelloInternet argumentotexto1 argumentotexto2


No nosso caso, ignoramos a possvel passagem de argumentos via linha de
comando.

...

Abre chaves e fecha chaves. Para quem no conhece C ou C++, eles podem ser
entendidos como algo semelhante ao BEGIN END de Pascal ou Modula-3, ou seja:
delimitam um bloco de cdigo. Os programadores de Pascal notaro que variveis
locais dos mtodos podem ser declaradas em qualquer local entre as chaves. Mas
por motivos de clareza do cdigo declararemos todas no incio do abre chaves.

System.out.println("Hello Internet!");
Chamada do mtodo println para o atributo out da classe ou objecto System, o
argumento uma constante do tipo String. println assim como writeln de Pascal,
imprime a String e posiciona o cursor na linha abaixo , analogamente print no
avana linha. Pode guardar esta linha de cdigo como o comando para imprimir
mensagens no ecr, onde o argumento que vem entre aspas a String a ser
impressa. O ; ponto e vrgula separa operaes.

Finalmente o fecha chaves termina com a declarao da classe HelloInternet.

Concluso
Normalmente o volume de conceitos presentes num primeiro programa de uma
linguagem orientada por objectos como Java ou Eiffel grande se comparado com o de
um primeiro programa em C ou Pascal. Esses conceitos ainda sero aprofundados e so
citados aqui apenas por curiosidade, normal que no tenha entendido tudo.
De agora em diante no explicaremos mais como compilar os programas.

Exerccios
Experimente fazer modificaes no programa HelloInternet. Imprima outras mensagens
no ecr, adicione comentrios.

Pgina 14

Manual de Curso

MANUAL DE JAVA

ATRIBUTOS
No programa anterior, no observamos a criao de nenhum objecto, apenas a
declarao da classe HelloInternet que continha o mtodo main. O nosso programa
funcionou, porque o mtodo main no precisa de um objecto especfico para ser
invocado.
Este exemplo declara uma classe (Circulo) e em seguida cria um objecto deste tipo em
main e altera o contedo desta varivel. Uma classe parecida com um record de
Pascal, a nossa
representa um crculo com os atributos raio e x , y, que so
coordenadas cartesianas. Note que este objecto no possui mtodos ainda.
A classe crculo especificada em um ficheiro separado do ficheiro da classe que
contm o mtodo main (incio do programa), um ficheiro neste texto representado
pelo rectngulo envolvendo um trecho de cdigo, at o tpico Encapsulamento De
Classes Com Packages cada classe ser especificada em um ficheiro.
importante entender este exemplo, quando estudar interfaces grficas, poder
utilizar a classe crculo predefinida na linguagem para desenhar crculos que se movem
no ecr. Embora no tenhamos explicado com detalhes os tipos bsicos da linguagem,
usaremos neste exemplo o tipo float (real), e nas explicaes o tipo String e o tipo int
(inteiro).
Cdigo:
//Classe circulo, ficheiro Circulo.Java
public class Circulo {
//so atributos entre as chaves
public float raio;
//atributo raio do circulo
public float x;
//posicoes em coordenadas cartesianas
public float y;
}
//Classe principal, Ficheiro Principal.Java
public class Principal {
public static void main(String args[]) {
Circulo umcirc; //declaracao de uma variavel circulo no metodo main.
umcirc=new Circulo(); //alocacao dessa variavel
System.out.println("("+umcirc.x+","+umcirc.y+","+umcirc.raio+")");
umcirc.x=umcirc.x+17;
System.out.println("("+umcirc.x+","+umcirc.y+","+umcirc.raio+")");
}

}
Resultado no ecr:

Manual de Curso

(0,0,0)
(17,0,0)

Pgina 15

MANUAL DE JAVA
Porque os matemticos no gostam de C, C++, Java e Basic
A declarao umcirc.x=umcirc.x+17 presente em nosso programa deixa os matemticos
doidos pois de subtrair umcirc.x de cada um dos lados da igualdade a expresso se
torna 0=17. Ocorre que = no o operador de teste de igualdade e sim de atribuio,
ele tem a mesma funo do := de Pascal a qual os matemticos adoram. O operador de
teste de igualdade em Java : ==

Mais sobre ficheiros


Como pode ser observado, cada ficheiro texto do programa est envolvido em uma
moldura rectangular. Neste caso as duas classes criadas: Circulo e Principal, esto em
ficheiros separados. A sequncia de alteraes em seu directrio ou folder :
Incio:

Aps Javac AsDuasJuntas.Java:

O compilador deve ser executado para ambos ficheiros. Ou pode utilizar os chamados
wildcards javac *.Java.

Sem Includes
Se j programa em alguma outra linguagem provavelmente deve estar com a seguinte
dvida: Vocs usaram o nome da classe Circulo na classe Principal, ambas esto em
ficheiros separados, como que o compilador sabe em que directrio est a classe
Circulo? No preciso fazer uma espcie de include para poder utilizar a classe Circulo
em outro ficheiro?
A resposta no. O compilador sabe localizar se ela estiver sob o directrio do seu
programa. Se tiver que deixar esta classe em outro directrio ento ela deve fazer
parte de um package e ter que importar esse package.

Classe Circulo e declarao de atributos


O primeiro ficheiro deste exemplo contm o cdigo da classe Circulo, esta classe contm
trs atributos . A declarao de atributos segue sintaxe semelhante a de C++ (havero
acrscimos a esta sintaxe):
EspecificadorModoAcesso NomeTipo NomeAtributo;
public float raio;
public float x;
public float y;
Todos os atributos pertencentes a classe so do tipo float (Ponto flutuante 32-bit
IEEE754, veja tabela de tipos bsicos). Esto especificados como public o que significa
que podem ser modificados a partir de uma classe que usa um objecto Circulo seja
como varivel de mtodo ou como atributo (este tipo de modificao ser exemplificado
na classe Principal).
Pgina 16

Manual de Curso

MANUAL DE JAVA
Como exemplo de declarao de variveis simples:
a declarao de uma varivel Circulo no mtodo main. Seguida de sua alocao:
umcirc=new Circulo();
//alocacao dessa variavel. Sem a alocao a varivel no
pode ser utilizada. Note que os atributos so por default inicializados para zero.

Classe Principal declarao e inicializao de atributos


A classe Principal no possui atributos, porque nenhum objecto desta classe criado,
apenas seu mtodo main chamado. O mtodo main declara uma referncia para
objecto da classe Circulo: Circulo umcirc;. Note que diferentemente de C++ no so
necessrios includes ou header files para poder declarar essa varivel de um tipo
definido pelo utilizador e existente em outro ficheiro.
Antes da referncia ao objecto ser utilizada, este precisa ser alocado na memria, o
que feito atravs de umcirc=new Circulo();. Se tivesse declarado um objecto da classe
String, j definida na linguagem, e depois fizesse sua alocao, o cdigo seria
semelhante ao seguinte:
String umastring;
umastring=new String(Valor inicial);
A diferena com a alocao do objecto Circulo que entre os parnteses incluem um
argumento Valor inicial, isto ocorre porque a linguagem permite que aproveite a
alocao de um objecto para inicializar alguns de seus atributos. Neste nosso programa,
os atributos contidos na rea de memria alocada por new, so alterados de outra
forma.

Recolha automtica de lixo


A desalocao do objecto feita pela linguagem, (automatic garbage collection), no
precisa se preocupar com ela. Aps o fecha chaves de main, a memria do objecto
umcirc j pode ser libertada, o que normalmente no ocorre de imediato, pois o
ambiente da linguagem executa um tread em baixa prioridade que liberta de tempos
em tempos os espaos no utilizados da memria, tirando proveito por exemplo de
eventuais pausas de iterao do utilizador com o programa.

Acesso aos atributos e mtodos e alteraes dos atributos


O acesso aos atributos da varivel (objecto) umcirc deve ser feito usando o nome do
objecto e o nome do atributo deste, separados por um ponto: umcirc.raio=10.0; . Note
que raio sozinho no faz sentido no programa, precisa-se especificar de que objecto se
deseja alterar ou obter o raio.
A sintaxe de chamadas de mtodos semelhante a sintaxe descrita acima, s que ao
envs de nome do atributo temos o nome do mtodo seguido dos parnteses que
podem conter zero ou mais argumentos. Volte ao primeiro programa (HelloInternet) e
verifique a declarao do mtodo main, onde chamamos o mtodo println() para o objecto
System.out .

Imprimindo variveis do tipo float e inteiro (int) no ecr:


System.out.println("("+umcirc.x+","+umcirc.y+","+umcirc.raio+")");
O argumento de println que conhecemos uma nica varivel do tipo String, no entanto
o cdigo acima mistura nos argumentos desse mtodo os seguintes elementos: Strings:
Manual de Curso
Pgina 17

MANUAL DE JAVA
(, operadores : +, e variveis float: umcirc.y. Fica muito fcil de entender porque isto
funciona se pensar que + tambm operador de concatenao de Strings e que os
argumentos int ou float e de outros tipos bsicos desse mtodo so convertidos para
Strings.

Importante aos que no programam em C ou C++, os operadores = e ==:


Em Java, C, e C++ o operador = (igual) tem a funo de atribuio e o operador ==
(igual igual) tem a funo de comparao entre valores, retornando o valor booleano
verdadeiro se estes valores forem idnticos. Alguns podem no achar esta escolha de
operadores sensata, principalmente os matemticos, mas com um pouco de uso da
linguagem ela se tornar automtica.
Curiosidade (s para programadores C e C++), eliminao do problema que
ocorre em C e C++ com os operadores = e == :
Em C, C++ e tambm em Java permitido escrever:
int i,j,k;
i=0;
j=k=i+3; //final, j vale 3, k vale 3 e i continua valendo 0
Essas atribuies em cadeia permitem escrever cdigo mais compacto, elas fazem
sentido porque atribuies nessas linguagens possuem valores, assim k=i+3; no final
tem o valor de k que igual a i+3. O valor de j=... .no nosso exemplo descartado,
ignorado pois no h nada a esquerda desta atribuio. Em C e C++ existe um
problema grave que frequentemente uma cilada para os programadores Pascal e
outros.
O problema que nessas duas linguagens ( C e C++) no existe o tipo boolean, no
lugar deste tipo utilizado o tipo int (inteiro), onde 1 significa verdadeiro e 0 falso.
Assim em C e C++ (mas no em Java) a==a tem valor 1 com o significado dado pelo
programador de true ou verdadeiro, mas a=1+0; tambm tem como resultado o
valor 1, mas agora com o significado inteiro, numrico. O compilador no sabe
distinguir entre os significados numrico e booleano.
Essa ambiguidade faz com que programadores ( C ou C++) no acostumados com esta
conveno de operadores = e ==, incorram no erro de escrever j=1 quando na verdade
queriam dizer j==1, mas para o compilador ambas as expresses tem valor inteiro de
modo que se esse engano ocorrer num teste de parada de um loop, pode ocorrer que
ele nunca pare, pois 1 tem o mesmo valor de true.
Java elimina este tipo de erro introduzindo o tipo boolean com os valores true e false, que
no tem nenhuma relao com o tipo int e qualquer outros tipos.

Tipos bsicos E CONSTANTES OU VALORES LITERAIS


(para nossa sorte os tipos bsicos so os mesmos para qualquer ambiente de
programao Java, porque a linguagem porttil):
char

Caractere UNICODE 16-bit

O tipo char (caractere UNICODE) representado com 16-bits sem sinal, o que permite
enderear de 0 a 65535. O objectivo desta opo permitir a internacionalizao da
linguagem, bem como a padronizao. Constantes do tipo caractere aparecem entre
apstrofes: a, 1, $.
Pgina 18

Manual de Curso

MANUAL DE JAVA
Tabela de caracteres especiais
(ao contrrio de C/C++, no existe um caractere especial para o som de beep ou bell )
Representao visual:
Funo, significado:
\n
Pula linha, linefeed
\r
Retorno de carro
\b
Backspace
\t
Tabulao
\f
Formfeed
\
Apstrofe
\
Aspas
\\
Barra inversa
\u223d
Caractere unicode
\gfa
Octal
\fff
Hexadecimal

boolean

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


outros tipos.

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

byte
short
int
long

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


Inteiro 16-bit, complemento de 2, faixa:-32768 at 32767
Inteiro 32-bit, complemento de 2, faixa:-2147483648 at 2147483647
Inteiro 64-bit, compl. de 2, faixa:-9223372036854775808 at
9223372036854775807

No existem especificadores de tipos como unsigned, todos os tipos inteiros tem


sinal. Valores literais: O que v nem sempre o que tem: Um valor como 299792458
considerado int como padro, se quer atribuir esta constante a um long, faa o type
cast explicitamente:
long a;
a=(long)299792458; //a recebe PI
Ou ento use uma terminao em L para indicar que o nmero deve ser representado
como long:
long a=299792458L; //ou L minusculo
Para indicar valores octais anteceda-os com um zero: 0444 , j para valores
hexadecimais anteceda-os com 0X ou 0x, exemplo: 0xBCD4
float
double

Manual de Curso

Ponto flutuante 32-bit IEEE754


Ponto flutuante 64-bit IEEE754

Pgina 19

MANUAL DE JAVA
Um valor como 3.14159265 considerado double como padro, se
constante a um float, faa o type cast explicitamente:
float a;
a=(float)3.14159265; //a recebe PI

quer atribuir esta

Ou ento utilizar uma terminao em f para indicar que o nmero deve ser
representado como float:
float a=3.14159265f //ou F maiusculo
Expoentes podem ser escritos usando o caracter e ou E: 6,02E23 ou 1.380658e-23 . Onde
e-1, significa multiplicado por dez elevado a menos 1 ou *0.1. O separador de casas
decimais o ponto.
Apesar de todas estas regras para uso de valores literais, quando dois nmeros de tipo
diferentes como double e int so usados em um clculo do lado direito de uma
atribuio, no precisa fazer o type cast desses valores. O compilador promove o
nmero do tipo mais fraco para o tipo mais forte antes de fazer o clculo. Pode desejar
fazer o type cast do resultado, para atribuir a uma varivel long por exemplo.

Exerccios
Repita o mesmo exemplo s que agora mova o crculo alterando as componentes
x e y. Coloque o crculo na posio (1.0,1.0), atravs de atribuies do tipo
acirc.x=1.0; . Acompanhe todas as modificaes do objecto imprimindo seus
atributos no ecr.
Simplifique o programa anterior retirando o atributo raio. Pode dar o nome de
Ponto ou Ponto_geometrico para esta classe. No se esquea de compilar, use o
compilador como ferramenta para verificar se aprendeu correctamente a sintaxe
da linguagem.
Rescreva a classe Circulo para trabalhar com atributos do tipo int.

ATRIBUTOS E MTODOS
Os mtodos determinam o comportamento dos objectos de um classe. Quando um
mtodo invocado, se diz que o objecto est recebendo uma mensagem (para
executar uma aco). Programas complexos formam conjuntos de objectos que trocam
mensagens entre si criando, inclusive, os recursos do sistema.
O programa a seguir exemplifica a execuo de mtodos, para tal define um objecto
que serve como contador, a implementao representa a contagem no atributo num que
um nmero inteiro. Os mtodos so simples: incrementa adiciona um ao contador em
qualquer estado e comeca inicializa a contagem em zero. Decrementa faz o oposto de
incrementa.

Pgina 20

Manual de Curso

MANUAL DE JAVA

Cdigo
//Classe Contador, ficheiro Contador.Java
public class Contador {
public int num; //este o atributo
//numero do contador
public void incrementa()
//incrementa contador
{
num=num+1; //acesso ao atributo
}
public void decrementa()
//decrementa contador
{
num=num-1;
}
public void comeca(int n)
//comeca a contar
{
num=n;
}
}
//Classe principal, Ficheiro Princ.Java
public class Principal {
public static void main(String args[]) {
Contador umcont;
//declaracao de atributo contador
umcont=new Contador();
//alocacao
umcont.comeca(0);
System.out.println(umcont.num);
umcont.incrementa();
System.out.println(umcont.num);
}
}
Resultado no ecr:

Manual de Curso

0
1

Pgina 21

MANUAL DE JAVA
Exerccios
Defina um mtodo chamado mostra para a classe contador. Este mtodo deve
imprimir o estado do contador no ecr. A implementao deste mtodo depende
de onde est imprimindo o estado do contador? Pense em programas de
interfaces grficas e de linha de comando.
Crie uma classe contador cclico, exemplo o contador de minutos de relgios
digitais: 0,1,2,...,57,58,59,0,1,2,... . A operao modulo ou resto da diviso
inteira, tem sintaxe semelhante a de C++: a % b==a-((int)a/b)*b. No tente utilizar
a estrutura de deciso if ainda.

Mquinas de estados
Olhando para o desenho contido no canto direito superior do ficheiro da Classe
contador, consegue imaginar este contador como uma mquina de estado? O uso de
objectos como mquinas de estados um dos conceitos que exemplificaremos deste
texto.

Sintaxe de declarao de mtodos


A sintaxe simplificada para a declarao de mtodos de uma classe :
especificadordeacesso tipoderetorno nomedometodo(lista_de_argumentos) { /*codigo */ }.
Uma diferena do uso de funes comuns em linguagens no orientadas por objectos e
do uso de mtodos que como o mtodo est definido na classe, ele ganha acesso
directo aos atributos, sem precisar utilizar o ponto, exemplo um_objecto.atributo;.
Lembre-se que as chamadas de mtodos em um programa j se referem a um objecto
especfico, embora os mtodos sejam definidos de uma forma geral e parametrizada
para toda a classe. Volte agora ao mtodo main e verifique sua sintaxe.

This
this uma palavra chave utilizada num mtodo como referncia para o objecto
corrente, ela tem o significado de: o objecto para o qual este trecho de cdigo est
sendo executado.
Suponha uma classe que possui a seguinte declarao de atributo: public int qualquer; .
Se quisermos em um mtodo desta classe alterar o atributo qualquer para o valor 3,
basta escrever qualquer=3; , mas este cdigo escrito dentro de um mtodo da classe que
declara qualquer, totalmente equivalente a this.qualquer=3; , sendo o ltimo uma opo
mais clara e capaz de eliminar ambiguidades entre os nomes dos atributos de uma
classe e os nomes dos argumentos de um dos mtodos desta (quando estes nomes
forem iguais). O uso de this tambm vlido fazer para chamadas de mtodos para o
objecto corrente.
Sintaxe de chamada ou acesso a mtodos
A sintaxe de chamada ou acesso mtodos semelhante a sintaxe de acesso aos
atributos, com excepo dos parnteses que contm a lista de argumentos da funo
que implementa o mtodo, mesmo que a lista seja vazia eles devem estar presentes:
umcontador.incrementa();. Primeiro insere-se o nome do objecto e depois a chamada da
funo, estes so separados por um ponto. Cuidado para no esquecer os parnteses
em programas futuros, este um erro bastante comum.
Pgina 22

Manual de Curso

MANUAL DE JAVA
Mtodo move
O mtodo move altera as coordenadas do objecto. O objecto tem suas
y somadas com os argumentos dessa funo. Note que este mtodo
maneira mais segura, clara, elegante de alterar as coordenadas do
acess-las directamente da seguinte forma: ac.x+=dx;.
ac.y+=dy;.
ac.x+=dx uma abreviao para ac.x=ac.x+dx;.

coordenadas x e
representa uma
objecto do que
Lembre-se que

Mtodo mostra
O mtodo mostra imprime no ecr, de forma compacta, os atributos do objecto.
Cdigo:
//Classe circulo
public class Circulo {
public float raio;
public float x;
//posicoes em coordenadas cartesianas
public float y;
public void move(float dx,float dy)
//move o circulo de lugar
{
this.x+=dx;
y+=dy;
}
public void mostra()
//imprime no ecr estado do objecto
{
System.out.println("("+x+","+y+","+raio+")");
}
} //fim da declaracao da classe
//Classe principal, Ficheiro Principal.Java
class Principal {
public static void main(String args[]) {
Circulo umcirc;
//declaracao de atributo circulo
umcirc=new Circulo();
umcirc.x=0;
umcirc.y=0;
umcirc.raio=12;
umcirc.mostra();
umcirc.move(10,10);
umcirc.mostra();
umcirc.x=100;
umcirc.mostra();
}
}

Manual de Curso

Pgina 23

MANUAL DE JAVA
Resultado no ecr:

(0,0,12)
(10,10,12)
(100,10,12)

Como funcionam no compilador as chamadas de mtodos


possvel imaginar que as definies de mtodos ocupam um grande espao na
representao interna dos objectos, mas lembre-se que elas so todas iguais para uma
classe ento basta manter para cada classe uma tabela de mtodos que consultada
no momento da chamada . Os objectos s precisam ter uma referncia para esta
tabela.

Exerccios
Faa as seguintes modificaes no programa HelloInternet:
Adicione a declarao e inicializao de varivel String logo aps o abre
chaves do mtodo main:
String nomequalquer;
nomequalquer=new String(Uma constante do tipo string);
Modifique o argumento de println para nomequalquer. No use aspas em
nomequalquer, temos uma varivel agora. Execute o programa, qual o
resultado?
No programa deste exemplo, crie um mtodo chamado inicializa para a classe
Circulo. Este mtodo deve ter como argumentos um valor para x, um para y e
outro para o raio, e deve alterar os atributos inicializando-os com os valores
passados. Pode abstrair o uso desse mtodo como uma maneira de inicializar o
objecto de uma s vez embora isto seja feito sequencialmente. Comente as
vantagens desta abordagem, comparando com as outras opes, tenha sempre
em mente a questo de segurana quando avaliar tcnicas diferentes de
programao.
No programa anterior, verifique que nada impede que aceda directamente os
valores de x , y e raio e os modifique, como alias foi feito nos exemplos
anteriores. Como se pode criar um nmero enorme de mtodos : altera_x(float a);
move_raio(float dr); seria desejvel que somente essas funes pudessem
modificar x, y e raio. Crie esses mtodos se preocupando em permitir atravs
chamadas a eles tudo o que for possvel fazer com acesso directo aos atributos.
Comente tambm as duas opes equivalentes de implementao abaixo (os
nomes so auto explicativos), tenha em mente o nmero de mtodos a serem
criados para garantir flexibilidade a classe:
umcirculo.multiplica_atributo_x(10);
ou
umcirculo.altera_atributo_x(umcirculo.retorna_atributo_x()*10);
//chamadas aninhadas de metodos
//o resultado de uma chamada compoe o argumento da outra
Teste o mtodo move com argumentos negativos, exemplo ac.move(-1.0,-1.5);. O
resultado coerente?
H tendncia em definir o maior nmero de mtodos numa classe, porque
nunca se pode prever exactamente o seu uso em programas futuros.

MTODOS QUE RETORNAM VALORES


At agora vimos mtodos com valor de retorno igual a void. Um mtodo, assim como
uma funo comum, pode retornar um nico elemento de qualquer tipo, inclusive os
definidos pelo utilizador ou seja: objectos. Sendo assim, sua chamada no programa se
Pgina 24

Manual de Curso

MANUAL DE JAVA
aplica a qualquer lugar onde se espera um tipo igual ou equivalente ao tipo do seu valor
de retorno, seja numa lista de argumentos de outro mtodo , numa atribuio ou num
operador+ em System.out.println( variavel+chamada_de_metodo_que_retorna_valor);

Classe trava
O estado da trava representado no atributo public boolean travado; e pode ser obtido
atravs de uma chamada ao mtodo estado(). Este exemplo bastante simples e no
tem a pretenso de ser uma implementao completa de uma classe que modele uma
trava que possa ser utilizada para evitar o acesso a um ficheiro, por exemplo.
Cdigo:
public class Trava {
public String quem;
public boolean travado;
public void atrave(String q)
//move o circulo de lugar
{
this.travado=true;
this.quem=q;
}
public void adestrave(String q)
{
this.travado=false;
this.quem=q;
}
public boolean estado()
//estado(true/false) do objecto
{
return travado;
}
}
//Classe principal, Ficheiro Principal.Java
public class Principal {
public static void main(String args[]) {
Trava umatrava;
umatrava=new Trava();
umatrava.atrave("ProgramaPrincipal");
System.out.println(umatrava.estado());
umatrava.adestrave("ProgramaPrincipal");
System.out.println(umatrava.estado());
}
}
Resultado no ecr: true
false

Manual de Curso

Pgina 25

MANUAL DE JAVA
//Comentrios
A classe trava demasiadamente simples, mas se no o fosse no estaria na parte
introdutria deste manual. Esta classe acaba tendo a funcionalidade de uma varivel
booleana e o custo de um objecto, mas neste ponto cabe a estender este modelo para
representar uma trava de ficheiro (armazena o nome e path deste) ou uma trava de
um objecto, evitando que este seja alterado.
Exerccios
Melhore a classe Contador de Atributos e Mtodos, defina um mtodo que
imprime o contador no ecr. Se estivesse fazendo um programa para funcionar
em uma interface grfica com o utilizador este mtodo para imprimir no ecr
seria o mesmo? Definir um mtodo que retorna uma cpia do valor actual do
contador garante maior portabilidade? Por qu? Para aprender a retornar valores
consulte este tpico.
Insira um novo mtodo na classe Trava que tenha a funo de alternar entre os
estados do objecto, independente do estado actual (travado ou destravado).
No use a estrutura deciso if ainda, use o operador not que serve para negar
um valor booleano: a=!valorbooleano; // !true==false ou true==!false.
Implemente a checagem do estado de overflow no exemplo do contador,
considere o uso de um mtodo retornando um valor do tipo boolean. Considere a
adio de um atributo.

COMPARAO COM UM PROGRAMA EM PASCAL


Este exemplo de programa em Java semelhante ao exemplo da classe Circulo de
Atributos, ele ser comparado com um programa escrito em Pascal, alm disso
introduzimos um novo mtodo chamado inicializa e mtodos public float retorna_raio(void);
e void altera_raio(float a). inicializa coloca o ponto nas coordenadas passadas como seus
argumentos. Para melhor entendimento leia os exemplos anteriores com a classe
Circulo.
Cdigo Java: Programa exemplo crculo, baseado no exemplo de Atributos:
//Classe circulo
public class Circulo {
public float raio,x,y;
public void inicializa(float ax,float ay,float ar)
//garante o estado do objecto
{
this.x=ax; this.y=ay; this.raio=ar;
}
public void altera_raio(float a)
{
this.raio=a;
}
public float retorna_raio()
{
return this.raio;
}
public void move(float dx,float dy)
{
this.x+=dx; this.y+=dy;
Pgina 26

Manual de Curso

MANUAL DE JAVA
}
public void mostra()
{
System.out.println("("+this.x+","+this.y+","+this.retorna_raio()+")");
}
}
//Classe principal, Ficheiro Principal.Java
public class Principal {
public static void main(String args[]) {
Circulo ac;
ac=new Circulo();
ac.inicializa(0,0,10);
ac.mostra();
ac.move(1,1);
ac.mostra();
ac.x=100;
ac.altera_raio(12);
ac.mostra();
}
}
Disposio dos mtodos e atributos na declarao de uma classe
Em uma declarao de uma classe normalmente se coloca a declarao de mtodos
depois da declarao dos atributos, porm podemos fazer intercalaes ou adotar
qualquer ordem que nos convenha.
Uma boa tcnica de programao, que aconselhamos adotar em seus programas
utilizar linhas de comentrios para delimitar uma rea do cdigo de suas classes que
englobe tudo o que interessa a um utilizador desta. Nestes programas exemplos
praticamente tudo de interesse de um utilizador (cliente) de sua classe, mas nos
exemplos mais avanados isto no ser verdade.

Comentrios
Observe que o mtodo mostra chama o mtodo public float retorna_raio(void) que da
mesma classe. Fica claro da definio de mostra que this.retorna_raio() se aplica ao
mesmo objecto instanciado que recebeu a chamada de mostra. Isto foi feito somente
para revelar que chamadas aninhadas de mtodos tambm so permitidas, pois nesse
caso esta chamada de mtodo poderia ser substituda pelo prprio atributo raio, o que
seria mais eficiente.

Manual de Curso

Pgina 27

MANUAL DE JAVA
Programao orientada por objectos e interfaces grficas com o utilizador:
Existem libraries de classes que permitem o programador C++ desenvolver
aplicaes para ambientes como o Microsoft Windows de uma maneira bastante
abstracta, este um exemplo claro de reutilizao de cdigo, afinal no preciso saber
de detalhes da interface para programar nela.
Na segunda parte falaremos sobre a Java Aplication Programming Interface que
permite programar de maneira bastante abstrata sistemas de interfaces grficas com o
utilizador seja para aplicaes para a internet (rodando em browsers) ou para sistemas
como o Windows ou Mac/Os e X-Windows .
Resultado:

(0,0,10)
(1,1,10)
(100,1,12)

Pascal:

Um programa parecido s que em Pascal:

PROGRAM Comparacao;
{COMPARACAO COM UM PROGRAMA Java}
TYPE Circulo=RECORD
x:real;
{COORDENADAS X E Y}
y:real;
r:real;
{somente dados}
END;
var ac:circulo;
leitura:integer;
PROCEDURE Inicializa(var altereme:Circulo;ax,by,cr:real);
{COLOCA O CIRCULO EM DETERMINADA POSICAO}
BEGIN
altereme.x:=ax;
altereme.y:=by;
altereme.r:=cr;
END;
PROCEDURE Altera_Raio(var altereme:Circulo;ar:real);
{ALTERA O RAIO DO CIRCULO}
BEGIN
altereme.r:=ar;
END;
FUNCTION Retorna_Raio(copieme:Circulo):real;
BEGIN
Retorna_Raio:=copieme.r;
END;
PROCEDURE Move(var altereme:Circulo;dx,dy:real);
{MODE AS COORDENADAS X E Y ACRESCENTANDO DX E DY}
BEGIN
altereme.x:=altereme.x+dx;
altereme.y:=altereme.y+dy;
END;
PROCEDURE Mostra(copieme:Circulo);
Pgina 28

Manual de Curso

MANUAL DE JAVA
{MOSTRA O CIRCULO NO ECR}
BEGIN
writeln('X:',copieme.x,' Y:',copieme.y,' R:',copieme.r);
END;
BEGIN
{TESTES}
Inicializa(ac,0.0,0.0,10.0);
Mostra(ac);
Move(ac,1.0,1.0);
Mostra(ac);
ac.x:=100.0;
Altera_Raio(ac,12.0);
Mostra(ac);
read(leitura);
END.
Resultado:

X: 0.0000000000E+00 Y: 0.0000000000E+00 R: 1.0000000000E+01


X: 1.0000000000E+00 Y: 1.0000000000E+00 R: 1.0000000000E+01
X: 1.0000000000E+02 Y: 1.0000000000E+00 R: 1.2000000000E+01

//Comentrios JAVA:
As classes em Java so compostas de atributos e mtodos. Para executar uma aco
sobre o objecto ou relativa a este basta executar um mtodo : ac.mostra(); O mtodo
no precisa de muitos argumentos, porque prprio da classe e portanto ganha acesso
aos atributos do objecto para ao qual ela foi associado:
public float retorna_raio(void)
{ return raio; //tenho acesso directo a raio. }

{ Comentrios Pascal: }
Em Pascal os procedimentos e os dados so criados de forma separada, mesmo que s
tenham sentido juntos. A juno entre os dados e procedimentos se d atravs de
passagem de parmetros. No caso de uma linguagem procedural, o que normalmente
feito se assemelha ao cdigo seguinte: Move(ac,1.0,1.0);. Nesse caso AC um record,
algo semelhante ao struct de C (no C++). Move, acessa os dados do record
alterando os campos. O parmetro passado por referncia e o procedimento
definido a parte do registro, embora s sirva para aceitar argumentos do tipo Circulo e
mover suas coordenadas.

Segurana
Em ambos programas (Pascal, Java) o programador pode obter acesso directo aos
dados do tipo definido pelo utilizador: ac.x:=100.0; (Pascal) ou ac.x=100.0; (Java).
Veremos em Encapsulamento maneiras de proibir este tipo de acesso directo ao
atributo, deixando este ser modificado somente pelos mtodos. Isto nos garante maior
segurana e liberdade pois podemos permitir ou no o acesso para cada atributo de
acordo com nossa vontade.

Manual de Curso

Pgina 29

MANUAL DE JAVA
Eficincia
Algum pode argumentar que programas que usam bastante chamadas de mtodos
podem se tornar pouco eficientes e que poderia ser melhor obter acesso directo aos
dados de um tipo definido pelo utilizador ao envs de passar por todo o trabalho de
cpia de argumentos, insero de funo na pilha, etc.
Em verdade no se perde muito em eficincia, por que tal metodologia de programao
nos leva a organizar o cdigo de maneira mais compacta. E alm disso muitas vezes
no se deseja permitir sempre o acesso directo aos dados de um tipo definido pelo
utilizador por razes de segurana.

Exerccios
Implemente outros mtodos do estilo public void altera_raio(float a) e float
retorna_raio(void) para os atributos X e Y.
Faa um programa simples para testar uma classe que representa um rato e que
fornece a posio no ecr, os indicadores de estado dos botes e os mtodos:
clica_botao( ); move(float dx, float dy);. No preciso fazer a ligao do objecto com
o rato real, embora o leitor interessado possa encontrar na segunda parte
subsdios para esta tarefa.

rato deve ser capaz de caminhar para qualquer lugar da tela atravs de
chamadas de mtodos, no deve ultrapassar os limites estabelecidos, deve
indicar o boto est pressionado ou no atravs de um mtodo semelhante ao
mostra( ) deste exemplo. O rato deve ter 1 boto. Pode substituir mtodo
move(float dx,float dy) por combinaes de move_x(float dx); e move_y(float dy);
Pode achar o facto de o rato ser obrigado a ter um boto um tanto estranho,
mas no . Para seu programa ser porttil ele deve contar apenas com a
existncia de um boto e isso vale a pena quando se fala em portabilidade.
Verifique que em main() pode modificar o atributo x do objecto da classe Circulo
da seguinte forma: a.x=12.2; . Isto pode no ser muito til, imagine-se criando
uma library (em Java package) que implementa a classe Circulo e uma srie de
mtodos relacionados, por certas razes gostaria que o utilizador se limitasse
ao uso da interface do objecto, como faz-lo ser explicado em
encapsulamento. Crie mtodos que sirvam como alternativas a este tipo de
acesso directo.

CONSTRUTORES
Construtores so mtodos especiais chamados pelo sistema no momento da criao de
um objecto. Eles no possuem valor de retorno, porque no pode executar um
construtor para um objecto, s usa o construtor no momento da inicializao do
objecto. Construtores representam uma oportunidade de inicializar seus dados de
forma organizada, imagine se esquece de inicializar correctamente ou o faz duas
vezes, etc.
Um construtor tem sempre o mesmo nome da classe a qual pertence. Para a classe
String, pr-definida na linguagem o construtor tem a forma String(Constante do tipo
String); com o argumento entre aspas que especificado pelo programador. Ele seria
chamado automaticamente no momento da criao, declarao de uma String, sem
necessidade de uso do nome do construtor como mtodo, apenas dos argumentos:
String a;
a=new String(Texto); //alocacao e inicializacao atraves do construtor
a.mostra(); //mostra so pode ser chamada depois do construtor

Pgina 30

Manual de Curso

MANUAL DE JAVA
Nos exemplos anteriores tambm usvamos construtores no momento de inicializar
nossos objectos, s que eles no possuam argumentos.
Existem variaes sobre o tema que veremos mais tarde: sobrecarga de construtor,
copy constructor, construtor de corpo vazio. O exemplo a seguir simples,
semelhante aos anteriores, preste ateno no mtodo com o mesmo nome que a
classe, este o construtor:
Cdigo:
//Classe ponto
public class Ponto {
public float x,y;
public Ponto(float ax,float ay) // sempre omita o valor de
retorno!
//garante o estado do objecto
{
this.x=ax; this.y=ay;
}
public void move(float dx,float dy)
{
this.x+=dx; this.y+=dy;
}
public void mostra()
{
System.out.println("("+this.x+","+this.y+")");
}
}

//Classe principal, Ficheiro Principal.Java


public class Principal {
public static void main(String args[]) {
Ponto ap;
ap=new Ponto((float)0.0,(float)0.0);
ap.mostra();
ap.move(1,1);
ap.mostra();
ap.x=100;
ap.mostra();
}
}
Resultado:

Manual de Curso

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

Pgina 31

MANUAL DE JAVA
//Comentrios
Note que com a definio do construtor, obrigado a passar os argumentos deste no
momento da alocao do objecto. Se precisa ter a opo de no passar esses valores
ou passar outros, as possveis solues sero dadas em .
(float)0.0 indica que para ser feita a converso de 1.0 para ponto flutuante. 1.0 sozinho
considerado double. (int)1.0 igual a 1. (int) 2.3 igual a dois. Esta operao indicada
por (nometipo)tipo_a_ser_convertido tambm chamada de type cast.
A ocorrncia de rotinas de criao de objectos em diversos locais de um programa
muito comum. Objectos podem ser criados dentro de estruturas condicionais,
armazenados em ficheiros, passados como parmetros, inseridos em estruturas
dinmicas dentro de outros objectos, etc.

Exerccios
Um mtodo pode executar outro mtodo da mesma classe. Parta do exemplo de
e crie um construtor que chama o antigo mtodo inicializa(float a,float b)
repassando os argumentos do construtor:
ponto(float a, float b)

{ inicializa(a,b); }
Na chamada de inicializa() fica implcito que ela se aplica ao objecto cujo
construtor foi chamado. Isto vlido tambm para outros mtodos que
chamam mtodos, ou seja, no necessrio o operador identificador.inicializa(a,b);
, veja uso de this.
Este exerccio til para mostrar outro recurso de Java, o ponteiro this. this
uma palavra reservada e dentro de qualquer mtodo this um ponteiro para o
objecto em questo, ento o cdigo descrito acima poderia tambm assumir a
seguinte forma equivalente:
ponto(float a, float b)
{ this.inicializa(a,b); } //Verifique!
lgico que neste exemplo this no tem muita utilidade, mas existem casos
onde um objecto precisa passar seu ponteiro para alguma funo que o
modifica, ou fica possuindo uma referncia para ele, ento usa-se this. Veremos
outras aplicaes mais adiante.

Pgina 32

Introduza mensagens no construtor tipo: System.out.println(Objecto instanciado);


introduza trechos parecidos em outros pontos de seu programa. O objectivo
acompanhar visualmente a seqncia de criao e modificao dos objectos.

Esta classe Ponto pode ser adaptada para funcionar como representao de
vectores em duas dimenses, para tal fornea outros mtodos teis: mtodos
para tornar o vector unitrio, retornar o mdulo do vector, a componente x e y.
Para tal
ter que fazer uso de Math.cos(double a); Math.sin(double a); e
Math.sqrt(double a); , respectivamente o cosseno, o seno e a raiz quadrada de um
ponto flutuante de dupla preciso. No necessrio fazer nada semelhante a
um include de C++ para utilizar esses mtodos, basta adicion-los ao seu
cdigo, outro mtodo til Math.max(a,b); que retorna o maior valor entre a e b
(float, double, int. long, etc). Use type cast explicado nos comentrios deste
exemplo.

Crie uma classe recta que tem como atributos dois objectos da classe ponto.
Dica: No use construtores, use funes do tipo inicializa(), j apresentadas.
Quando seu programa ficar pronto acrescente mtodos para esta recta tais como
inclinao, coeficiente linear, etc. Para acrescentar construtores leia . Existem
maneiras mais eficientes e compactas de representar uma recta, porm faa
como foi sugerido, neste caso o objectivo no eficincia.
Manual de Curso

MANUAL DE JAVA

CONSTRUTORES E AGREGAO
Este exemplo o resultado do exerccio anterior (exerccio 4 tpico CONSTRUTORES),
ele cria uma classe Recta com dois atributos da classe Ponto. Ou seja
estar
reutilizando a classe Ponto na classe que representa uma Recta, a forma como essa
reutilizao de cdigo ocorre chamada de agregao.
O nome reutilizao de cdigo bastante apropriado, pois a classe Recta estar
utilizando todos os mtodos escritos para a classe Ponto. Em casos como este comum
dizer que a classe Recta cliente da classe Ponto em uma analogia com as relaes
comerciais.
Este programa procura chamar a sua ateno para o facto de que objectos so alocados
dinamicamente e que caso se esquea de aloc-los, eles ficam possuindo o valor null.
Obter acesso a uma varivel com valor null um erro que geralmente verificado em
tempo de execuo.
Nos programas anteriores alocar os objectos era fcil, mas agora que temos objectos
funcionando dentro de outros objectos h necessidade de adotar tcnicas melhores.
Veremos a seguir duas alternativas para alocar os atributos Ponto presentes na classe
Recta:
Alternativa 1:
Primeiro aloca-se o objecto da classe Recta, depois chama-se para cada atributo da
classe Ponto a rotina de alocao:
Recta r1;
r1=new Recta();
r1.ponto1=new Ponto((float)1.0,(float)2.0);
r1.ponto2=new Ponto((float)3.0,(float)4.0);
Esta alternativa em muitos casos pior que a seguinte.
Alternativa 2:
Passamos para o construtor da classe Recta a tarefa de alocar e inicializar os atributos
de forma coerente. Os argumentos do construtor da classe Recta passam a conter
valores teis para a chamada dos construtores de seus atributos. Esta alternativa
executada pelo programa a seguir:
Cdigo:
//Reutilize o ficheiro da classe Ponto definida anteriormente.
//Classe Recta
class Recta {
public Ponto a,b;
public Recta(float ax,float ay,float bx,float by)
{
a=new Ponto(ax,ay); //chamadas dos contructores da classe Ponto
b=new Ponto(bx,by);
}
public void mostra()
{
a.mostra();
b.mostra();
}
Manual de Curso

Pgina 33

MANUAL DE JAVA
}

//Classe principal, Ficheiro Principal.Java


class Principal {
public static void main(String args[]) {
Recta ar;
ar=new Recta((float)0.0,(float)0.0,(float)1.0,(float)1.0);
ar.mostra();
}
}
Alguns podem argumentar que esta maneira de representar uma recta no muito
eficiente, mas no do escopo deste texto tratar de problemas dessa natureza, o que
alis complicaria muito o cdigo , desviando-nos do objectivo principal: simplicidade na
apresentao de conceitos de orientao por objectos. O leitor deve ampliar os modelos
aqui sugeridos em aplicaes na sua rea de interesse. Como ainda faltam conceitos
importantes para serem apresentados este tipo de aplicao deve ser feita em paralelo
com a leitura.
Exerccios

Pgina 34

Implemente um programa que use a mesma lgica do exemplo anterior para


criar uma classe composta de outras . estar usando agregao. Por exemplo
um tringulo precisa de trs pontos para ser definido.

Uma implementao mais eficiente da classe Recta seria feita armazenando


apenas um coeficiente angular e um linear, mas esta recta deveria prover
tambm um construtor que aceitasse dois pontos como argumentos. Como no
aprendeu sobrecarga de construtores (definir vrios construtores), use s um
construtor que tem coeficiente angular e linear como argumentos e implemente
esta nova classe recta (sem utilizar agregao agora).

Defina um mtodo para a classe Recta que retorna o ponto de intercesso com
outra recta: public Ponto intercessao(Recta a);. No se esquea de tratar os casos
degenerados, tais como rectas paralelas e coincidentes, use por exemplo
mensagens de erro ou valor de retorno igual a null. Verifique que um mtodo de
uma recta recebe outra recta (mesmo tipo) como argumento. Dentro do mtodo
os atributos do argumento a devem ser acedidos do seguinte modo:
ap1.x;
Mais tarde, em tratamento de excepes, veremos maneiras melhores de lidar
com esses casos degenerados.

Defina um mtodo chamado move para a classe Recta, lembre-se de mover os


dois pontos juntos (a inclinao no deve mudar).

Defina um mtodo public void gira(tipox angulo); para a classe Recta. Este mtodo
recebe um ngulo como argumento, pode optar por representar o ngulo em
radianos (float) ou criar a classe ngulo (graus, minutos, segundos). Resolva
tambm o problema da escolha do ponto em torno do qual a recta deve ser
girada ( pode utilizar mais de um argumento). Use funes matemticas (seno
cosseno) e outras descritas no exerccio 3 de
Manual de Curso

MANUAL DE JAVA

DESTRUTORES OU FINALIZERS
A presena de recolha automtica de lixo torna o conceito de destrutores um pouco
diferente de seus equivalentes em outras linguagens orientadas por objectos. Em Java
destrutores so mtodos chamados pelo sistema quando a memria de um objecto est
para ser libertada pelo colector automtico de lixo (no quando est para ser
colectada).
A sintaxe dos destrutores a seguinte:
protected void finalize() {
//codigo para arrumar a casa, antes que o objecto seja apagado
}
Note que o que caracteriza o construtor ter o mesmo nome da classe, j o destrutor
caracterizado por possuir o nome finalize. Pode executar o destrutor, mas isso no
implica que o objecto ser eliminado. Ao contrrio dos construtores, os destrutores no
tem argumentos, mas possuem valor de retorno que igual a void.
Os destrutores so muito teis para limpar a casa quando um objecto deixa de ser
utilizado. Um exemplo bastante comum do uso de destrutores o de um objecto que
lida com ficheiros que devem ser fechados quando o objecto for destrudo. Existem
outros casos onde um objecto deve comunicar aos outros objectos que ser inutilizado,
destrudo, ou seja : sair do programa.
Em Java, que possui recolha automtica de lixo, um objecto
passa a no existir mais no programa quando nenhuma varivel
faz referncia a ele. Nesse ponto, ele armazenado no colector
automtico de lixo, onde receber o tratamento adequado. Um n
de uma lista ligada pode ser apagado simplesmente fazendo o n
anterior apontar para o posterior a ele. Os programadores no
acostumados com esse conceito precisam ouvir a seguinte frase:
no obrigado a liberar explicitamente a memria de um objecto
como feito em C++ e outras linguagens.
Se estivssemos por exemplo em C++, que no possui recolha automtica de lixo, o
destrutor seria chamado sempre que a memria de um objecto fosse desalocada, o que
feito pelo programador atravs de uma chamada a delete nomedoobjecto(); .
Em Java a liberao de memria que feita pelo colector automtico de lixo que
executado de modo assncrono com o restante do programa, ou seja no pode contar
com o facto de que o destrutor ser chamado imediatamente aps o momento em que
seu objecto sai de escopo, a no ser que o programa seja executado com o modo
assncrono do colector automtico de lixo desligado ( Java -noasyncgc NomePrograma). Na
verso beta, no pode nem mesmo contar com a chamada do destrutor pelo garbage
collector, de modo que ele deve ser utilizado apenas para optimizaes do cdigo.

Manual de Curso

Pgina 35

MANUAL DE JAVA
POINTERS, REFERNCIAS E OBJECTOS
Algum pode ter achado estranho que no foram discutidos ponteiros em Java, ocorre
que eles no existem nessa linguagem. Existem estudos que afirmam que erros com
ponteiros so um dos principais geradores de bugs em programas, alm disso com
todos os recursos que temos no precisaremos deles.
Os programadores acostumados ao uso de ponteiros (e aos erros decorrentes desse
uso), acharo muito natural e segura a transio para Java onde passaro a utilizar
principalmente vectores e classes. A estruturao de seu cdigo dever agora ser feita
em um modelo que se baseia no uso de objectos (vectores e Strings tambm so
objectos). Objectos superam a representatividade obtida com records, funes isoladas
e ponteiros.
De certo modo estar usando referncias, mas de forma implcita. Por exemplo:
objectos so alocados dinamicamente com new, eles so referncias ou ponteiros para
posies na memria, mas a linguagem mascara este facto por razes de segurana.
Como objectos so ponteiros (s que transparentes para ), nos depararemos com o
problema de reference aliasing quando discutirmos cpia de objectos com outros
objectos como atributos.

PASSAGEM POR REFERNCIA


Linguagens como Pascal ou C criam meios de passar parmetros por valor ou por
referncia. Como Java no possui ponteiros, a passagem por referncia deve ser feita
atravs de objectos. Se o parmetro j um objecto, ento a passagem dele
obrigatoriamente por referncia.
No caso de tipos simples, podemos pass-los dentro de vectores que so objectos, ou
ento criar classes para embalar, empacotar estes tipos. Dada a necessidade destas
classes, elas j foram definidas na linguagem. So classes definidas para conter cada
tipo bsicos e permitir certas converses entre eles, falaremos destas classes conforme
necessitarmos de seu uso. As vezes estas classes so chamadas de wrappers.
Exerccios
class X {
public void troca(X valores)
{
int a;
a=val;
val=valores.val;
valores.val=a;
}
//imprima os atributos de um objecto OBJ da classe X
//chame o metodo troca de outro objecto, usando OBJ como argumeto
//verifique a alteracao nos atributos desse argumento
O cdigo acima mostra como definir um mtodo que usa a existncia implcita de
ponteiros na linguagem para criar um mtodo que troca os atributos de dois objectos
da mesma classe. Implemente este mtodo e faa os testes sugeridos nos comentrios
desse cdigo.
Pgina 36

Manual de Curso

MANUAL DE JAVA

VECTORES E MATRIZES
Vectores so objectos, eles possuem papel importante no estilo de programao desta
linguagem que exclui ponteiros. Por serem objectos, vectores so obrigatoriamente
alocados de maneira dinmica. O exemplo a seguir aloca um vector de inteiros com trs
posies, seguindo uma sintaxe semelhante a de alocao de objectos:
Cdigo:
class VetorTest {
public static void main (String args[]) {
int vector[]=new int[3];
vector[0]=0;
//indexacao semelhante a C , C++
vector[1]=10;
vector[2]=20;
System.out.println(vector[0]+" "+vector[1]+" "+vector[2]+" ");
}
}
Resultado:

0 10 20

Resumo da sintaxe de vectores


int a[]; //declara vector de inteiros a
a=new int[10]; //aloca vector a com dez posicoes
//as duas linhas anteriores podem ser abreviadas por:
int a[]=new int[10];
//alem disso se voce quiser inicializar o vector a, ja na declaracao:
int a[3]={0,10,20};
O anlogo para matrizes :
int a[][]; //declara matriz de inteiros a
a=new int[3][3]; //aloca matriz 3x3, 9 celulas
//as duas linhas anteriores podem ser abreviadas por:
int a[]=new int[3][3];
//alem disso se voce quiser inicializar a matriz a ja na declaracao:
int a[3][3]={{0,10,20},{30,40,50},{60,70,80}};
Em mtodos, argumentos e valores de retorno que so vectores, so escritos da
seguinte forma: int[] , ou tipo[] nomedavariavel //no caso de argumentos.
Diagrama do vector:

Perceba que a faixa til do vector vai de 0 at (n-1) onde n o valor dado como
tamanho do vector no momento de sua criao, no nosso caso 3. O mesmo ocorre com
matrizes. Esta conveno pode confundir programadores Pascal onde a indexao vai
de 1 at n.

Java checa se

usa correctamente os ndices do vector. Se ocorrer um acesso ao


vector[i] onde i um ndice invlido (fora da faixa de valores permitidos), receber uma
mensagem parecida com: Java.lang.ArrayIndexOutOfBoundsException: #. Retornaremos ao
Manual de Curso
Pgina 37

MANUAL DE JAVA
assunto desta mensagem mais adiante, ela uma exceo gerada pelo cdigo que
acompanha a linguagem.
Existe um atributo muito til quando se trabalha em um vector de dados:
a.length; //armazena o numero de elementos do vector a
Declarar um vector de objectos, por exemplo objectos da classe Ponto, no implica que
os objectos de cada posio do vector j estaro inicializados, para inicializar os
elementos, siga seguinte sintaxe:
Ponto a[];
//declaracao, todas as posicoes com null
a = new Ponto[3];
//alocacao
for (int i = 0; i < a.length(); i++) { a[i] = new Ponto(0,0); } //inicializacao
(o cdigo acima representa um dos usos de vectores no lugar de ponteiros)
Exerccios:
Escreva um programa simples que toma um vector de preos e um de descontos
(50%=.5), e altera o vector de preos de modo que estes produtos j incluam os
descontos no seu valor de venda. Exemplo:
Preos :
40,5
30,3
12,6
100
Descontos:
.5
.3
.2
.5
Vector calculado:
20.25
9.09
2.52
50
A linguagem Java ser muito utilizada no
usadas para clculos de preos de produtos
que pode dar as classes e mtodos so:
Classe:
Atributo:
Atributo:
Mtodo:

comrcio da internet, tab elinhas assim,


j esto se tornando comuns. Os nomes
TabelaPrecos
boolean ComDesconto;
double[] Precos;
void AplicaDescontos(int[] descontos);

COPIA , COMPARAO E DETERMINAO DA CLASSE EM OBJECTOS


Objectos so implicitamente referncias, portanto sua cpia (atravs do operador =)
est sujeita ao problema de reference aliasing e efeitos colaterais. A comparao de
objectos atravs do operador == tem o significado da comparao de referncias, ou
seja ela verifica se os objectos compartilham o mesmo espao alocado na memria.
Observe que com as operaes conhecidas at agora, no conseguimos comparar dois
objectos quanto ao contedo a no ser que comparemos atributo por atributo, o
mesmo vale para a cpia.
Seria til dispor de um conjunto de operaes de igualdade, desigualdade e copia que
se aplicasse ao contedo dos objectos e no ao endereo de memria de suas variveis.
Uma outra necessidade seria verificar a classe de um objecto em tempo de execuo.
Usaremos o ficheiro da classe Ponto, j apresentado em CONSTRUTORES ., mas com
uma modificao no mtodo mostra. No lugar de mostra criaremos um mtodo chamado
public String toString(). Este mtodo padro em muitas classes e deve ser definido de
modo a retornar uma String descritiva do objecto.
Fazendo isto pode concatenar uma varivel Ponto com uma String no argumento do
mtodo System.out.println(meuPonto1+ Na vizinhanca de +meuPonto2);. Esta deciso de
implementao certamente mais genrica que mostra, visto que nem sempre
estaremos imprimindo atravs de System.out.println(), por exemplo na segunda parte
ocorrero casos em que temos que pintar Strings em reas especiais no ecr.

Pgina 38

Manual de Curso

MANUAL DE JAVA
Cdigo:
//Classe ponto
class Ponto {
public float x,y;
public Ponto(float ax,float ay) //omita o valor de retorno!
//garante o estado do objecto
{
this.x=ax; this.y=ay;
}
public void move(float dx,float dy)
{
this.x+=dx; this.y+=dy;
}
public String toString()
{
return "("+this.x+","+this.y+")"; //(x,y)
}
}
//Classe principal, Ficheiro Principal.Java
class Principal {
public static void main(String args[]) {
//preparacao das variaveis copia de objectos
Ponto pOriginal,pAlias,pCopia;
pOriginal=new Ponto((float)0.0,0.0f); //(float)0.0 ou 0.0f; 0.0 eh double
pAlias=pOriginal; //copiando atraves de atribuica
pCopia=new Ponto(pOriginal.x,pOriginal.y); //copiando atributo por atributo
//resultados
System.out.println("Original:"+pOriginal);
System.out.println("Alias:"+pOriginal);
System.out.println("Modificando Alias.x para 2");
pAlias.x=2.0f;
System.out.println("Veja como o original ficou:"+pOriginal);
System.out.println("pCopia nao se modifica:"+pCopia);
//comparacao de objectos
System.out.println("Original==Alias:"+(pOriginal==pAlias) );
System.out.println("Copia==Original:"+(pCopia==pOriginal) );
System.out.println("Deixando atributos de Copia iguais aos de Original");
pCopia.x=2;
System.out.println("Copia==Original:" +(pCopia==pOriginal) );
System.out.println("Original.x==Copia.x:"+(pCopia.x==pOriginal.x) );
System.out.println("Original.y==Copia.y:"+(pCopia.y==pOriginal.y) );
}

Manual de Curso

Pgina 39

MANUAL DE JAVA
Resultado:

Original:(0,0)
Alias:(0,0)
Modificando Alias.x para 2
Veja como o original ficou:(2,0)
pCopia nao se modifica:(0,0)
Original==Alis:true
Copia==Original:false
Deixando atributos de copia iguais aos de Original
Copia==Original:false
Original.x==Copia.x:true
Original.y==Copia.y:true

//Comentrios
//preparacao das variaveis, copia de objectos:
pAlias e uma referncia para o mesmo local de memria que pOriginal, por este
motivo quando pAlias alterado, pOriginal se altera por efeito colateral, eles
compartilham o mesmo objecto pois a atribuio pAlias=pOriginal, copia o endereo
de pOriginal.
J pCopia, o resultado de uma nova alocao de memria, portanto um novo
endereo, um objecto independente dos outros.
//comparacao de objectos:
pOriginal==pAlias e outras comparaes equivalentes tm o significado de comparao
do endereo de memria e no do contedo.
pOriginal.x==pCopia.x tem o significado de comparao do valor desses atributos,
assim como uma comparao entre inteiros. Se esses atributos por sua vez fossem
objectos, esta operao teria o significado de comparao entre endereos de
memria dos objectos.
Cdigo:
//Classe Ponto
class Ponto {
public float x,y;
public Ponto(float ax,float ay) //omita o valor de retorno!
//garante o estado do objecto
{
this.x=ax; this.y=ay;
}
public void move(float dx,float dy)
{
this.x+=dx; this.y+=dy;
}
public String toString()
{
return "("+this.x+","+this.y+")"; //(x,y)
}
public boolean igual(Ponto outro)
{
return ((outro.x==this.x) && (outro.y==this.y)); //this==outro?
}
Pgina 40

Manual de Curso

MANUAL DE JAVA
}
//Classe principal, Ficheiro Principal.Java
class Principal {
public static void main(String args[]) {
//preparacao das variaveis
Ponto pOriginal,pCopia1,pCopia2;
pOriginal=new Ponto((float)0.0,0.0f); //(float)0.0 ou 0.0f; 0.0 eh double
pCopia1=new Ponto(0.0f,0.0f);
pCopia1.Copy(pOriginal); //pCopia1 copia conteudo de pOriginal nele mesmo
pCopia2=(Ponto) pOriginal.Clone();
//copia de objectos
System.out.println("Original:"+pOriginal);
System.out.println("Copia1:"+pCopia1);
System.out.println("Copia2:"+pCopia2);
System.out.println("Modificando Copia1.x para 2");
pCopia1.x=2.0f;
System.out.println("Veja como o original ficou:"+pOriginal);
System.out.println("Copia2 nao se modifica:"+pCopia2);
//comparacao de objectos
System.out.println("Original==Copia2:"+(pOriginal==pCopia2) );
System.out.println("Original.igual(Copia2):"+pOriginal.igual(pCopia2) );
System.out.println("Deixando atributos de Copia iguais aos de Original");
//verificacao da classe dos objectos
System.out.println("Obtendo a classe dos objectos");
System.out.println(pOriginal.getClass().getName());
System.out.print("Original e da classe String?");
boolean result=(pOriginal instanceof String);
System.out.println(result);
}
}

OBTER VALORES

DO

UTILIZADOR

Este tpico foi introduzido porque os programas seguintes so mais complexos e


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

LER DO TECLADO
Este tpico contm dois exemplos que ensinam como ler Strings do teclado, como
convert-las para nmeros, e como controlar melhor a entrada e sada de dados.

Manual de Curso

Pgina 41

MANUAL DE JAVA

LEITURA

DE

STRINGS USANDO

UM

VECTOR

DE

BYTES

Em Java praticamente um padro ler dados em bytes, seja do teclado, da rede, do


disco ou de qualquer outro lugar. Por este motivo o primeiro exemplo l em um vector
de bytes. Como sabemos que
quer mais do que isso (ex. ler outros tipos da
linguagem), o segundo exemplo tratar desse caso.
Cdigo:
1
import Java.io.*;
2
3
class EntraDados {
4
5
public static void main (String args[])
6
{
7
8
byte vetortexto[] = new byte[200]; //declaracao de um vector de bytes
9
int byteslidos = 0;
1
0
System.out.println("Escreva algo:");
1
1
try {
1
byteslidos = System.in.read(vetortexto);
2
System.out.print("Voce escreveu:");
1
System.out.write(vetortexto,0,byteslidos);
3
}
1
catch (IOException e) {
4
// Alguma acao de recuperacao da falha
1
}
5
}
1
}
6
1
7
1
8
1
9
2
0
2
1
2
2

Resultado:

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

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

Pgina 42

Manual de Curso

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

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

Manual de Curso

Pgina 43

MANUAL DE JAVA
Cdigo:
import Java.io.DataInputStream; //classe DataInputStream para a entrada de dados
1
2
public class ReadString {
3
4
public static void main(String args[]) {
5
6
7
String linha="";
8
9
DataInputStream meuDataInputStream;
10
11
meuDataInputStream = new DataInputStream(System.in);
12
13
try{
14
linha = meuDataInputStream.readLine();
15
}
16
catch (Exception erro) { System.out.println(Erro de leitura); }
17
18 //antes de imprimir ou armazenar a string, e obvio que voce poderia executar algum
19 //processamento, mas nao estudamos a classe string ainda, por isso tenha paciencia.
System.out.println(linha);
20
21
22
}/
23
24
25 }
Resultado:

Voce pode andar rapido com paciencia


Voce pode andar rapido com paciencia

//Comentrios
O cano de nosso exemplo mais parecido com uma mangueira de jardim, ns ficamos
com a ponta de onde sai a gua.
1:Nesta linha dizemos que desejamos utilizar, importar, um stream de entrada de dados
de nome DataInputStream presente na package Java.io
8: Nesta linha declaramos o que seria o balde para recolher a gua da mangueira (Uma
String). O balde comea vazio ().
10:Esta linha diz para pegar a mangueira (DataInputStream) do depsito (package
Java.io).
12:Esta linha conecta a outra ponta da mangueira na torneira (System.in a torneira,
que significa teclado em quase todos os computadores).
15:Encha o balde com o que sair da torneira at haver uma interrupo no
fornecimento. (Leia o que puder do stream at encontrar um caractere de nova linha
\n. Da o nome readline que significa leia linha).
20:Esvazie o balde no cano de sada (Copie o valor da String lida na entrada do stream
System.out, que significa vdeo na maioria das mquinas).
As linhas 14,15 e 17 so necessrias para escrever line = myDataInputStream.readLine();.
Essas linhas permitem aes de recuperao de falhas que possam ocorrer no processo
de leitura, abordaremos este tpico bem mais adiante, de modo que aqui apenas
daremos uma viso geral s a ttulo de curiosidade:

Pgina 44

Manual de Curso

MANUAL DE JAVA
No bloco try { }, deve-se inserir as operaes passveis de falhas. Este bloco deve ser
seguido por catch (Exception erro) { /* nao faco nada */ }. No lugar de /* nao faco nada */
deveriam estar as possveis aes de recuperao de falhas como no caso adotamos:
System.out.println(Erro de leitura);.
line = myDataInputStream.readLine(); o mtodo que faz com que o Stream leia da entrada
de dados em que foi associado uma linha. Este mtodo obviamente bloqueia a
execuo do programa at que se digite carriage return, o que no problemtico
pois isto poderia ser feito paralelamente, usando threads.

Como converter Strings para inteiros


Se inserir o seguinte mtodo na nossa classe ReadString, poder ler valores inteiros do
teclado.
static int leInteiro() {
String line;
DataInputStream in = new DataInputStream(System.in);
try {
line = in.readLine();
int i = Integer.valueOf(line).intValue();
return i;
}
catch (Exception e) {
return -1;
}
}
int i = Integer.valueOf(line).intValue();
um exemplo de chamadas consecutivas ou aninhadas de mtodos. Olhe da esquerda
para a direita. Primeiro o mtodo valueOf(line) chamado para a classe Integer
retornando um objecto da classe Integer. Depois o objecto da classe Integer tem seu
mtodo intValue() invocado retornando um valor do tipo int que correspondente a String
line.

ARGUMENTOS DE LINHA DE COMANDO


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

Pgina 45

MANUAL DE JAVA
public static void main (String args[]) ...
Cdigo:
class MostraArgumentos {
public static void main(String args[]) {
for (int i=0; i < args.length; i++) {
System.out.println("Argumento" + i+": "+ args[i]);
}
}

}
Resultado do programa para a chamada: Java
argumento s
Argumento0: Passando
Resultado:
Argumento1: 3
Argumento2: argumento s

MostraArgumentos Passando 3

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

Construa um programa simples que recebe argumentos da linha de comando e


os imprime atravs de cout. Normalmente isso que deve ser feito antes de
utilizar um recurso da linguagem pela primeira vez, experiment-lo em
programas simples.

ENCAPSULAMENTO

COM

PRIVATE, PUBLIC, PACKAGE

PROTECTED

Encapsulamento, data hiding um conceito bastante importante em orientao por


objectos. Neste tpico vamos falar das maneiras de restringir o acesso as declaraes
de uma classe e a prpria classe, isto feito atravs do uso das palavras reservadas
public, private e protected que so qualificadores.
Algum pode estar se perguntando o porqu de se restringir o acesso a certas partes
de uma classe. A idia simples, devemos fornecer ao utilizador, cliente de uma classe,
o necessrio e somente o necessrio para que ele tire proveito da funcionalidade desta
classe. Os detalhes devem ser omitidos, somente a lista de operaes a qual uma
classe deve atender fica visvel.
Os benefcios so muitos: clareza do cdigo, minimizao de erros, facilidade de
extenso. Talvez a facilidade de modificao seja o mais importante dos benefcios.
Pgina 46
Manual de Curso

MANUAL DE JAVA
Como a classe conhecida pela sua interface, muito fcil mudar a representao
interna sem que o cliente, utilizador, perceba a diferena Estaremos preocupados em
separar design de implementao, Java uma linguagem boa de se programar em
termos de design e em termos de implementao.
Programar tendo em vista o design tambm chamado de programming in the large,
enquanto que programar tendo em vista implementao, codificao chamado de
programming in the small. Alguns programadores experientes afirmam que Java se
parece com C quando estamos preocupados com codificao, mas quando estamos
preocupados com design, Java se assemelha a Smalltalk.
Com encapsulamento ser capaz de criar componentes de software reutilizveis,
seguros, fceis de modificar.

ENCAPSULANDO MTODOS E ATRIBUTOS


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

private

protected
Nada
especificado,
equivale
package
ou friendly

Estes atributos e mtodos so sempre acessveis em todos os


mtodos de todas as classes. Este o nvel menos rgido de
encapsulamento, que equivale a no encapsular.
Estes
atributos
e mtodos so acessveis
somente
nos
mtodos(todos) da prpria classe. Este o nvel mais rgido de
encapsulamento.
Estes atributos e mtodos so acessveis nos mtodos da prpria
classe e suas subclasses, o que ser visto em Herana .
Estes atributos e mtodos so acessveis somente nos mtodos das
classes que pertencem ao package em que foram criados. Este
modo de acesso tambm chamado de friendly.

(existem outros qualificadores, no relacionados com encapsulamento que sero


explicados depois)
Package e friendly: Aparecem entre aspas porque no so palavras reservadas da
linguagem, so apenas nomes dados para o tipo de encapsulamento padro
(default), que ocorre quando no existe um especificador. So nomes fceis de
memorizar. Friendly significa amigvel, no sentido de que as classes que permitem
este tipo de acesso possuem um encapsulamento mais relaxado com relao as
classes do mesmo package (amigas). Package um grupo de classes relacionadas.
Protected ser explicada em pois est relacionada com herana, por hora vamos
focalizar nossa ateno em private e public que qualificam os atributos e mtodos de
Manual de Curso

Pgina 47

MANUAL DE JAVA
uma classe quanto ao tipo de acesso (onde eles so visveis) . Public, private e protected
podem ser vistos como qualificadores ou specifiers.
Para facilitar a explicao suponha a seguinte declarao de uma classe:
class Ponto {
private float x
private float y
public void inicializa(float a,float b) {x=a; y=b;};
public void move (float dx,float dy);
}
Fica fcil entender essas declaraes se pensar no seguinte: esses qualificadores se
aplicam aos mtodos e atributos que vem imediatamente aps eles. Os elementos da
classe qualificados como private aparecem com fundo cinza escuro indicando que sua
visibilidade mais limitada que os atributos qualificados como public (cinza claro).
Agora vamos entender o que private e o que public. Vamos supor que
(criou) um objecto do tipo Ponto em seu programa:
Ponto meu; //instanciacao
meu=new Ponto();
Segundo o uso da definio da classe Ponto dada acima
programa:
meu.x=(float)5.0; //erro !

instanciou

no pode escrever no seu

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

ATRIBUTOS PRIVATE

PUBLIC
PRIVATE
PROTECTED
PACKAGE

MTODOS PUBLIC

Aplicando encapsulamento a classe ponto definida anteriormente, deixando os atributos


encapsulados e definindo a interface publica da classe somente atravs de mtodos.
//Classe ponto
public class Ponto {
private float x,y;

//atributos private

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


//garante o estado do objecto
{
this.x=ax; this.y=ay;
Pgina 48

Manual de Curso

MANUAL DE JAVA
}
public void move(float dx,float dy)
{
this.x+=dx; this.y+=dy;
}
public float retorna_x()
{
return x;
}
public void mostra()
{
System.out.println( "(" + this.x + "," + this.y + ")" );
}
}
//Classe principal, Ficheiro Principal.Java
class Principal {
public static void main(String args[]) {
Ponto ap;
ap=new Ponto((float)0.0,(float)0.0);
ap.mostra();
}
}
Resultado:

(0,0)

//Comentrios:
Este programa no deixa tirar o ponto de (0,0) a no ser que seja chamada inicializa
novamente. Fica claro que agora, encapsulando x e y precisamos de mais mtodos para
que a classe no tenha sua funcionalidade limitada. Novamente: escrever ap.x=10; em
main um erro! Pois x est qualificada como private. Sempre leia os exerccios, mesmo
que no v faze-los. O que ocorre em classes mais complicadas, que ao definir mais
mtodos na interface da classe, estamos permitindo que a representao interna possa
ser mudada sem que os utilizadores tomem conhecimento disto.

Exerccios:
Implemente os mtodos public void altera_x(float a) , public float retorna_x(void), public
void move (float dx,float dy ); .Implemente outros mtodos que achar importantes
exemplo public void distancia(ponto a) { return dist(X,Y,a.X,a.Y); }, onde dist representa
o conjunto de operaes matemticas necessrias para obter a distncia entre
(X,Y) (a.X,a.Y). provavelmente usar a funo Math.sqrt() que define a raiz
quadrada de um double, no preciso fazer nenhum import para utilizar
Math.sqrt(), mas preciso converter os argumentos de float para double e o valor
de retorno de double para float.
Veja que no mtodo distancia, podemos obter acesso aos atributos private X e Y
do argumento a, isto permitido porque distancia um mtodo da mesma
classe de a, embora no do mesmo objecto, uma maneira de prover este tipo de
Manual de Curso

Pgina 49

MANUAL DE JAVA
acesso para outras classes (distancia de recta a ponto) dotar a classe Ponto de
mtodos do tipo float retorna_x(void);.

Escolha um programa implementado anteriormente e aplique encapsulamento,


analise a funcionalidade de sua classe. teve que implementar mais mtodos?
Quais?

UM ATRIBUTO PUBLIC
Neste tpico pedimos que o leitor faa uma variante do programa anterior, a nica
diferena que Y deve ser colocado na parte public da definio da classe podendo ser
acessado directamente. Para escrever a variante, tome o cdigo do programa anterior e
substitua
private float x,y;
por
private float x;
public float y; //y pode ser acessado
Comentrios
Observe que agora nada impede que
acesse directamente y: ap.y=100.0, porm
ap.x=10.00 um erro. Observe em que parte (rea) da classe cada um desses atributos
foi declarado.
Exerccios

Pgina 50

Crie os mtodos float retorna_x(void), void altera_x(float a); que devem servir para
retornar o valor armazenado em x e para alterar o valor armazenado em x
respectivamente. Crie tambm os respectivos mtodos retorna e altera para o
atributo y.

Qual das seguintes declaraes permite que se acesse em main somente os


mtodos move e inicializa, encapsulando todos os outros elementos da classe?
Obs.: A ordem das declaraes private e public pode estar invertida com relao
aos exemplos anteriores.
a)
public class Ponto {
public float x;
public float y;
public void inicializa(float a, float b) {x=a; y=b;};
public void move(float dx, float dy) ; {x+=dx; y+=dy; };
};
b)
public class Ponto {
public void inicializa(float a, float b) {x=a; y=b;};
public void move(float dx, float dy) ; {x+=dx; y+=dy; };
private float x;
private float y;
};
c)
public class Ponto {
public void inicializa(float a, float b) {x=a; y=b;};
private void move(float dx, float dy) ; {x+=dx; y+=dy; };
public float x;
private float y;
};
Manual de Curso

MANUAL DE JAVA
ENCAPSULAMENTO E PACKAGES
Neste tpico explicaremos o recurso de packages com nfase nas opes de
encapsulamento relacionadas , em herana explicaremos este recurso com nfase no
reuso de cdigo das packages oferecidas com a linguagem. Packages so conjuntos de
classes relacionadas, estes conjuntos so determinados incluindo uma linha no topo de
cada ficheiro indicando a qual package pertencem as classes ali declaradas. Se
nenhuma linha inserida assume-se que todas as classes pertencem a uma package
s.

ENCAPSULAMENTO DE ATRIBUTOS E MTODOS COM PACKAGES


O encapsulamento de atributos e mtodos atingido com o uso de packages muito
semelhante ao encapsulamento com private e public, s que agora o limite de
visibilidade mais amplo do que a classe. A questo aqui levantada se a classe
visvel fora do package ou no. S para lembrar, a questo que do item anterior: ,
era se os mtodos e atributos eram visveis fora da classe ou no.
Visibilidade das declaraes de uma classe, dentro de seu package:

PUBLIC
PRIVATE
PROTECTED
PACKAGE

Quando explicarmos protected forneceremos um diagrama completo dos modos de


encapsulamento de mtodos e atributos, este diagrama muito til para a
memorizao.
Packages um recurso da linguagem que permite formar grupos de classes
relacionadas entre si de forma que elas ofeream facilidades umas as outras.
Facilidades estas que nem sempre so oferecidas ao utilizador. Vamos montar uma
package de nome Geometria contendo classes que representam elementos grficos tais
como rectas, crculos e pontos. A estrutura de directrio abaixo descreve a disposio
dos ficheiros deste exemplo:
Incio:

Aps Javac:

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

Pgina 51

MANUAL DE JAVA
//Classe ponto
package Geometria;
public class Ponto {
float x,y; //nenhu especificador, default=package
public Ponto(float ax,float ay) //omita o valor de retorno!
//garante o estado do objecto
{
this.x=ax; this.y=ay;
}
public float retornaX()
{
return x;
}
public void move(float dx,float dy)
{
this.x+=dx; this.y+=dy;
}
public void mostra()
{
System.out.println("("+this.x+","+this.y+")");
}
}

//Classe circulo
package Geometria;
public class Circulo {
float raio,x,y; //nenhum especificador, defaul=package
public Circulo(float ax,float ay,float ar)
//garante o estado do objecto
{
this.x=ax; this.y=ay; this.raio=ar;
}
public void altera_raio(float a)
{
this.raio=a;
}
public float retorna_raio()
{
return this.raio;
}
public void move(float dx,float dy)
{
this.x+=dx; this.y+=dy;
}
public float distancia(Ponto ap)
{
float dcp; //distancia do centro do circulo ao ponto
Pgina 52

Manual de Curso

MANUAL DE JAVA
dcp=(float)Math.sqrt((double) ((x-ap.x)*(x-ap.x)+(y-ap.y)*(y-ap.y)) ); //acesso directo
//aos atributos de ap, isto porque as classes pertencem ao mesmo package
if (dcp<raio) {return raio-dcp; }
else {return dcp-raio; }
}
public void mostra()
{
System.out.println("("+this.x+","+this.y+","+this.raio+")");
}
}

//Ficheiro Recta.Java
//Classe Recta
package Geometria;
public class Recta {
Ponto a,b; //idem , sao encapsulados como package
public Recta(float ax,float ay,float bx,float by)
{
a=new Ponto(ax,ay);
b=new Ponto(bx,by);
}
public float distancia(Ponto ap)
{
//metodo nao implementado
//acesse livremente os atributos do argumento Ponto
//de modo a calcular sua distancia a esta recta, ex copia=ap.x;
return 0.0f;
}
public void mostra()
{
a.mostra();
b.mostra();
}
}

//Classe principal, Ficheiro Principal.Java


import Geometria.*;
public class Principal {
public static void main(String args[]) {
Circulo acirc;
//acirc.x=(float)10.0; erro! atributo encapsulado (modo package)
Ponto apto;
acirc=new Circulo((float)0.0,(float)0.0,(float)1.0);
acirc.mostra();
apto=new Ponto((float)4.0,(float)3.0);
apto.mostra();
System.out.println("Dist:" + acirc.distancia(apto));
}
Manual de Curso

Pgina 53

MANUAL DE JAVA
}
Resultado:

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

As declaraes em negrito dos ficheiros acima: package Geometria.*; e import Geometria.*


devem ser inseridas logo no incio do ficheiro, s podendo ser precedidas por
comentrios.
Existe uma quantidade grande de packages, j definidas na linguagem, as quais
abordaremos na segunda parte. Por hora basta saber que
j estamos usando
declaraes da package Java.lang , mesmo sem especificar import Java.lang.*; no incio
de nossos ficheiros. Isto ocorre porque este package importado implicitamente em
todos os programa Java.
O .* utilizado em import Geometria.*; tem o significado de todas as classes da package
Geometria, o asterisco utilizado como um coringa, um valor que pode substituir todos
os demais, assim como em alguns sistemas operacionais.
Embora de fcil utilizao, este conceito constitui uma inovao com relao a C++. Em
Modula-3 pode-se obter um efeito semelhante utilizando declaraes de classes (tipos
objectos) no mesmo mdulo e interfaces que no exportam tudo o que existe no
mdulo, assim as classes declaradas no mesmo mdulo oferecem facilidades umas as
outras.
O modo de acesso de atributos e
mtodos chamado friendly ou package
proporcionado pelo uso de packages e permite programar de maneira eficiente (sem
muitas chamadas de mtodos) e segura (com encapsulamento).
Se os tributos da classe Ponto forem especificados como friendly ou package (equivale
a nenhum especificador), eles podero ser acessados directamente (sem chamadas
do tipo ap.retorna_x(); ) pela classe Recta que pertence a mesma package, mas
continuam encapsulados para as classes externas ao package ou seja para o
utilizador. Enfatizamos o termo directamente porque obter acesso a um atributo via
mtodo bem mais custoso do que acess-lo directamente, mas se programar usando
packages, ganhar o beneficio da eficincia sem perder o do encapsulamento.

ENCAPSULAMENTO DE CLASSES COM PACKAGES


At agora, tnhamos declarado todas as classes como public (public class Nomeclasse {}),
embora sem explicar exactamente porque. Este tpico trata da possibilidade de o
programador desejar criar uma classe para seu uso prprio e no fornec-la para o
utilizador.
O que a linguagem Java permite neste sentido :
1- A criao de classes que s podem ser usadas dentro de packages, ou seja, no
pode declarar um objecto desta classe externamente ao package.
2- A criao de classes que podem ser usadas somente pelas classes presentes no
mesmo ficheiro, embora no tenhamos mostrado, um ficheiro pode conter a
declarao de mais de uma classe desde que somente uma delas seja public.
O encapsulamento de classes segue uma sintaxe semelhante ao encapsulamento de
mtodos e atributos, ou seja: atravs de qualificadores ou modificadores:
QualificadorDaClasse class NomeDaClasse { /*Atributos e metodos */ }
Pgina 54

Manual de Curso

MANUAL DE JAVA
Os qualificadores so:
public
Estas classes so sempre acessveis em todos os packages do seu
cdigo. Somente uma classe publica permitida por ficheiro, e o
ficheiro deve ter o mesmo nome da classe.
private
Estas classes so acessveis somente pelas classes declaradas no
mesmo ficheiro. Um ficheiro pode possuir vrias classes private, mas
uma nica classe public.
Nada
Estas classes podem ser acessadas no package que elas pertencem, se
especificado nenhum package especificado, elas pertencem ao programa.
package
(existem outros qualificadores, no relacionados com encapsulamento que sero
explicados depois)
Seus programas
no precisam necessariamente fazer uso destes recursos de
encapsulamento, mas todo cdigo escrito para terceiros deve utiliz-los intensamente.
teve ter notado que sempre definimos uma classe por ficheiro, isto feito porque a
linguagem s permite uma classe public por ficheiro, as outras tem que ser private ou
package.
Um exemplo de utilizao: ao criar uma classe lista ligada algum pode achar
conveniente definir uma classe n para ser utilizada somente pela classe listaligada.
Uma opo definir a classe n com modo de encapsulamento: package. O cliente de
sua classe lista ligada no precisa saber que esta classe se baseia em uma classe No.
Vamos implementar esta idia no exemplo a seguir, tomarei o cuidado de faz-lo bem
simples pois estamos no comeo do manual:
Incio:

Aps Javac:

Cdigo:
package listas;
//classe Lista, classe No ficheiro Lista. Java
class No { //sem especificador de modo de acesso na classe
private char info; //se eu ja tivesse ensinado protected usaria em lugar de private
private No prox; //"ponteiro" para o proximo no
No(char i,No p) //construtor
{
info=i;
prox=p;
}
char retorna_info()
//retorna valor do campo
{
return info;
}
Manual de Curso

Pgina 55

MANUAL DE JAVA
void altera_info(char i)
//altera valor do campo
{
info=i;
}
void altera_prox(No p)
//altera valor do proximo no
{
prox=p;
}
No retorna_prox()
//retorna referencia ao proximo no
{
return prox;
}
}
public class Lista {
private No cabeca;
//incio da lista
private int elementos; //numero de nos na lista
public Lista()
//construtor
{
cabeca=null;
elementos=0;
}
public void insere(char a)
{ //realizada em muitos mais pacos para facilitar apredizado
elementos++;
No temp;
if (cabeca==null) cabeca=new No(a,null);
else{
temp=new No(a,null);
temp.altera_prox(cabeca);
cabeca=temp;
}
//se cabeca == null tambem funciona
}
public char remove()
{
No removido;
if (cabeca==null) return '0'; //elementos==0
else
{
elementos--;
removido=cabeca;
cabeca=cabeca.retorna_prox();
Pgina 56

Manual de Curso

MANUAL DE JAVA
return removido.retorna_info();
}
}
public int retorna_elementos()
{
return elementos;
}
public void mostra() //nao deveria estar aqui, e so para debugar
{
No temp=cabeca;
while (temp!=null)
{
System.out.print( "[" + temp.retorna_info() + "]-"
);
temp=temp.retorna_prox();
}
System.out.print("null");
System.out.println();
}
}
Agora pode escolher entre duas verses do programa principal, a verso da esquerda
implementa um loop de entradas do teclado que permite testar iterativamente a classe
Lista, no explicaremos ainda detalhes deste loop, apenas como us-lo. D uma olhada
no cdigo desta verso de programa principal, se acha-lo complicado pode utilizar a
segunda verso presente a direita deste ficheiro e em uma segunda leitura retornar a
verso da esquerda.
Na verso com o loop (1-esquerda) a letra i indica o comando insero, se digitar
i<enter> inserir o caractere <enter> na sua lista, o que normalmente no desejado,
digite ic<enter> para inserir o caractere c. r indica remoo, e m indica que a lista
deve ser mostrada no ecr. Pelo resultado do programa entender melhor esses
comandos rudimentares de teste. Pode achar rudimentar programar assim, mas um
bom mtodo, ver como esta mesma lista depois de testada assim pode ficar bonita se
inserida em um applet e mostrada graficamente.

Manual de Curso

Pgina 57

MANUAL DE JAVA
Escolha uma implementao para compilar:
//Classe principal, Ficheiro Principal.Java versao 1

import Java.io.DataInputStream;
import listas.*;
class Principal {
public static void main(String args[]) {
Lista ml=new Lista(); //ml=minhalista
char o,e; //o=opcao, e=temporario
DataInputStream meuDataInputStream
=new DataInputStream(System.in);
try{
do
{
o
=(char)meuDataInputStream.read();
switch (o) {
case 'i':
e=(char)meuDataInputS
tream.read();
ml.insere(e);
break;
case 'r':
e=ml.remove();
System.out.println(e);
//System.out.flush();
break;
case 'm':
ml.mostra();
System.out.println();
//System.out.flush();
break;
default: ;
}

//Classe principal, Ficheiro Principal.Java


versao 2
import Java.io.DataInputStream;
import listas.*;
class Principal {
public static void main(String args[]) {
char e;
Lista ml=new Lista(); //ml=minhalista
ml.insere('a');
//mesma sequencia da versao com menu
//de programa principal
ml.mostra();
ml.insere('v');
ml.insere('a');
ml.insere('j');
ml.mostra();
e=ml.remove();
System.out.println(e);
ml.mostra();
ml.remove(); //embora o metodo
//remove retorne um valor
ml.remove(); //nestas chamadas,
//este valor de retorno e'
ml.remove(); //ignorado
ml.mostra();
}
}

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

Pgina 58

Manual de Curso

MANUAL DE JAVA
Resultado:

ia
m
[a]-null

Resultado
:

iviaij
m
[j]-[a]-[v]-[a]-null

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

r
j
m
[a]-[v]-[a]-null
r
a
r
v
r
a
m
null
q
//Comentrios
Os programadores que no esto acostumados com recolhaautomtica de lixo podem
achar estranho que retiramos o primeiro elemento da lista simplesmente perdendo
propositalmente a referncia para ele ao emendar o n cabea com o restante:

TIPO ABSTRATO

DE

DADOS

Tipo abstrato de dados, TAD, se preocupa em proporcionar uma abstrao sobre uma
estrutura de dados em termos de uma interface bem definida. O encapsulamento
mantm a integridade do objecto evitando acessos inesperados. O facto de o cdigo
estar armazenado em um s lugar cria um programa modificvel, legvel, coeso.
A idia criar classes que ocultem a sua representao interna as quais podem
geralmente ser modeladas atravs de shopping list approach. Por shopping list
approach entenda que pode modelar sua classe atravs das operaes que ela
suporta, ou seja, antes de comear a implementar recomendvel que se faa uma
lista (semelhante a uma lista de compras) das operaes desejadas para a classe e
depois se escolha a representao interna adequada. Completando este conceito amplo
podemos dizer que uma classe implementa um tipo abstrato de dados.

Manual de Curso

Pgina 59

MANUAL DE JAVA
So exemplos de tipos abstratos de dados:
Uma rvore binria com as operaes usuais de insero, remoo, busca ...
Uma representao para nmeros racionais (numerador, denominador) que
possua as operaes aritmticas bsicas e outras de converso de tipos.
Uma representao para ngulos na forma (Graus, Minutos, Segundos). Tambm
com as operaes relacionadas, bem como as operaes para converter para
radianos, entre outras.
Tipo abstrato de dados um conceito muito importante em programao orientada por
objectos e por este motivo logo apresentado neste manual. Os exemplos seguintes
so simples por no podermos utilizar todos os recursos da linguagem ainda. Dada esta
importncia, a medida em que formos introduzindo novos conceitos exemplificaremos
com aplicaes na implementao tipos abstratos de dados.
Exerccio
Use a estratgia da lista de compras (shopping list approach) para modelar a
interface do tipo abstrato de dados Ponto, tente pensar nas operaes que
geralmente se aplicam a pontos em geometria, tais como distncia a outros
elementos, rotao em torno de outro ponto.
Reimplemente este TAD
adicionando as inmeras alteraes.

TAD FRAO
Neste exemplo implementaremos o tipo abstrato de dados frao. Baseado no conceito
de nmero racional do campo da matemtica. Algumas operaes no foram
implementadas por serem semelhantes s existentes.
Uma aplicao deste TADs consiste em alguns clculos onde pode ocorrer muita perda
de preciso ao longo do programa devido ao uso de aritmtica de ponto flutuante. Por
exemplo: faa exactamente o seguinte em sua calculadora: 5 / 3 * 3 , qual o resultado?
Ao terminar este programa teste a seguinte operao com fraes (5/3)*(3/1), qual ser o
resultado?
RESUMO DAS OPERAES MATEMTICAS ENVOLVIDAS:
Simplificao de frao: (a/b)=( (a/mdc(a,b)) / (b/mdc(a,b)) )
Onde mdc(a,b) retorna o mximo divisor comum de ab.
Soma de frao: (a/b)+(c/d)=( (a.d+c.b) / b.d ) simplificada.
Multiplicao de frao: (a/b) * (c/d)= ( (a*c) / (b*d) ) simplificada.
Igualdade: (a/b)== (c/d) se a*d == b*c.
No igualdade: (a/b) != (c/d) se a*d != b*c
Maior ou igual que: (a/b)(c/d) se a*d b*c
SHOPPING LIST APPROACH PARA O TAD FRAO:
(O conjunto de operaes implementadas esta marcado com . A finalizao dessa
shopping list bem como do programa deixada como exerccio, o qual no deve ser
difcil pois vendo a implementao da soma, o leitor obtm quase que de maneira
directa a implementao da subtrao, o mesmo ocorre para as demais operaes):
Construtor (recebe dois argumentos numricos inteiros)
Simplificao da frao (diviso do numerador e denominador por mximo divisor
comum)
Soma de frao (mtodo recebendo argumento do prprio tipo frao)
Subtrao de frao
Pgina 60

Manual de Curso

MANUAL DE JAVA

Multiplicao
Diviso
Teste de igualdade
Teste de desigualdade
Teste de maior ou igual que
Teste de menor ou igual que
Teste de maior que
Teste de menor que
Impresso no ecr
Rotina de criao com entrada de numerador e denominador pelo teclado
Converso para double
Converso para long
Operao de alterao do numerador
Operao de alterao do denominador
Retorno do valor do numerador e denominador
Outras operaes que o leitor julgar necessrias

CONSIDERAES DE PROJETO
A representao escolhida para o numerador e o denominador da frao ser baseada
no tipo int.
O formato escolhido para os mtodos que implementam as operaes :
TipoDoValorDeRetorno NomedaOperacao(TipoDoOperando ValorDoOperando);
Nesse formato um dos operandos a prpria frao que est recebendo a chamada de
mtodo o outro passado como argumento. Outros formatos equivalentes poderiam ter
sido adotados. Um dos possveis formatos faz com que os dois operandos sejam
passados como argumentos e a frao que est recebendo a chamada de mtodo
executa a operao para esses argumentos retornando o valor. Voltaremos a discutir
essas alternativas de implementao.
Se durante o processo de construo de seu programa, ocorrer a repetio de um certo
trecho de cdigo nos diversos mtodos (repetio da rotina de simplificao nos
mtodos de soma, subtrao), considere a opo de definir este trecho de cdigo como
um mtodo em separado. Se este mtodo no for um mtodo que deva compor,
participar, da interface, mas que ainda assim tem seu padro muito repetido, considere
a possibilidade de defini-lo como private (mtodo mdc).
No existe uma regra de ouro que diga exactamente como projetar as suas classes para
que elas preencham requisitos de portabilidade, robustez, flexibilidade. Todavia uma
recomendaes importantes podem ser feitas para evitar reformulaes durante o
processo de programao: No economize tempo na fase de projeto. Procure antes de
programar, simular o uso de uma classe, seja mentalmente ou atravs de um
prottipo.
O clculo do mximo divisor comum (mdc) de dois inteiros no tem nada a ver com as
operaes a serem oferecidas por fraes, teria a ver com as operaes oferecidas por
um objecto facilidades de clculos (mdc(a,b) , factorial(b) , fibonaci(x), combinacoes(n,k) ). No
entanto a classe frao precisa da operao mdc. Ocorre que j estudamos uma
maneira de implementar um mtodo em uma classe e no oferec-lo atravs da
interface, o qualificador private. Em C++ provavelmente o programador implementaria
mdc como uma funo isolada.

Manual de Curso

Pgina 61

MANUAL DE JAVA
IMPLEMENTAO
Cdigo:
//TAD fracao.
//File Fracao.Java
class Fracao {
private int num,den;
private int mdc(int n,int d)
divisor comum

//numerador, denominador
//metodo private maximo
//metodo de Euclides +- 300

anos AC.
{
if (n<0) n=-n;
if (d<0) d=-d;
while (d!=0) {
int r=n % d;
divisao inteira.
n=d;
d=r;
}
return n;
}
public Fracao(int t,int m)
comum
{
num=t;
den=m;
this.simplifica();
objecto.
}
public void simplifica()
mdc(num,den)
{
int commd;
commd=mdc(num,den);
comum
num=num/commd;
den=den/commd;
if (den<0) { den=-den; num=-num;};
para cima
}

//%=MOD=Resto da

//construtor

//chamada para o mesmo

//divide num e den pelo

//divisor

//move sinal

//operacoes matematicas basicas


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

Manual de Curso

MANUAL DE JAVA
g=new Fracao(num*j.num,den*j.den);
return g;
}
//operacoes de comparacao
public boolean igual(Fracao t)
{ return ((num*t.den)==(den*t.num)); }
public boolean diferente(Fracao t)
{ return ((num*t.den)!=(den*t.num)); }

public boolean maiorouigual(Fracao t)


{ return ((num*t.den)>=(t.num*den)); }
//operacoes de input output
public void mostra()
no video
{ System.out.println("(" + num + "/" + den + ")"); }

//exibe fracao

//operacoes de conversao de tipos


public double convertedbl()
double
{
double dbl;
dbl=((double)num/(double)den);
return dbl;
}
public int converteint()
para int
{
int itng;
itng=num/den;
return itng;
}

//converte para

//converte

public void altera_num(int nn)


{ num=nn; }
public void altera_den(int nd)
{ den=nd; }
public int retorna_num()
{ return num; }
public int retorna_den()
{ return den; }
}

Manual de Curso

Pgina 63

MANUAL DE JAVA
class Principal {
public static void main(String args[])
{
Fracao a,b,c;
a=new Fracao(5,3);
b=new Fracao(2,6);
System.out.print("Esta e' a fracao a: ");
a.mostra();
System.out.print("Esta e' a fracao b: ");
b.mostra();
c=a.soma(b);
System.out.print("c de a+b: ");
c.mostra();
System.out.print("a*b: ");
c=a.multiplicacao(b);
c.mostra();
System.out.print("a+b: ");
c=a.soma(b);
c.mostra();

//c(a+b)

System.out.print("a>=b: ");
System.out.println(a.maiorouigual(b));
System.out.print("a==b: ");
System.out.println(a.igual(b));
System.out.print("a!=b: ");
System.out.println(a.diferente(b));
System.out.print("(int)a ");
System.out.println(a.converteint());
System.out.print("(double)a ");
System.out.println( a.convertedbl());
}
}
Resultado:

Esta e a fracao a: (5/3)


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

//Comentrios
Uma implementao completa do tipo de dados frao tem que verificar por overflow
do numerador e denominador o que ocorre frequentemente quando se trabalha com
nmeros primos entre si (no podem ser simplificados), uma possvel soluo para este
problema fazer uma aproximao e/ou alterar a representao interna da frao para
um tipo com maior numero de bits (de int para long). De qualquer forma estas
extenses so exerccios avanados pois a ltima delas envolve uso de herana.

Pgina 64

Manual de Curso

MANUAL DE JAVA
Exerccios:

Complete o tipo frao com os mtodos faltantes da shopping list approach


long retorna_den(void) {return den;}
long altera_den(int a) {den=a;}
Considerando que os atributos declarados em private no so acessveis fora da
classe, descreva a utilidade desses mtodos. Eles so teis se usados pelos
prprios mtodos de frao?

Implemente o tipo abstrato de dados nmero complexo com as operaes


matemticas inerentes. Faa antes um projeto dos mtodos que sero
implementados,
descreva (detalhadamente) as operaes matemticas
necessrias. Que forma de representao escolher: coordenadas polares ou
rectangulares?

Pesquise sobre matrizes em Java: Error: Reference source not found. Crie um tipo
abstrato de dados matriz que suporte atribuies e leituras de clulas contendo
elementos do tipo float. Crie outros mtodos para este tipo abstrato de dados
como multiplicao por uma constante.

Implemente o tipo abstrato de dados relgio, pesquise as operaes


normalmente oferecidas por relgios reais, o nico objectivo marcar as horas.
Se precisar de inspirao para este exerccio, consulte o exemplo da classe
Contador e seus exerccios.

STRINGS, UM MODELO DE CLASSE


Agora que j estamos programando alguns tipos abstratos de dados, est na hora de
apresentar um exemplo que mostre como comportamento importante para um TAD.
S que desta vez ficaremos do lado do cliente, do utilizador desse tipo abstrato de
dados e no do lado do programador. Estudaremos a classe String oferecida pela
linguagem.
Nos tutoriais desta srie, feitos para outras linguagens ( C++, Modula-3),
recomendvamos como exerccio a implementao do tipo abstrato de dados string,
que deveria suportar operaes de concatenao, substring, acesso a elemento, etc.
Este exerccio no faz sentido em Java porque o tipo String, fornecido com a
linguagem como uma classe da package Java.lang que importada implicitamente em
todos os programas alm disso a sua implementao desta classe bastante completa.
A declarao de Strings se d da mesma forma que os outros objectos: String minhaString;
. O compilador oferece uma facilidade sinttica para a inicializao com valores literais:
String teste=Ola meu amigo; //objecto instanciado com valor Ola meu amigo
Para concatenar Strings use o operador +. Os operandos podem no ser Strings, nesse
caso sero convertidos parpor objectos desta classe, por exemplo se um dos
argumentos for um inteiro, o objecto String correspondente conter o valor literal deste
inteiro.
System.out.println(teste + Andre!); //Ola meu amigo Andre!
teste+= Andre!; //atalho para concatenacao seguida de atribuicao: teste=teste+ Andre!
System.out.println(teste); //totalmente equivalente a primeira
Para obter o comprimento em nmero de caracteres de uma String, chame o mtodo
length() para a String em questo. Para obter o caractere presente na posio 6 da String,
chame o mtodo charAt(); . Note que o primeiro caractere da String est na posio
zero:
Manual de Curso

Pgina 65

MANUAL DE JAVA
char umChar=teste.charAt(6); //um char recebe u
Para obter uma substring, chame o mtodo substring(int a,int b); onde o primeiro
argumento o ndice do incio da substring e o segundo o ndice do fim da
substrings, os caracteres em a e b tambm so includos:
String aStr=teste.substring(0,2); //aStr recebe ola
Para transformar todos os caracteres de uma String em letras maisculas basta executar
o mtodo toUpperCase();
teste=teste.toUpperCase(); //teste fica igual a OLA MEU AMIGO
Um mtodo interessante para utilizar em checagem de padres em texto
indexOf(String busque); . Este mtodo retorna o ndice posio inicial de ocorrncia de
busque na String para a qual foi chamado o mtodo:
teste.indexOf(MEU);
//retorna 4
Analogamente, lastIndexOf(String busque), retorna o ndice de ocorrncia da substring, s
que agora do procurando do fim para o comeo.
teste.indexOf(M); //resulta em 9 (logo a seguir do ultimo A que esta na posicao 8)
Para comparao de igualdade use:
test.equals(OLA MEU AMIGO); //retorna valor booleano
Alm disso, a classe String define mtodos para converso dos tipos bsicos para seus
valores na forma de String, pode achar esses mtodos um pouco estranhos, pois eles
tem todos os mesmos nomes e no precisam de um objecto para serem chamados, eles
so chamados para a classe:
String.valueOf(3); //argumento e naturalmente um inteiro, retorna 3
String.valueOf(3.1415); //argumento e double, retorna 3.1415
Os mtodos de nome valueOf so uma padronizao de mtodos de converso entre
tipos encontrados em algumas das classes pr-definidas na linguagem, principalmente
nas classes wrappers que foram exemplificadas com a classe Integer.
Cdigo:
class StringTest {
public static void main (String args[]) {
String teste="Ola meu amigo";
System.out.println(teste + " Andre!"); //Ola meu amigo Andre!
teste+=" Andre!"; //atalho para concatenacao seguida de atribuicao
System.out.println(teste); //totalmente equivalente a primeira
char umChar=teste.charAt(5); //um char receber e
System.out.println("Andre "+umChar+teste.substring(3,13));
teste=teste.toUpperCase(); //teste fica igual a OLA MEU AMIGO ANDRE!
for (int i=0;i<teste.length();i++) //imprimindo caracteres um a um
{
System.out.print(teste.charAt(i));
}
System.out.println(); //pula uma linha
System.out.println(teste.indexOf("AMIGO")); //retorna 8
Pgina 66

Manual de Curso

MANUAL DE JAVA
System.out.println(teste.indexOf("biba")); //nao acha, retorna -1
System.out.println(teste.lastIndexOf("AMIGO")); //retorna 8
System.out.println(String.valueOf(3.1415f)); //Metodo chamado para a classe
}
}
Resultado:

Ola meu amigo Andre!


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

//Comentrios
O cdigo fonte disponvel com o compilador constitui uma tima fonte de aprendizado
sobre como construir componentes de software reutilizveis no estilo de programao
orientada por objectos, leia-o sempre que estiver disponvel e quando no estiver,
preste ateno na sua interface.
deve ter notado que exceto pelo mtodo toUpperCase() a classe String no permite
alteraes no seu estado depois de ter sido criada. Isto decorre da deciso do Java
team de implementar duas classes para garantir a funcionalidade e segurana no uso
de strings, so elas: String e StringBuffer. StringBuffer permite ser modificada, abaixo
apresentamos uma tabela de seus principais mtodos, para maiores informaes
consulte a documentao de Java.lang.*
Tabela de mtodos da classe StringBuffer
StringBuffer endereco=http://www.Java.com; //Erro! Esta facilidade para instanciao no
permitida para a classe StringBuffer, ao envs disso use o construtor descrito abaixo.
StringBuffer endereco=new StringBuffer(http://www.Java.com); //agora sim esta correto
endereco.append("/fim.html"); //concatena e atribui, forma: http://www.Java.com/fim.html
endereco.charAt(5); //retorna o caractere /
System.out.println(endereco + /outro.html); //o operador+ tambem funciona para StringBuffer
endereco.insert(15,"soft"); //forma http://www.javasoft.com/fim.html
endereco.setCharAt(25,O); //forma http://www.javasoft.com/fOm.html
System.out.println(endereco.toString()); //retorna objecto String equivalente
Exerccios:

Manual de Curso

Melhore um dos exerccios anteriores introduzindo um nome para o objecto. Este


nome pode ir nas sadas de tela executadas pelo objecto e o nome dado para
o construtor como uma String. No se esquea de prover mtodos como String
get_name().

Este um exerccio avanado. Busca de padres em texto uma operao


bastante comum em editores. A busca de informaes na internet quando feita
por palavras chave, executada por aplicativos que podem ter como estratgia
a contagem do nmero de ocorrncias de certas palavras nos textos
cadastrados.
Neste exerccio far parte desse trabalho de busca de informaes, eu vou te
orientar como: Crie um mtodo que aceita como argumento uma String grande
que pode ter vindo de vrias fontes (no importa quais). Este mtodo pode
pertencer a uma classe de nome EstatisticasDeTexto e deve quebrar o argumento
String em palavras separadas por espaos ( j pode fazer isso com os mtodos
Pgina 67

MANUAL DE JAVA
conhecidos, mas talvez queira utilizar a classe StreamTokenizer). Para cada uma
destas palavras este mtodo faz uma busca na estrutura de armazenamento de
palavras da classe, se a palavra no constar, deve ser includa com
multiplicidade 1, caso ela conste na estrutura, apenas sua multiplicidade deve
ser incrementada.
Um problema pode surgir. A estrutura deve ser capaz de crescer de tamanho
durante as vrias chamadas de mtodos com Strings para serem processadas.
Se utilizar vector uma opo realocar o vector com o dobro de espaos. Outra
opo utilizar uma lista ligada.

Crie uma classe que agrega um stream de entrada de dados ligado ao teclado.
Coloque esta classe como intermediria na recepo dos dados de modo que ela
testa para todo caractere lido se ele igual ao caractere \n. Se o caractere lido
for igual a \n ele deve ser retirado da String lida (use os mtodos substring e
concatenao ensinados).
Faa com que a chamada do mtodo readline de sua classe dispare o a chamada
do mtodo readline do stream agregado nela.
A sua classe actuar como um filtro de dados do teclado. Mantendo a analogia
do exemplo introdutrio sobre Streams, estaremos lidando com conexes entre
canos, ou seja para os dados chegarem do teclado ao seu programa eles devem
passar pela sua classe filtro.

TAD E ALOCAO DINMICA.


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

3:1
6:12
9:32

Vector equivalente:
1:3 2:32 3:1 4:23

5:90

6:12

7:21

8:08

9:32

Vantagem da representao linear (vector): para referenciar uma posio gasta-se


somente um inteiro contra dois da representao matriz. Pode-se considerar posies
que apontam para outras posies, basta interprectar o contedo do vector como um
ndice linear. Este tipo de construo pode ser til em Java, pois a linguagem no
possui ponteiros este um dos motivos de estarmos ensinando esta tcnica.
Desvantagem da representao linear (vector): necessrio criar funes de
converso de ndice na forma (linha,coluna) para (ndice linear) e de (ndice linear)
para (coluna) ou (linha). So as funes lin e col e linear deste exemplo. Em uma
primeira leitura, no preciso entender os clculos com ndices, apenas o uso dos
mtodos que oferecem estes clculos.
Para ns, clientes da classe Matriz2DInt, os elementos sero indexados de 1 at m
(arbitrrio) em termos de ndice linear. Em termos de linhas e colunas, eles sero
indexados de (1,lmax) e de (1,cmax). O facto da linguagem adotar ndices de 0 at mPgina 68
Manual de Curso

MANUAL DE JAVA
1 para matrizes e vectores no importa, ns construmos em volta dessa representao
para que nosso objecto fornea, trabalhe na conveno mais natural de indexao para
humanos: 1 at m. Quanto as operaes de ndices, apenas verifique a veracidade para
valores arbitrrios de uma matriz como a desenhada anteriormente tentar entend-las
leva tempo e eu sei que capaz de programa-las.
Dentre os objectivos de um programador de uma linguagem orientada por objectos
podemos citar: escrever pouco cdigo, escrever cdigo correto, tornar o seu cdigo
reutilizvel. A criao de componentes de software reutilizveis, enormemente
facilitada pela portabilidade da linguagem Java. Programas exemplo posteriores
(segunda parte) mostraro como reutilizar esta classe matriz para a criao de um jogo
de quebra cabea de quadradinhos deslizantes. Os quadradinhos devem ser movidos na
moldura de modo a formar uma imagem onde um dos quadrados vazio.
SHOPPING LIST APPROACH PARA O TAD MATRIZ2DInt
(As operaes implementadas esto marcadas com . As operaes marcadas com
devem ser implementadas como exerccio avanado cujo objectivo completar um de
seus primeiros componentes de software reutilizvel, estamos incluindo desta vez os
atributos tambm).
private
private
private
private

int
int
int
int

linhas; //numero de linhas da matriz


colunas; //numero de colunas da matriz
tam; //=linhas*colunas
lc[]; //=new int[linhas*colunas]=vector[0..(tam-1)]=~matriz[l][ c]

Construtor (recebe dois argumentos numricos inteiros, nmero de linhas e de


colunas)
Converso de linha e coluna para ndice linear
Converso de ndice linear para coluna.
Converso de ndice linear para linha.
Operao de troca de elementos da matriz com dois argumentos do tipo ndice linear.
Operao de troca de elementos da matriz com argumentos do tipo (linha e coluna).
Operao de atribuio a elemento da matriz indicado por ndice linear.
Operao de atribuio a elemento da matriz indicado por linha e coluna.
Operao de retorno do contedo de posio da matriz indicada por um ndice linear.
Operao de retorno do contedo de posio da matriz indicada por linha e coluna.
Representao do nmero de colunas, permitindo acesso de leitura ao cliente.
Representao do nmero de linhas, permitindo acesso de leitura ao cliente.
Cdigo:
Programa exemplo da classe Matriz2DInt.
class Matriz2DInt {
private int linhas; //numero de linhas da matriz
private int colunas; //numero de colunas da matriz
private int tam;
//=linhas*colunas
private int lc[]; //=new int[linhas*colunas]=vector[0..(tam-1)]=~matriz[l][ c]
public Matriz2DInt(int l,int c)
//cria matriz LxC
{
lc=new int[l*c]; //l,c dimensoes ; lc vector[l*c]
linhas=l;
colunas=c;
tam=linhas*colunas;
}
//qualquer uma das funcoes abaixo retorna int negativo se nao obteve sucesso
public int linear(int alin,int acol)
//ind linear a partir de linha e coluna
Manual de Curso

Pgina 69

MANUAL DE JAVA
//nao modifica nenhum atributo
{
int result; //valor de retorno para todos os metodos ...
if ( (0<alin) && (alin<=linhas) && (0<acol) && (acol<=colunas) )
{ result=(alin-1)*colunas+acol; }
else
{ result=-1; }
return result;
}
public int col(int indlin)
//coluna a partir do indice linear
//nao modifica nenhum atributo da classe
{
int result;
if ( (0<indlin) && (indlin<=tam) )
{ result=(indlin % colunas);
if (result==0)
{ result=colunas; }
}
else
{ result=-1; }
return result;
}
public int lin(int indlin)
//linha a partir do indice linear
//nao modifica nenhum atributo da classe
{
int result;
if ( (0<indlin) && (indlin<=tam) )
{ result=(int)( ( (indlin-1)/colunas )+1
else
{ result=-1; }
return result;
}

); }

public boolean trocaindlin(int i,int j)


//argumentos: 2 indices lineares
// retorna se conseguiu,ou nao conseguiu(false)
{
int aux; //auxiliar na troca
if ( (0<i) && (i<=tam) && (0<j) && (j<=tam) )
{
aux=lc[i-1];
//efetua a troca
lc[i-1]=lc[j-1]; //embora para usuario a matriz vai de 1 ate l*c
lc[j-1]=aux; //para mim vai de o ate l*c-1
return true; //sucesso
}
else
{ return false; } //falhou
}
public boolean atribuiindlin(int i,int v)
//atribui v ao indice i
//retorna true se conseguiu, false nao conseguiu
{
if ( (0<i) && (i<=tam) )
{
lc[i-1]=v; //efetua a atribuicao
return true;
}
Pgina 70

Manual de Curso

MANUAL DE JAVA
else
{ return false; } //falhou
}
public int retornaindlin(int indlin)
//retorna conteudo do indice i
//retorna -1 se nao conseguiu
{
int result;
if ( (0<indlin) && (indlin<=tam) )
{ result=lc[indlin-1]; }
else
{ result=-1; }
return result;
}
public int getl()
//retorna numero de linhas
{
return linhas;
}
public int getc()
//retorna numero de colunas
{
return colunas;
}
public int gett()
//retorna tamanho
{
return tam;
}
}
//Classe principal, Ficheiro Principal.Java
class Principal {
public static void main(String args[]) {
Matriz2DInt teste;
teste=new Matriz2DInt(5,10); //5 linhas 10 colunas
for(int i=1;i<teste.gett();i++) {teste.atribuiindlin(i,0); }
System.out.println("linear(5,5)="+ teste.linear(5,5) );
System.out.println("Atribuindo 2 a posicao (5,5)");
teste.atribuiindlin(teste.linear(5,5),2);
System.out.println("Atribuindo 4 a posicao (4,2)");
teste.atribuiindlin(teste.linear(4,2),4);
System.out.println("Trocando estas posicoes");
teste.trocaindlin(teste.linear(5,5),teste.linear(4,2));
System.out.println("Conteudo da posicao (5,5):"+teste.retornaindlin(teste.linear(5,5)));
}
}
Resultado:

Manual de Curso

linear(5,5)=45
Atribuindo 2 a posicao (5,5)
Atribuindo 4 a posicao (4,2)
Trocando estas posicoes
Pgina 71

MANUAL DE JAVA
Conteudo da posicao (5,5):4
Matrizes definidas na linguagem
As matrizes definidas pela linguagem seguem uma sintaxe de declarao e uso
semelhante a sintaxe de vectores:
int custos[][]=new int [20,30]; //vinte por trinta, nao importa qual e linha qual e coluna
custos[0][0]=145;
int a=custos[0][0];
Curiosidade
Houve um caso de vrus na internet que se baseava no acesso a ndices fora de um
vector para gravar por cima de instrues do sistema operacional o cdigo que
garantisse a sua multiplicao. No por acaso, Java, impede o acesso a posies fora do
vector.
Dica de programao
Saiba que uma prtica bastante til na fase de testes de um programa introduzir
mensagens informativas em pontos convenientes. Quando trabalhando com objectos tal
prtica pode ser utilizada de vrios modos, por exemplo pode-se inserir uma
mensagem no construtor de uma classe para verificar quando os objectos so criados e
se so criados correctamente.
Exerccios

Pgina 72

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

Note que no foram impostas restries para ndices invlidos da matriz de


modo que nosso componente de software falha se no utilizado correctamente.
Adote uma estratgia de deteco de ndices invlidos e use-a de modo a evitar
o travamento do programa. Veremos como fazer esta checagem de ndices de
forma segura e uniforme em Exception handling.

Implemente um mtodo chamado ordena para o tipo abstrato de dados matriz


definido acima. Use qualquer algoritmo de ordenao para deixar a matriz
ordenada como um vector quebrado em vrias linhas. De que forma a facilidade
que a interface oferece de enxergar a matriz como um vector facilita este
processo?
Ser que este mtodo ordena realmente imprescindvel para esta classe? Os
mtodos criados at o momento j no formam um modelo computacional
suficiente para que o cliente desta classe possa definir em seu cdigo os
mtodos de ordenao de matrizes que desejar? A dvida sobre a necessidade
ou no de um mtodo em uma classe bastante frequente.
Guardadas as devidas propores, programao orientada por objectos como
brincar com blocos de encaixar, ou legos. Existem blocos que no se encaixam,
existem blocos que podem ser construdos atravs de outros menores, mas que
ainda sim existem porque so bastante usados, e a tarefa de compo-los a partir
de outros blocos torna-se inconveniente. Existem blocos sem os quais no se
pode construir praticamente nada.

Crie um mtodo de nome preenche, que inicializa todas as posies da matriz


com o valor de um de seus argumentos. Este mtodo pode ser composto pelos
mtodos j implementados?

*Defina um programa chamado grandes que implementa o tipo abstrato de


dados nmeros grandes e inteiros, este tipo deve utilizar um vector do tipo
numrico que achar conveniente para representar os algarismos. Talvez estudar
Manual de Curso

MANUAL DE JAVA
circuitos lgicos (somadores, multiplicadores) o ajude a implementar as quatro
operaes matemticas bsicas para estes tipo em termos de look ahead
carrier e outras tcnicas de performance de implementao de operaes. Se
sua preocupao com eficincia e espao, pode utilizar cada posio do vector
para representar mais de um dgito, mas haver muito trabalho em termos de
tratar overflow e underflows.

Manual de Curso

Note que na alocao da matriz:


public Matriz2DInt(int l,int c)
no verificado se os valores passados so maiores que 0, faa este teste.
Quando explicarmos exception handling ter mtodos melhores de lidar com
esses erros.

Pgina 73

MANUAL DE JAVA
HERANA
Existe uma viso um pouco tacanha de orientao por objectos como uma simples
maneira de organizar melhor o seu cdigo. Essa viso facilmente desmentida pelos
conceitos de encapsulamento, interfaces, packages e outros j apresentados. Neste
tpico apresentaremos o conceito de herana, fundamental para programao orientada
por objectos e um dos factores de sucesso desta como muito mais que uma simples
maneira de organizar melhor seu cdigo.
Um dos aspectos que distinguem objectos de procedimentos e funes que o tempo
de existncia de um objecto pode ser maior do que o do objecto que o criou. Isto
permite que em sistemas distribudos objectos criados em um local, sejam passados
atravs da rede para outro local e armazenados l quem sabe na memria ou mesmo
em um banco de dados.
Existem classes que podem ser obtidas na Internet para fazer interface com bancos de
dados SQL, servindo principalmente para facilitar esta faceta da programao na
internet que bastante limitada pelas restries de segurana da linguagem.

HIERARQUIAS DE TIPOS
Neste
tpico
mostraremos
como
construir
hierarquias
de
tipo
por
generalizao/especializao. Para entender o que generalizao especializao e as
regras de atribuio entre elementos dessas hierarquias, acompanhe a seguinte
comparao:
Se vai a um restaurante e pede o prato de frutos do mar, natural que aceite
uma lagosta com catupiry, ou ento fil de badejo. Mas se o garom lhe serve
uma salada de tomates isto no se encaixa no pedido. Por outro lado, se o seu
pedido for peixe, uma lagosta com catupiry, embora muito saborosa no serve
mais, assim como a salada. Note que peixe e lagosta so especializaes de
frutos do mar.
Generalizao e Especializao so ferramentas para lidar com complexidade, elas so
abstraes. Os sistemas do mundo real apresentam complexidade muito maior que
ordenar um prato listado em um cardpio. O uso de generalizao e especializao
permite controlar a quantidade de detalhes presente nos seus modelos do mundo real,
permite capturar as caractersticas essenciais dos objectos e tratar os detalhes de
forma muito mais organizada e gradual.
Existe muito mais para falar sobre herana, principalmente no que diz respeito a
polimorfismo de incluso e acoplamento dinmico de mensagens, tpicos estes que
sero abordados em separado.

MANUAL DE JAVA

UMA HIERARQUIA SIMPLES.


Construiremos uma hierarquia de tipos simples para demonstrar herana pblica em
Java.

Comentrios:
O diagrama acima representa a hierarquia de classes implementada neste exemplo e
foi obtido a partir da janela de edio de uma ferramenta case para programao
orientada por objectos.
A classe ponto que est no topo da hierarquia chamada de classe base, enquanto que
as classes ponto_reflete e ponto_move so chamadas classes filhas ou herdeiras. As
classes da hierarquia so simples, ponto_move apresenta o mtodo move, j abordado
neste manual em , ponto_reflete apresenta o mtodo (reflete) que inverte o sinal das
coordenadas.
Dada a simplicidade das classes o leitor poderia se perguntar, porque no juntar as trs
em uma s. A pergunta faz sentido, mas e se quisssemos criar uma classe Ponto que
no se movesse, apenas refletisse e outra que s se movesse? E se quisssemos
projetar nosso programa segundo uma hierarquia de especializao / generalizao da
classe Ponto? O exemplo mostra como faz-lo.
Na herana as classes filhas passam a atender pelos mesmos mtodos e atributos public
da classe pai, as classes filhas podem acrescentar mtodos, atributos e at redefinir
mtodos herdados (veremos mais tarde). Por isso que se diz que as classes
subclasses garantem pelo menos o comportamento behaviour das superclasses,
podendo acrescentar mais caractersticas. Os atributos encapsulados (private) da classe
pai no so acessveis directamente na classe filha a no ser que sejam qualificados
como protected ou public, veja .
Diagrama de acesso, visibilidade, dos elementos da classe pai para uma
classe filha ou
herdeira. Os atributos e mtodos da classe pai so classificados quanto
ao
encapsulamento. A parte sombreada significa no visvel, encapsulado.
*As duas so consideradas como sendo do mesmo package.

Pgina 76

PUBLIC
PRIVATE
PROTECTED
PACKAGE*

Manual de Curso

MANUAL DE JAVA
Construtores e herana
No construtor de uma classe filha o programador pode incluir a chamada do construtor
da classe pai existente nela. Para referenciar a classe pai use a keyword super de
modo analogo a this (objecto corrente).
Cdigo:
Hierarquia de generalizao e especializao.
//Classe Ponto
class Ponto {
private float x,y;
public Ponto(float ax,float ay) //omita o valor de retorno!
//garante o estado do objecto
{
this.x=ax; this.y=ay;
}
public void inicializa(float a,float b)
{
this.x=a; this.y=b;
}
public float retorna_x()
{
return x;
}
public float retorna_y()
{
return y;
}
public void altera_x(float a)
{
this.x=a;
}
public void altera_y(float b)
{
this.y=b;
}
public void mostra()
{
System.out.println( "(" + this.x + "," + this.y + ")" );
}
}
//Classe PtoMove
class PtoMove extends Ponto {
//adicione algum atributo private se quiser
public PtoMove(float a,float b)
{
super(a,b); //chamada do construtor da classe pai
Manual de Curso

Pgina 77

MANUAL DE JAVA
}
public void move(float dx,float dy)
{
this.altera_x(retorna_x()+dx);
this.altera_y(retorna_y()+dy);
}
}
//Classe PtoReflete
class PtoReflete extends Ponto {
//adicione algum atributo private se quiser
public PtoReflete(float a, float b)
//construtor
{
super(a,b); //chamada de construtor da classe pai ou superclasse
}
void reflete()
//troca o sinal das coordenadas
{
this.altera_x(-retorna_x());
this.altera_y(-retorna_y());
}
}
//Classe principal, Ficheiro Principal.Java
class Principal {
public static void main(String args[]) {
PtoReflete p1=new PtoReflete(3.14f,2.72f);
System.out.println("Criando PontoReflete em 3.14,2.72");
p1.reflete();
System.out.println("Refletindo este ponto.");
p1.mostra();
PtoMove p2=new PtoMove(1.0f,1.0f);
System.out.println("Criando PontoMove em 1.0,1.0");
p2.move(.5f,.5f);
System.out.println("Movendo este ponto de 0.5,0.5");
p2.mostra();
}
}
Resultado:

Pgina 78

Criando PontoReflete em 3.14,2.72


Refletindo este ponto.
(-3.14,-2.72)
Criando PontoMove em 1.0,1.0
Movendo este ponto de 0.5,0.5
(1.5,1.5)

Manual de Curso

MANUAL DE JAVA
//Comentrios
Os atributos x e y da classe Ponto esto declarados como private. Pelo diagrama anterior
ao programa, atributos private no so visveis aos descendentes na hierarquia. E de
facto ns alteramos esses atributos (reflete e move) atravs de chamadas a mtodos
public da classe pai, chamadas de mtodos que impliquem em acesso indireto a
atributos da mesma classe parecem ser um pouco ineficientes. Lembre-se que os
mtodos public sempre so visveis.
Exerccios

Programe e teste a hierarquia representada abaixo:

A classe forma no tem um significado prtico, uma abstrao, no pode desenhar


(mostrar) uma forma, no entanto neste programa poder instanci-la. Esta classe est
na hierarquia, somente para capturar as caractersticas comuns a Ponto e Rectangulo.
Em
aprenderemos como definir estas classes abstractas de forma mais condizente
com o paradigma de orientao por objectos.
O mtodo mostra deve imprimir no ecr os atributos destas classes.

PROTECTED
Quando vimos o tpico encapsulamento, foi mencionado que private era o modo de
encapsulamento mais restritivo, seguido de protected, package e depois public (o mais
aberto). Naquele tpico mostramos um exemplo para cada tipo de encapsulamento,
exceto protected que depende da existncia de uma hierarquia para ser demonstrado.
Igual ao exemplo anterior, mas agora tornando os atributos da classe pai acessveis
para as classes filhas atravs do uso de protected. Protected deixa os atributos da classe
pai visveis, acessveis hierarquia abaixo. Mas para o restante do programa tem o
mesmo efeito que private.
Outra frase sobre protected: A herana permite que uma subclasse ganhe acesso a
declaraes protected de sua superclasse, mas o utilizador no percebe isso, para o
utilizador (uma classe externa) o que continua existindo o que public.

Manual de Curso

Pgina 79

MANUAL DE JAVA
Diagramas de acesso, visibilidade, de atributos e mtodos de uma classe pai para uma
classe filha ou herdeira:
Para uma classe filha em outro package ( herdando de uma classe
PRIVATE
pronta em Java)
PROTECTED
PACKAGE
PUBLIC
O que o restante do programa v das declaraes da classe pai na
classe filha.
(por restante do programa entenda: outros packages e outras
hierarquias)

PRIVATE
PROTECTED
PACKAGE
PUBLIC

Cdigo:
O mesmo exemplo s que usando protected.
//Classe Ponto
class Ponto {
protected float x,y;
public Ponto(float ax,float ay) //omita o valor de retorno!
//garante o estado do objecto
{
this.x=ax; this.y=ay;
}
public void inicializa(float a,float b)
{
this.x=a; this.y=b;
}
public float retorna_x()
{
return x;
}
public float retorna_y()
{
return y;
}
public void altera_x(float a)
{
this.x=a;
}
public void altera_y(float b)
{
this.y=b;
}
public void mostra()
{
System.out.println( "(" + this.x + "," + this.y + ")" );
}
}
Pgina 80

Manual de Curso

MANUAL DE JAVA
//Classe PtoMove
class PtoMove extends Ponto {
//adicione algum atributo private se quiser
public PtoMove(float a,float b)
{
super(a,b);
}
public void move(float dx,float dy)
{
x=x+dx; //aqui continuam acessiveis, em main nao
y=y+dy; //acesso directo, sem passar por metodo
}
}
//Classe PtoReflete
class PtoReflete extends Ponto {
//adicione algum atributo private se quiser
public PtoReflete(float a, float b)
{
super(a,b); //chamando o construtor da classe pai
}
void reflete()
{
x=-x;
y=-y;
}
}
//Classe principal, Ficheiro Principal.Java
class Principal {
public static void main(String args[]) {
PtoReflete p1=new PtoReflete(3.14f,2.72f);
System.out.println("Criando PontoReflete em 3.14,2.72");
p1.reflete();
System.out.println("Refletindo este ponto.");
p1.mostra();
PtoMove p2=new PtoMove(1.0f,1.0f);
System.out.println("Criando PontoMove em 1.0,1.0");
p2.move(.5f,.5f);
System.out.println("Movendo este ponto de 0.5,0.5");
p2.mostra();
}
}

Manual de Curso

Pgina 81

MANUAL DE JAVA
Resultado:

Criando PontoReflete em 3.14,2.72


Refletindo este ponto.
(-3.14,-2.72)
Criando PontoMove em 1.0,1.0
Movendo este ponto de 0.5,0.5
(1.5,1.5)

O qualificador protected termina com os modos de encapsulamento de atributos e


mtodos, portanto faremos uma reviso final, utilize os nmeros dessa tabela para
verificar visualmente o tipo de encapsulamento no diagrama a seguir. vai aprender a
olhar para este diagrama e enxergar tudo o que aprendemos nesse assunto, os
atributos e mtodos que estamos preocupados em encapsular so os da classe mais
escura:
MODO

REPRESENTAO

LIMITE DE VISIBILIDADE

4)private

Representao no diagrama: a prpria Este o nvel de encapsulamento mais


classe escura.
restritivo. A visibilidade das declaraes
limita-se ao envoltrio da classe.
3) protected
Representao no diagrama:
A visibilidade das declaraes se limita
a hierarquia abaixo da classe escura.
prpria classe e as classes herdeiras dela.
2)Nada
Representao no diagrama:
A visibilidade das declaraes se limita a
especificado retngulo envolvendo as classes prpria classe e as classes do mesmo
package
pintadas.
package, mas no s classes herdeiras, .
Classes herdeiras no precisam ser do
mesmo package.
1 )public
Representao no diagrama:
Estas declaraes so sempre acessveis.
todas as classes.

O diagrama acima mostra as reas de visibilidade de cada tipo de modificador aplicado


aos atributos da classe destacada. Os retngulos grandes, representam os packages,
optamos por construir a hierarquia da esquerda dentro do mesmo package o que nem
sempre feito. Normalmente quando estende uma classe das packages que vem com
a linguagem, sua classe herdeira no pertence a aquela package, mas pertence a
hierarquia, saindo fora dos retngulos maiores como na hierarquia da direita. Suponha
que todas as classes so declaradas como public. Existem algumas declaraes de
qualificadores de atributos que no fazem sentido com classes private e so erros de
compilao.

Pgina 82

Manual de Curso

MANUAL DE JAVA

REDEFINIO DE MTODOS HERDADOS


Uma classe filha pode fornecer uma outra implementao para um mtodo herdado,
caracterizando uma redefinio overriding de mtodo. Importante: o mtodo deve ter
a mesma assinatura (nome, argumentos e valor de retorno), seno no se trata de uma
redefinio e sim sobrecarga overloading. A redefinio garante que o mtodo ter o
mesmo comportamento que o anterior isto faz com que as subclasses possam ser
atribudas a variveis da superclasse pois atendem a todas as operaes desta.
Este exemplo igual ao exemplo anterior, mas agora redefinindo o mtodo mostra para
a classe filha PtoReflete. Na verdade este exemplo deveria pertencer ao tpico de
polimorfismo, contudo, nos exemplos seguintes usaremos tambm redefinies de
mtodos, portanto faz-se necessrio introduzi-lo agora. Teremos mais explicaes sobre
o assunto.
No nosso exemplo a classe PtoReflete redefine o mtodo mostra da classe pai, enquanto
que a classe herdeira PtoMove aceita a definio do mtodo mostra dada pela classe
Ponto que sua classe pai.
Cdigo:
//Insira aqui o ficheiro da classe Ponto do exemplo anterior: Protected

//Insira aqui o ficheiro da classe PtoMove do exemplo anterior: Protected

//Classe PtoReflete
class PtoReflete extends Ponto {
//adicione algum atributo private se quiser
public PtoReflete(float a, float b)
{
super(a,b); //chamando o construtor da classe pai
}
public void mostra()
{
System.out.println( "X:" + this.x + " Y:" + this.y );
}
void reflete()
{
x=-x;
y=-y;
}
}

//Insira aqui o ficheiro da classe Principal do exemplo anterior: Protected

Manual de Curso

Pgina 83

MANUAL DE JAVA
//Comentrios
No caso de redefinio de mtodos, a busca da implementao do mtodo a ser
executado ocorre de baixo para cima na hierarquia. Exemplo: se tem um objecto
PtoReflete e chama o mtodo retorna_x() para ele, primeiro o compilador procura se
PtoReflete possui ou no uma implementao para este mtodo, no caso no possui,
ento a busca feita nos mtodos public da superclasse, onde a implementao de
retorna_x() achada.

Exerccios

Teste redefinio de mtodos


colocando System.outs em mtodos da
hierarquia, tais como:
System.out.println(Metodo redefinido na classe X, chamado.) ;

INTERFACES, UMA ALTERNATIVA PARA HERANA MLTIPLA


Herana mltipla:
Herana mltipla a capacidade de uma classe herdar de
duas ou mais classes, por exemplo a classe radio-relgio
herdar da classe rdio e da classe relgio. C++ apresenta
herana mltipla, e tambm maneiras de tratar os
problemas decorrentes de seu uso. Um dos problemas
que podem surgir o conflito de nomes de atributos ou
mtodos herdados desse tipo de herana. Uma das
estratgias adotadas para resolver estes conflitos o
renaming ou renomeamento desses nomes iguais
presentes nas superclasses.
Tendo o seguinte significado: A classe herdeira tem
comportamento, behaviour, semelhante ao das duas
classes pais. Um outro exemplo de interface seria a classe
audio-vdeo que herda da classe audio e da classe vdeo.

Java por motivos de simplicidade, abandona a idia de herana mltipla, cedendo lugar
ao uso de interfaces. Interfaces so um conjunto de mtodos e constantes (no contm
atributos). Os mtodos definidos na interface so ocos ou desprovidos de
implementao. Classes podem dizer que implementam uma interface, estabelecendo
um compromisso, uma espcie de contrato, com seus clientes no que se refere a
prover uma implementao para cada mtodo da referida interface.. Ao cliente, pode
ser dada a definio da interface, ele acaba no sabendo o que a classe , mas sabe o
que faz.
Quem programa em Objective C, deve ver as interfaces como algo semelhante ao
conceito de protocolos.
Pgina 84
Manual de Curso

MANUAL DE JAVA
Neste exemplo usaremos uma interface de nome imprimvel para capturar as
caractersticas comuns as classe que podem ser imprimidas em algum dispositivo de
sada de dados.
Cdi
Interfaces
go:
public interface Imprimivel { //alem das classes, so interfaces pode ocupar um ficheiro
final char nlin='\n'; //nova linha
public String toString();
//forma preferida para impressao no ecr
public void toSystemOut();
}
public class Produto implements Imprimivel {
//um produto comercial qualquer
protected String descricao;
protected int quantidade;
public Produto(String d,int q)
{
descricao=d;
quantidade=q;
}
public String toString()
{
return new String(" "+descricao+" "+quantidade);
}
//forma preferida para impressao no ecr
public void toSystemOut()
{
System.out.print(descricao + quantidade);
}
}
//Classe principal, Ficheiro Principal.Java
class Principal {
public static void main(String args[]) {
Produto ump=new Produto("macarrao", 100);
ump.toSystemOut();
System.out.println();
System.out.println(ump.toString());
}
}
Resultado:

macarrao100
macarrao 100

//Comentrios
O paradigma de orientao por objectos est refletido na capacidade de herana e
encapsulamento das interfaces. No caso deste exemplo, a interface foi declarada como
Manual de Curso

Pgina 85

MANUAL DE JAVA
public, mas se nada fosse especificado ela pertenceria ao package dela, ou seja os
modos de encapsulamentos so semelhantes aos de classes.
Uma interface poderia estender a interface Imprimivel:
interface Imprimivel2 extends Imprimivel {
}
Interfaces tem sido representadas por retngulos de bordas arredondadas ligadas as
classes que as implementam por linhas tracejadas.
Muitos confundem interfaces com classes e o acto de implementar uma interface com o
acto de estender ou herdar uma classe. Por isso a relao entre interfaces e herana
ser explicada s agora, depois que j pensou no assunto.
Uma classe Produto2 herda da classe Produto(nosso exemplo) que implementa a
interface Imprimivel. A classe produto j fez a parte difcil que implementar a
interface, agora a classe Produto2 pode optar por aceitar ou redefinir os mtodos
herdados, ou seja: A interface um dos tems que herdado de uma classe, assim
como os atributos e mtodos.
Exerccios

Pgina 86

Defina uma interface para um conjunto de classes que representam figuras


geomtricas que podem ser desenhadas no ecr.

Manual de Curso

MANUAL DE JAVA
POLIMORFISMO, CLASSES ABSTRACTAS
Existem vrias classificaes e tipos de polimorfismo. C++ apresenta vrios tipos de
polimorfismo . Java apresenta um conjunto mais reduzido evitando principalmente
polimorfismos ad-hoc.
Polimorfismo, do grego: muitas formas. Polimorfismo a capacidade de um operador
executar a aco apropriada dependendo do tipo do operando. Aqui operando e
operador esto definidos num sentido mais geral: operando pode significar argumentos
atuais de um procedimento e operador o procedimento, operando pode significar um
objecto e operador um mtodo, operando pode significar um tipo e operador um objecto
deste tipo.

REDEFINIO DE MTODOS PARA UMA CLASSE HERDEIRA


Este exemplo j foi apresentado em . Tambm trata-se de um polimorfismo, pode ser
classificado como polimorfismo de incluso. Um mtodo uma redefinio de um
mtodo herdado, quando est definido em uma classe construda atravs de herana e
possui o mesmo nome, valor de retorno e argumentos de um mtodo herdado da
classe pai. A assinatura do mtodo tem que ser idntica, ou seja, teremos redefinio
quando uma classe filha fornece apenas uma nova implementao para o mtodo
herdado e no um novo mtodo.
Se a classe filha fornecer um mtodo de cabealho ou assinatura parecida com a do
mtodo herdado (difere ou no nmero ou no tipo dos argumentos, ou ento no tipo do
valor de retorno) ento no se trata mais de redefinio, trata-se de uma sobrecarga,
pois criou-se um novo mtodo. Uma chamada ao mtodo herdado no mais
interceptada por esse novo mtodo de mesmo nome. O mtodo tem o mesmo nome,
mas ligeiramente diferente na sua assinatura (o corpo ou bloco de cdigo {} no
importa), o que j implica que no proporciona o mesmo comportamento (behaviour)
do mtodo da superclasse.

SOBRECARGA ( MTODOS E OPERADORES)


Este tipo de polimorfismo permite a existncia de vrios mtodos de mesmo nome,
porm com assinaturas levemente diferentes ou seja variando no nmero e tipo de
argumentos e no valor de retorno. Ficaria a cargo do compilador escolher de acordo
com as listas de argumentos os procedimentos ou mtodos a serem executados.

SOBRECARGA DE MTODOS, COPY CONSTRUCTOR


No exemplo a seguir vamos sobrecarregar o construtor de uma classe, esta classe
passar a ter duas verses de construtores, vale lembrar que assim como o construtor
ser sobrecarregado, qualquer outro mtodo poderia ser. O compilador saber qual
mtodo a executar no mais pelo nome, mas pelos argumentos.
O mtodo Ponto(Ponto ap); um copy constructor, pois tem o mesmo nome que
Ponto(float dx,float dy);. Tal duplicao de nomes pode parecer estranha, porm Java
permite que eles coexistam para uma mesma classe porque no tem a mesma
assinatura (nome+argumentos). Isto se chama sobrecarga de mtodo, o compilador
sabe distinguir entre esses dois construtores. Outros mtodos, no s construtores

MANUAL DE JAVA
podero ser sobrecarregados para vrios argumentos diferentes, esse recurso um
polimorfismo do tipo ad-hoc.
O que interessante para ns o facto de o argumento do construtor Ponto(Ponto ap);
ser da mesma classe para qual o construtor foi implementado, o que caracteriza um
copy constructor que inicializa um objecto a partir de outro da mesma classe.
Outros mtodos semelhantes seriam: Circulo(Circulo a); Mouse(Mouse d); . Implementar
copy constructor pode ser muito importante, lembre-se dos problemas com cpias de
objectos apresentados em .
Por questes de espao, basearemos nosso exemplo no tipo abstrato de dados frao,
apresentado em . deve modificar a classe Fracao para que ela tenha dois construtores,
o que esta em negrito dever ser acrescentado ao cdigo original:
public Fracao(int umso) //sobrecarga do construtor original
{
num=umso;
den=1; //subentendido
}
public Fracao(Fracao copieme) //esse e um copy constructor e uma sobrecarga
{
num=copieme.retorna_num();
dem=copieme.retorna_den();
}
public Fracao(int t,int m) //construtor original
{
num=t;
den=m;
this.simplifica();
//chamada para o mesmo objecto.
}
Cdigo:
//O programa principal, sobre a modificacao em negrito
class Principal {
public static void main(String args[])
{
Fracao a,b,c;
a=new Fracao(5); //elimine o segundo argumento
b=new Fracao(2,6);
System.out.print("Esta e' a fracao a: ");
a.mostra();
System.out.print("Esta e' a fracao b: ");
b.mostra();
c=a.soma(b);
System.out.print( "c de a+b: "); //c(a+b)
c.mostra();
System.out.print("a*b: ");
c=a.multiplicacao(b);
c.mostra();
System.out.print("a+b: ");
c=a.soma(b);
c.mostra();
System.out.print("a>=b: ");
System.out.println(a.maiorouigual(b));
System.out.print("a==b: ");
Pgina 88

Manual de Curso

MANUAL DE JAVA
System.out.println(a.igual(b));
System.out.print("a!=b: ");
System.out.println(a.diferente(b));
System.out.print("(int)a ");
System.out.println(a.converteint());
System.out.print("(double)a ");
System.out.println( a.convertedbl());
}
}
Resultado:

Esta e' a fracao a: (5/1)


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

Teste o copy constructor para o tipo abstrato de dados frao apresentado acima.
Quando um s nmero for passado para o construtor desta classe, subentende-se que o
construtor chamado o de um s argumento inteiro e que portanto o denominador
ser igual a 1.
Agora vamos falar do copy constructor, que embora implementado, no foi testado em
main() . Esse mtodo, pertence a outro objecto que no o argumento copieme, ento
para distinguir o atributo num deste objecto, do atributo num de copieme usamos
copieme.num e simplesmente num para o objecto local, objecto em questo, ou objecto
dono do mtodo chamado.
Exerccios

Faa um copy constructor para uma das classes j implementadas neste texto.

Sobrecarregue o mtodo move da classe Ponto para aceitar um Ponto como


argumento, subentende-se que devemos mover a distncia x e a distncia y
daquele ponto a origem.

Crie um mtodo de nome unitarizado para a classe Ponto. Este mtodo deve
interprectar o Ponto como um vector e retornar um novo Ponto que contm as
coordenadas do vector unitarizado. Unitarizar dividir cada coordenada pelo
mdulo do vector. O mdulo a raiz quadrada da soma dos quadrados das
componentes.

SOBRECARGA DE OPERADOR
Java no fornece recursos

para sobrecarga de
condizente com a filosofia da linguagem. Seus
linguagem deveria ser pequena, simples, segura
(simple, small, safe and secure).
A ausncia de sobrecarga de operadores
apropriadamente classes e mtodos.
Manual de Curso

operador, o que perfeitamente


criadores que acreditavam que a
de se programar e de se utilizar
pode

ser

contornada

definindo
Pgina 89

MANUAL DE JAVA

CLASSES ABSTRACTAS E CONCRECTAS


Em um dos exerccios anteriores (no tpico sobre herana) pedamos que definisse
uma hierarquia composta de trs classes. A classe pai tinha o nome de Forma, e as
classes herdeiras desta eram Ponto e Rectangulo. Embora a classe forma no possusse
sentido prtico, ela permitia certas operaes como move, altera_x(int nx), entre outras
(retorne a este exerccio).
Na verdade o que desejvamos era que esta classe Forma se comportasse como um
esqueleto para as suas classes filhas, ns no queramos instanci-la. Classes
abstractas permitem exactamente isto pois no podem ser instanciadas embora possam
ser usadas de outras maneiras.
Classes abstractas so poderosas, elas permitem: criao de listas heterogneas,
ocorrncia de dynamic binding e maior clareza no projeto de sistemas. Os packages
que vem com a linguagem esto repletos de exemplos de classes abstractas.
Mtodos abstratos, obrigatoriamente pertencem a classes abstractas, e so mtodos
desprovidos de implementao, so apenas definies que sero aproveitadas por
outras classes da hierarquia. Voltando ao exemplo da hierarquia Forma, Ponto e
Rectangulo. O mtodo mostra poderia ter sido definido na classe base abstrata (Forma)
como um mtodo abstrato.

Cdigo:
Classes abstractas
//Classe Forma
abstract class Forma {
protected float x,y; //visivel hierarquia abaixo
public void move(float dx,float dy)
{
this.x+=dx; this.y+=dy;
}
abstract public void mostra(); //metodo abstrato
}

Pgina 90

Manual de Curso

MANUAL DE JAVA
//Classe ponto
class Ponto extends Forma {
public Ponto(float ax,float ay) //omita o valor de retorno!
//garante o estado do objecto
{
this.x=ax; this.y=ay;
}
//move nao precisa ser redefinido
public void mostra()
{
System.out.println("("+this.x+","+this.y+")");
}
}
//Classe Rectangulo
class Rectangulo extends Forma {
protected float dx,dy; //delta x e delta y
//protected acaba sendo menos inflexivel e mais eficiente que private
public Rectangulo(float ax,float ay,float dx,float dy)
//garante o estado do objecto
{
x=ax; y=ay;
this.dx=dx; this.dy=dy; //this utilizado para eliminar ambiguidade
}
//metodo move precisa ser redefinido
public void move(float dx,float dy)
{
this.x+=dx; this.y+=dy;
this.dx+=dx; this.dy+=dy; //this distingue o argumento do atributo de mesmo nome
}
public void mostra()
{
System.out.println("("+this.x+","+this.y+")("+dx+","+dy+")");
}
}
//Classe principal, Ficheiro Principal.Java
class Principal {
public static void main(String args[]) {
Rectangulo ar=new Rectangulo(0,0,13,14);
ar.mostra();
ar.move(1,1);
ar.mostra();
}
}
Resultado:
Manual de Curso

(0,0)(13,14)
Pgina 91

MANUAL DE JAVA
(1,1)(14,15)
//Comentrios
Observe que a classe Forma que abstrata, no possui um construtor, porque no pode
ser instanciada. Agora tambm temos um novo qualificador de classe e de mtodos:
abstract.
Classes abstractas X Interfaces
Deve estar achando que classes abstractas e interfaces so conceitos parecidos e que
podem ser usados com objectivos semelhantes. Cuidado! Uma classe pode estender
uma nica classe (que pode ser abstrata ou no), mas pode implementar vrias
interfaces. Alm disso, interfaces no permitem declarao de atributos, enquanto que
classes abstractas permitem. Interfaces esto mais ligadas a comportamento, enquanto
que classes abstractas esto mais ligadas a implementao.
Exerccios
Defina uma classe abstrata tipo numrico que deve servir como classe base para
a montagem de classes como a classe frao ou a classe nmero complexo. Uma
boa medida da qualidade de sua implementao a quantidade de mudanas
necessrias para por exemplo trocar a classe frao utilizada em um algoritmo
de clculo numrico pela classe nmero complexo. bem verdade que existem
operaes que se aplicam a uma dessas classes, mas no a outra, mas essas
disparidades devero ser mantidas fora da classe base abstrata.

CLASSE ABSTRATA ITERADOR


Neste exemplo iremos criar uma classe base abstrata iterador, que servir como topo
de uma hierarquia para iteradores de estruturas de dados como listas, vectores e
rvores. O iterador de vector definido por herana da classe base abstrata de
iteradores.
Perceba que alguns mtodos da classe base so desprovidos de implementao, porm
nada impede que coloque como cdigo desses mtodos uma mensagem de erro do tipo
Erro, mtodo deveria ter sido redefinido, mas agora o compilador no pode mais te
lembrar de redefini-los.
SHOPPING LIST APPROACH PARA A CLASSE ABSTRATA ITERADOR
(As operaes implementadas esto marcadas com , existem outras operaes teis,
no mencionadas por motivos de espao. Esta classe base abstrata no tem a
funcionalidade de uma classe que possa estar instanciada, perceba a ausncia de um
mtodo para avanar na iterao).

Mtodo de inicializao da iterao


Retorno do contedo da actual posio na iterao
Atribuio de valor a actual posio da iterao
Mtodo que verifica se a iterao no chegou ao fim

SHOPPING LIST APPROACH PARA A CLASSE ABSTRATA ITERADOR VECTOR


(Uma tarefa desagradvel quando iterando sobre vectores manter os ndices das
iteraes atualizados durante avanos e retrocessos. Note que retrocessos no fariam
sentido em uma lista simplesmente ligada, por isso essa operao somente definida
neste nvel da hierarquia.)
Retorno do valor numrico ou ndice da actual posio da iterao
Retrocesso na iterao
Avano na iterao
Avano e retrocesso com saltos (inclusive mais genrico que os dois anteriores).
Pgina 92

Manual de Curso

MANUAL DE JAVA
Cdigo:
//Classe IteradorI
abstract class IteradorI {
abstract public void comeca();
abstract public int retorna(); //metodos abstrato
abstract public void atribui(int a);
abstract public boolean fim();
}
//Classe IteradorVetorI
class IteradorVetorI extends IteradorI {
protected int[] vet; //itero sobre ele
private int conta; //posicao actual da iteracao
public IteradorVetorI(int[] itereme)
{
vet=itereme;
conta=0;
}
public void comeca()
{
conta=0;
}
public void comeca(int p)
{
conta=(p%vet.length);
}
public void atribui(int novo)
{
vet[conta]=novo;
}
public int retorna()
{
return vet[conta];
}
public boolean fim()
{
return conta==vet.length-1;
}
public int retorna_conta()
{
return conta;
}
public void avanca()
{
if (conta<(vet.length-1)) conta++;
Manual de Curso

Pgina 93

MANUAL DE JAVA
}
public void retrocede()
{
if (conta>0) conta--;
}
}
import Java.io.DataInputStream;
//Classe principal, Ficheiro Principal.Java
class Principal {
public static void main(String args[]) {
int[] vet=new int[6];
vet[0]=0; vet[1]=1; vet[2]=2; vet[3]=3; vet[4]=4; vet[5]=5;
IteradorVetorI mit=new IteradorVetorI(vet);
char o; //o=opcao,
int e; //temporario
String line; //linha a ser lida do teclado
DataInputStream meuDataInputStream=new DataInputStream(System.in);
try{
do
{
do { o=meuDataInputStream.readLine().charAt(0); }
while (o=='\n');
switch (o) {
case 'a': //atribui
line=meuDataInputStream.readLine();
try {
e=Integer.valueOf(line).intValue();
mit.atribui(e);
}
catch (Exception erro) {
System.out.println("Entrada invalida!");
}
break;
case 'r': //retorna
e=mit.retorna();
System.out.println(e);
break;
case 'f': //frente
mit.avanca();
break;
case 't': //tras
mit.retrocede();
break;
case 'c': //comeca iteracao?
mit.comeca();
break;
case 'e': //fim da iteracao?
System.out.println(mit.fim());
break;
Pgina 94

Manual de Curso

MANUAL DE JAVA
case 'v': //valor actual
System.out.println("V:"+mit.retorna_conta());
break;
case 'm': //mostra vector
for(int j=0;j<vet.length;j++)
{ System.out.print("["+vet[j]+"]"); }
System.out.println();
break;
default: ;
} //switch
} while (o!='q');
} //try block
catch (Exception erro) { /* nao faco nada */ }
} //main method
} //class Principal
Resultado:

m
[0][1][2][3][4][5]
a
9
m
[9][1][2][3][4][5]
f
f
f
a
33
t
a
22
m
[9][1][22][33][4][5]
c
v
V:0
q

Exerccios:

Manual de Curso

Defina uma classe de nome ArrayServices que fornece servios para vectores.
Implemente os servios de: ordenao de subvetor (vector interno menor ou
igual ao vector em questo) , busca, troca de posies, etc. Esta classe opera
sobre os vectores passados como argumentos de seus mtodos (passagem
implcita do ponteiro para o vector). Os vectores devem ser de tipos numricos
definidos na linguagem (conte com a existncia de operadores + - < ==, etc).
Ter que definir uma verso desta classe para cada tipo da linguagem (byte, float,
etc). Na verdade isto no trabalhoso, basta definir para um tipo, depois alterar
s as partes necessrias e recompilar para os demais.
Pense como fazer a classe ArrayServices trabalhar em conjunto com a classe
Iterador vector. No confunda estas duas classes, elas executam tarefas
distintas.

Pgina 95

MANUAL DE JAVA

ACOPLAMENTO DINMICO DE MENSAGENS


Por acoplamento entenda a escolha certa de um mtodo a ser executado para uma
varivel declarada como de uma classe, mas podendo conter um objecto de uma
subclasse desta. Por dinmico entenda em tempo de execuo.
J dissemos que um objecto de uma classe filha garante no mnimo o comportamento
behaviour de seu pai. Por este motivo podemos atribuir um objecto da classe filha a
uma varivel da classe pai, mas no o contrrio.
Acoplamento dinmico mostrar que possvel fazer com que o compilador execute a
implementao desejada de um mtodo redefinido para classes herdeiras, mesmo no
caso de chamada de mtodo ocorrer para uma varivel de superclasse (classe pai)
contendo um objecto de uma subclasse (classe filha). Isto nos permitir construir listas
heterogneas .
Fazendo uma comparao com linguagens processuais:
O trabalho do dynamic binding normalmente feito desta forma em linguagens
processuais:
//ComputaContaBancaria
if type(a)==ContaCorrente then ComputaContaCorrente(a);
else if type(a)==Poupanca then ComputaPoupanca(a); //chamadas de procedimentos
J em linguagens orientadas por objectos como Java temos o seguinte:
Conta ContVet=new conta[3];
//Vector de objectos da classe conta
ContVet[0]=new Poupanca(1000,.10);
//toda Poupanca uma Conta
ContVet[1]=new ContaCorrente(1000,.10,0); //toda ContaCorrente uma Conta
ContVet[2]=new Poupanca(1030,.15);
ContVet[x].computa(); //nao importa para que classe da hierarquia de contas, computa
//computa definida e o compilador acopla dinamicamente, em tempo de execucao a
//mensagem
Diagrama das classes:

A classe filha garante no mnimo o mesmo comportamento, behaviour da classe pai,


podendo acrescentar ou redefinir parte do que foi herdado. Por este motivo, uma
varivel da classe pai pode receber um objecto da classe filha, o comportamento da
classe pai fica garantido e o restante (o que a classe filha acrescentou) perdido. J
uma varivel da classe filha no pode receber um objecto da classe pai, porque os
mtodos definidos para variveis desta classe passam a no fazer sentido para o
objecto contido nesta varivel.
O diagrama reflete o aspecto das caractersticas acrescentadas pela classe filha a classe
pai, mas no o facto de uma varivel da classe pai poder receber um elemento da
Pgina 96

Manual de Curso

MANUAL DE JAVA
classe filha, isto porque como no desenho o pai desenhado menor que o filho, o leitor
tem a tendncia de inferir que o pai cabe no filho o que justamente o contrrio do
que acontece em termos de variveis.

UM EXEMPLO ESCLARECEDOR
O exemplo a seguir cria dois objectos (pai e filho) e faz atribuies e chamadas de
mtodos entre eles.
Cdigo:
//Classe SuperClasse
class SuperClasse {
public void nome()
{
System.out.println("Metodo da superclasse");
}
}
//Classe SubClasse
class SubClasse extends SuperClasse {
public int novoatributo;
public void nome() //redefinicao
{
System.out.println("Metodo da subclasse");
}
public void novometodo()
{
System.out.println("Novo metodo:"+novoatributo);
}
}
//Classe principal, Ficheiro Principal.Java
class Principal {
public static void main(String args[]) {
SubClasse esub1=new SubClasse();
SuperClasse esuper1=new SuperClasse(); //poderia ter alocado uma SubClasse aqui
esub1.nome();
esub1.novoatributo=10;
esuper1.nome();
esuper1=esub1;
esuper1.nome();
} //main method
} //class Principal
Resultado:
Manual de Curso

Metodo da subclasse
Metodo da superclasse
Pgina 97

MANUAL DE JAVA
Metodo da subclasse
//Comentrios
Note que o mtodo escolhida de acordo com o contedo da varivel e no de acordo
com a classe desta.
O que acontece com o que foi acrescentado
Depois do programa anterior, deve estar se perguntando o que acontece com o que foi
acrescentado pela classe filha quando um objecto desta classe atribudo a classe pai.
Cdigo:
//Insira aqui o ficheiro da SuperClasse do exemplo anterior

//Insira aqui o ficheiro da SubClasse do exemplo anterior

//Classe principal, Ficheiro Principal.Java


class Principal {
public static void main(String args[]) {
SubClasse esub1=new SubClasse();
SuperClasse esuper1=new SuperClasse(); //poderia ter alocado uma SubClasse aqui
esub1.nome();
esub1.novoatributo=10;
esuper1.nome();
esuper1=esub1;
esuper1.nome();
esub1=(SubClasse)esuper1; //cast
esub1.nome();
esub1.novometodo();
} //main method
} //class Principal
Resultado:

Metodo da subclasse
Metodo da superclasse
Metodo da subclasse
Metodo da subclasse
Novo metodo:10

//Comentrios
Embora seja capaz de recuperar os mtodos e atributos acrescentados atravs do type
casting, enquanto isto no for feito, estes mtodos e atributos esto inacessveis.
Exerccios:

Pgina 98

Implemente em suas classes mtodos que imprimem uma frase identificando o


tipo da classe, por exemplo: Eu sou a classe conta corrente, especializao de
conta bancaria.

Modele e implemente uma hierarquia de CONTAS BANCRIAS, use os recursos


que achar conveniente: classes abstractas, interfaces, variveis static. deve
Manual de Curso

MANUAL DE JAVA
definir classes semelhantes as contas bancrias como poupana, conta corrente,
etc. Os mtodos devem ter nomes como deposita, saca, computa, etc.

LISTA HETEROGNEA DE FORMAS (GEOMTRICAS)


Este exemplo lida com um vector de objectos da classe forma definida em Classes
Abstractas E Concrectas , estes objectos so retngulos, pontos, etc. O objectivo
mostrar: subclasses contidas em variveis (posies de vector) da superclasse e
acoplamento dinmico de mensagens.
O nosso vector de formas conter objectos grficos de classes heterogneas.
Trataremos todos de maneira uniforme, chamando os mtodos mostra e move. j viu
nos exemplos anteriores como recuperar o objecto em uma varivel de sua prpria
classe e no superclasse.
Cdigo:

Recompile com esse novo mtodo main:

//Insira aqui a definicao da classe Forma dada em Classes Abstractas E Concrectas

//Insira aqui a definicao da classe Ponto dada em Classes Abstractas E Concrectas

//Insira aqui a definicao da classe Rectangulo dada em Classes Abstractas E Concrectas

//Classe principal, Ficheiro Principal.Java


class Principal {
public static void main(String args[]) {
Forma vetorgrafico[]=new Forma[4];
vetorgrafico[0]=new Rectangulo(0,0,20,10);
vetorgrafico[1]=new Ponto(0,1);
vetorgrafico[2]=new Rectangulo(100,100,20,20); //lados iguais
vetorgrafico[3]=new Ponto(2,1);
for(int i=0;i<4;i++)
{
vetorgrafico[i].mostra();
}
for(int j=0;j<4;j++)
{
vetorgrafico[j].move(12.0f,12.0f);
vetorgrafico[j].mostra();
}
}
}
Resultado:

Manual de Curso

(0,0)(20,10)
(0,1)
(100,100)(20,20)
(2,1)
(12,12)(20,10)
(12,13)
(112,112)(20,20)
Pgina 99

MANUAL DE JAVA
(14,13)
//Comentrios
Observe que a implementao correcta do mtodo mostra escolhida em tempo de
execuo de acordo com a classe do objecto que est naquela posio do vector.
Exerccios

Considere as seguintes declaraes em Java:


public class T
{
public void f(void) { System.out.println( Estou em T);}
};
public class S extends T
{
public void f(void) { System.out.println(Estou em S);}
};
T x= new T();
S y=new S();
T p=new T();
e as seguintes invocaes de operaes:
p.f(); //primeira
p=y;
p.f(); //segunda
x.f(); //terceira
y.f(); //quarta
x=y;
x.f() //quinta
Responda qual o resultado no ecr de cada uma destas chamadas.

Pgina 100

Manual de Curso

MANUAL DE JAVA
CONCEITOS AVANADOS
Neste tpico apresentaremos conceitos avanados da linguagem, estes conceitos so
importantes se deseja criar softwares relativamente grandes em Java.

ATRIBUTOS STATIC
At o momento s havamos aprendido como definir atributos de instncia. Cada
objecto tinha seus prprios atributos e uma modificao nos atributos de um objecto
no afetava os atributos de outros objectos.
Neste tpico iremos apreender como definir atributos de classe. Esses atributos so os
mesmos para todos os objectos, eles so compartilhados. Uma mudana em um destes
atributos visvel por todos os objectos instanciados. Atributos de classe tambm so
chamados de atributos static.
Neste exemplo definiremos uma classe robo que usa atributos static para saber quantos
robos foram criados (instanciados). Um outro uso de atributos static seria utilizar uma
estrutura de dados que permitisse que um robo saber a posio(coordenadas) dos
demais objectos de sua classe.

Cdigo:
//Classe Robo
class Robo {
public
int x;
public
int y;
public static int quantos; //quantos foram instanciados
public Robo(int ax,int ay)
{
x=ax; y=ay;
quantos++;
}
}

MANUAL DE JAVA
//Classe principal, Ficheiro Principal.Java
class Principal {
public static void main(String args[]) {
Robo.quantos=0; //inicializando a variavel static
Robo cnc,cnc2;
System.out.println(Robo.quantos);
cnc=new Robo(10,12);
System.out.println(Robo.quantos);
cnc2=new Robo(11,12);
System.out.println(Robo.quantos);
} //main method
} //class Principal
Resultado:

0
1
2

//Comentrios:
Quando definimos atributo static, estvamos nos referindo ao sentido geral de atributo.
Apesar de termos exemplificado com um inteiro, poderia ter utilizado uma classe no
lugar desse atributo, tomando o cuidado de executar new antes de us-lo.

MTODOS STATIC
Mtodos static tambm so chamados de mtodos de classes. Estes mtodos s podem
operar sobre atributos de classes. Nos j vnhamos usando estes mtodos. Existem
exemplos de chamadas de mtodos static em nossos programas anteriores porque as
packages da linguagem so repletas de exemplos de mtodos static. Por este motivo eu
escolhi uma das definies de mtodos static da Java API (Sun Microsystems ) para
transcrever:
abs(double). Static method in class Java.lang.Math
Returns the absolute double value of a.
Neste tpico no mostraremos um exemplo propriamente dito, apenas mostraremos
como definir um mtodo static, portanto importante que faa os exerccios.
Mtodos static so definidos assim como atributos static:
public static int MDC(int a,int b) { //maximo divisor comum de a e b
}
No exemplo da classe Fracao (Tad Frao), tivemos que lidar com o mtodo mdc. Este
mtodo no fazia muito sentido para o utilizador desta classe, embora fosse necessrio
para fazer certas operaes que envolviam simplificao de frao. Naquele momento
nossa opo foi por implementar o mtodo como private na prpria classe Fracao.
Algum rigoroso poderia ter dito: est errado, mdc no tem nada a ver com Fracao e
eu vou implement-lo em uma classe separada chamada ServicosMatematicos. A minha
resposta a esta afirmao seria: Acho sua idia boa, mas sem o uso de mtodos static
na classe ServicosMatematicos,
vai ter que declarar um objecto da classe
ServicosMatematicos dentro de cada Fracao para poder utilizar o mtodo mdc.
Exerccios:
Pgina 102

Manual de Curso

MANUAL DE JAVA

Defina uma classe com mtodos static que permite clculos matemticos como
MDC, FACTORIAL, COMBINAES(n,k), PERMUTAES, etc.
Existe uma linguagem de programao chamada Logo que muito utilizada no
Brasil em escolas de primeiro e segundo grau. Nesta linguagem pode programar
os movimentos no ecr de uma tartaruguinha ou cursor. Este cursor descreve
movimentos riscando ou no a tela, dentre os movimentos descritos esto
crculos, quadrados e sequncias repetitivas (loops). Modifique seu objecto robo
para apresentar alguns desses recursos. Crie ento um programa que l de um
ficheiro texto instrues para este objecto robo executar movimentos no ecr.
Pode desejar armazenar as informaes da classe Robot em outra classe, que
computa outros clculos, neste caso temos pelo menos duas alternativas a
seguir:
Crie uma classe auxiliar externa de armazenagem e para todos objectos robo
instanciados passe o ponteiro desta classe auxiliar como argumento do
construtor. Assim esses objectos podero mandar mensagens para esta classe
de armazenagem. Essas mensagens, chamadas de mtodos, podem ter vrios
significados, num sentido figurado podemos ter algo parecido com: Classe
auxiliar, armazene essa informao para mim. Classe auxiliar, me mande uma
mensagem daqui a cinco segundos, estou passando o ponteiro para mim mesmo
(this) , etc.
As mensagens vistas desse modo ficam mais interessantes,
pode at achar engraado, mas muito prtico pensar assim.
Em alguma classe que
criou anteriormente defina variveis static com o
seguinte objectivo: Contar, fazer estatsticas das chamadas de mtodos da
classe.
Use o que foi aprendido sobre static variables no programa contas, o objectivo
armazenar informaes sobre os movimentos de todas as contas num objecto
static. Para que a modificao fique a contento pode precisar tornar o exemplo
mais prximo da realidade, adicionando no construtor de contas um argumento:
nmero de conta. Comente se usaria alocao dinmica para essa classe de
armazenagem agregada em conta, ou no. Tenha em mente a questo do
tamanho em bytes do objecto.

TRATAMENTO DE EXCEPES
Se os conceitos de orientao por objectos dados at agora fossem suficientes para
modelar qualquer atividade ou objecto do mundo real, todos os problemas de
programao estariam resolvidos. Ocorre que o mundo real bem mais complexo que
seu programa pode ser. Nem todos os objectos e iteraes entre eles podem ser
modelados ou previstos. Os mecanismos de tratamento de excepes se encaixam
justamente nessa lacuna.
O modelo de tratamento de excepes adotado por Java muito semelhante ao de C+
+. Se j teve alguma experincia com tratamento de excepes, este tpico ser
bastante fcil.

TRATANDO AS EXCEPES GERADAS POR TERCEIROS


Tratamento de excepes permite lidar com as condies anormais de funcionamento
de seu programa. Fazer uso deste recurso tornar seu software mais robusto, seguro e
bem estruturado. So exemplos de condies anormais: acesso a um ndice invlido de
um vector, tentativa de uso de um objecto no inicializado, falha na transferncia de
uma informao, uma falha no prevista, etc.

Manual de Curso

Pgina 103

MANUAL DE JAVA
Sem as facilidades oferecidas pela linguagem seria muito difcil lidar com essas
condies anormais, isto pode ser observado nos deficientes meios de tratamento de
erros usados em linguagens que no fornecem exception handling.

Java uma linguagem que faz forte uso do conceito de tratamento de excepes. Em
algumas linguagens que implementam tratamento perfeitamente possvel programar
sem utilizar esse recurso, mas em Java no. Isto pode ser comprovado pela
necessidade de alguns blocos de cdigo try {} catch {} em programas anteriores.
Um dos motivos de o programador Java ter que saber tratamento de excepes que
os mtodos de classes definidas na linguagem podem gerar excepes e na maioria das
vezes o compilador nos obriga a escrever tratadores (blocos try{} catch{}) para chamadas
destes mtodos.
Quando for estruturar seu cdigo dessa forma, havero duas aes bsicas que devem
ser tomadas: levantar (jogar) uma exceo e tratar uma exceo. Uma exceo ser
levantada quando for verificada uma condio anormal de funcionamento do programa,
ento o mtodo que esta sendo executado imediatamente terminado e o controle
passa para o mtodo que o chamou, onde pode ocorrer um tratador da exceo ou no.
Se ocorrer um tratador, na maioria dos casos a exceo para de se propagar ali mesmo.
Se no ocorrer um tratador outras chamadas de mtodos so desfeitas, encerradas,
podendo culminar no trmino do programa se toda a cadeia de chamada de mtodos
for desfeita at chegar em main sem que se ache um tratador para esta exceo.
Existem vrios modelos de tratamento de excepes, o modelo adotado por Java
recebe o nome de: termination model, justamente por essas terminaes de mtodos.
Mas o que uma jogar uma exceo? suspender a execuo do mtodo actual e
passar um objecto para o bloco catch mais prximo na cadeia de chamadas de mtodos
actual . Isto feito atravs da declarao:
throw nomedoobjecto; //ou throw new nomedaclassedoobjecto(argumentos do construtor)
throw como um break para mtodos.
Como excepes so objectos, pode definir hierarquias de classes de excepes, que
mapeiem em termos de informaes as condies anormais de seu programa contendo
as mensagens de erro e as possveis solues
As excepes geradas pela linguagem pertencem a uma hierarquia cujo topo a classe
Throwable, imediatamente estendida por Error e Exception. Neste exemplo ver que os
tratadores de exceo so escolhidos comparando a classe da exceo jogada e a classe
de excepes que o tratador diz tratar. Assim sendo o tratador:
try{ /*algo que possa gerar uma excecao*/}
catch (Exception erro) { /* acoes de tratamento do erro com possivelmente nova tentativa de
execucao dos metodos chamados*/ }
Seria capaz de tratar todas as excepes que estejam abaixo de Exception (na
hierarquia) geradas em try { }. Dispondo mais de um tratador (bloco catch) em
seqncia onde os primeiros s tratam as classes excepes mais baixas da hierarquia,
possvel escolher que cdigo de tratamento utilizar com cada tipo de exceo gerada.
Por sorte, das excepes levantadas pela linguagem, como programador s precisar
tratar as da hierarquia de Exception. Neste exemplo iremos forar o acontecimento da
exceo ArrayIndexOutOfBoundsException, atravs de uma tentativa de acesso a um ndice
invlido de um vector.

Pgina 104

Manual de Curso

MANUAL DE JAVA
Cdigo:
Acesso a ndice invlido do vector sem corromper o sistema.
//Classe principal, Ficheiro Principal.Java
class Principal {
public static void main(String args[]) {
int a[]=new int[4];
try {
a[4]=10;
//linha acima gera excecao, os indices validos sao quatro:0,1,2,3
//qualquer codigo escrito aqui (depois de a[4]=10;)
//nunca sera executado
}
catch(Exception ae) {
//refaz a pergunta do indice a alterar ao usuario
//e descrobre que ele queria alterar o valor no indice 3, escrevendo 12
a[3]=12;
}
System.out.println(a[3]);
}
}
Resultado:

12

//Comentrios
O facto do cdigo imediatamente aps o ponto onde foi gerada a exceo no ser
executado te preocupa? gostaria por exemplo de ter uma chance de liberar recursos do
sistema (ex..:fechar um ficheiro) antes do mtodo ser terminado? para isso que
existe em Java o bloco try{ } catch{} finally{} que no existe em C++, mas existe por
exemplo em Modula-3.
A clusula finally{ } opcional, seu cdigo vai ser executado ocorra ou no ocorra uma
exceo no bloco try{} .
Exemplo clssico de uso do bloco try{} catch{} finally {}:
try {
//abre um ficheiro
//gera uma excecao com ficheiros
}
catch (ExcecaoArquivo e){
//tenta recuperar aquivo e informacoes perdidas
}
finally {
ficheiro.close();
}
finally tem sido utilizado para fechar ficheiros, parar threads e descartar janelas.
Exerccios:

Manual de Curso

Em vrios dos programas anteriores mencionamos que haveria uma maneira


melhor de tratar situaes anormais. Um desses programas era o do tipo
abstrato de dados matriz. Leia este programa e adicione tratamento de excepes
para as condies anormais que podem surgir, tais como acesso a ndices
invlidos. Complemente este exerccio aps ter lido os tpicos seguintes.

Pgina 105

MANUAL DE JAVA
CRIAR EXCEPES
O exemplo a seguir ensina como trabalhar com throw, a palavra chave utilizada para
levantar excepes. Este exemplo se baseia na classe Fracao de Tad Frao. Nossa
exceo ser gerada quando nas operaes de fraes ocorrer uma diviso por zero.
Em Java, excepes so instncias de classes que pertencem a hierarquia que
iniciada, encabeada, pela classe Throwable. Neste exemplo construiremos nossa
exceo herdando de Exception que por sua vez herda de Throwable.
Cdigo:
public class DivisaoPorZero extends Exception
{
public String info;
public DivisaoPorZero(String i)
{
info=i;
}
}
Deve modificar a classe Fracao apresentada anteriormente na pgina 60, para aceitar o
seguinte mtodo:
public Fracao divisao(Fracao j) throws DivisaoPorZero
{
Fracao g;
if (j.den==0) throw new DivisaoPorZero("Na classe Fracao");
//se for zero a execucao nao chega aqui
g=new Fracao(num*j.den,den*j.num);
return g;
}
class Principal {
public static void main(String args[])
{
Fracao a,b,c;
a=new Fracao(5,3);
b=new Fracao(2,0);
System.out.print("Esta e' a fracao a: ");
a.mostra();
System.out.print("Esta e' a fracao b: ");
b.mostra();
try {
c=a.divisao(b);
c.mostra();
}
catch(DivisaoPorZero minhaexcecao)
{
System.out.println("Nao posso dividir por zero");
}
}
}
Resultado:

Pgina 106

Esta e' a fracao a: (5/3)


Esta e' a fracao b: (1/0)
Nao posso dividir por zero

Manual de Curso

MANUAL DE JAVA
//Comentrios
Ns no apresentamos um exemplo de uma exceo propagando em uma cadeia longa
de chamadas de mtodos. Mas com os conhecimentos dados, pode fazer isso.
Outro facto importante que um bloco catch tambm pode gerar excepes, assim se
pegou uma exceo e resolveu que no consegue trat-la pode fazer um throw dela
mesma ou mudar a classe da exceo e continuar propagando (throw de outra exceo),
ou fazer o que pode para reparar o erro e jogar uma exceo para que o que fez seja
completado por outros mtodos. Lembre-se que se pegou uma exceo, ela para de
propagar.
Exerccios

Implemente, tratamento de excepes completo para o exemplo de Tad Frao.


Antes faa um levantamento das excepes que podem ser geradas, lembre das
restries matemticas para o denominador em uma diviso. Leve em conta
tambm o overflow de variveis int que so uma representao com nmero de
bits finito da sequncia dos nmeros inteiros (conjunto Z da matemtica).
Compare este tratamento com o de outros programas por exemplo na diviso
por zero, quais as vantagens que pode apontar e as desvantagens?

THREADS
Threads so fluxos de execuo que rodam dentro de um processo (aplicao).
Normalmente os threads compartilham regies de memria, mas no necessariamente.
Lembre-se de encapsulamento. Processos, os avs dos threads permitem que o seu
sistema operacional execute mais de uma aplicao ao mesmo tempo enquanto que
threads permitem que sua aplicao execute mais de um mtodo ao mesmo tempo.
Todos os programas que fizemos at agora s tinham um nico caminho, fio, fluxo, de
execuo. Nenhum deles executava duas coisas (dois pedaos de cdigo)
simultaneamente. Grande parte do software de qualidade escrito hoje faz uso de mais
de uma linha de execuo, mais de um thread. So os chamados programas
multithreaded.
O seu browser de hipertexto consegue fazer o download de vrios ficheiros ao mesmo
tempo, gerenciando as diferentes velocidades de cada servidor e ainda assim permite
que continue interagindo, mudando de pgina no hipertexto enquanto o ficheiro nem
foi carregado totalmente? Isto no seria possvel sem o uso de threads.
O seu editor de textos permite que v editando o comeo do ficheiro, enquanto ele
est sendo carregado do disco? Editar e carregar do disco so atividades que no
podem ser intercaladas de maneira simples em um pedao de cdigo. Seu editor est
usando threads, essas atividades esto sendo feitas em paralelo.
Se sua mquina s possui um processador, esse paralelismo um falso paralelismo. O
processador tem seu tempo dividido em pequenos intervalos, em cada intervalo ele
executa uma das atividades e tem a sensao de que tudo est funcionando ao mesmo
tempo, simultaneamente. Se
um felizardo e sua mquina tm mais de um
processador, ento seu ambiente ser capaz de mapear seus threads em hardware e
ter realmente processamento paralelo.
Se olhar a traduo de threads no dicionrio at capaz que encontre um desenho de
um carretel de linha ou da rosca de um parafuso, este nome bastante feliz. Imagine
que seu programa composto por vrias linhas de execuo que funcionam em
paralelo (algumas vezes estas linhas podem se juntar, outras se dividir). Cada linha de
Manual de Curso

Pgina 107

MANUAL DE JAVA
execuo cuida de uma tarefa: transferir um ficheiro, tratar a entrada do utilizador,
mostrar sua janela no ecr, etc.
Threads uma inveno recente se comparada com o restante da linguagem. Algumas
outras linguagens (bem poucas) fornecem facilidades para lidar com threads, exemplo:
Modula-3.Tambm conhecidos como lightweight processes, threads so um recurso
extremamente difcil de se implementar, de modo que possvel dizer que ou seu
ambiente de programao oferece facilidades para lidar com eles, ou no vai querer
implement-los/us-los.

CRIAR THREADS UTILIZANDO INTERFACES OU HERANA


Existem duas maneiras bsicas de criar threads em Java, usando interfaces e usando
herana. Usando herana, sua classe j um thread (is a relationship), que quando
tiver seu mtodo start() chamado vai executar tudo o que estiver no mtodo run() em
paralelo.
Usando interfaces, define uma classe cujo mtodo run() vai ser executado por um
thread.
HERANA UTILIZADA PARA CRIAR THREADS

Se quer ter uma idia do que vai acontecer no programinha


abaixo, veja o desenho ao lado. Ns faremos uma corrida de
Threads: A e B. Eles sero iniciados depois que o programa
principal (main) comear. A sai com alguma vantagem pois
iniciado primeiro, depois sai B. A cada loop estes Threads so
obrigados a fazer uma pausa por um intervalo aleatrio at
completarem 4 loops: 0,1,2,3,4.
No final, pedimos ao programa principal que espere os
Threads terminarem seus ciclos para se juntar a eles (mtodo
join() da classe thread).O mtodo join no retorna enquanto o
seu threads no terminar.
Existem uma srie de outras primitivas para lidar com
Threads: pausa. parada, retorno a execuo, etc. No
explicaremos todas aqui. deve fazer leituras complementares,
isso que temos aconselhado. Agora estas leituras podem ser
mais tcnicas, tipo guias de referncia, uma vez que ns j
fizemos a introduo do assunto.
Alguns assuntos, a exemplo de Threads exigem um
conhecimento terico forte, de modo que tambm aconselhamos
que adquira um livro sobre programao concorrente.

Pgina 108

Manual de Curso

MANUAL DE JAVA

Cdigo:
public class MeuThread extends Thread {
public MeuThread(String nome)
{
super(nome);
}
public void run() // o metodo que vai ser executado no thread tem sempre nome run
{
for (int i=0; i<5; i++) {
System.out.println(getName()+ " na etapa:"+i);
try {
sleep((int)(Math.random() * 2000)); //milisegundos
} catch (InterruptedException e) {}
}
System.out.println("Corrida de threads terminada:" + getName());
}
}
class CorridaThreads
{
public static void main (String args[])
{
MeuThread a,b;
a=new MeuThread("Leonardo Xavier Rossi");
a.start();
b=new MeuThread("Andre Augusto Cesta");
b.start();
try {a.join(); } catch (InterruptedException ignorada) {}
try {b.join(); } catch (InterruptedException ignorada) {}
}
}
Resultado:
thread A
thread B

Leonardo Xavier Rossi na etapa:0


Andre Augusto Cesta na etapa:0
Andre Augusto Cesta na etapa:1
Leonardo Xavier Rossi na etapa:1
Andre Augusto Cesta na etapa:2
Leonardo Xavier Rossi na etapa:2
Leonardo Xavier Rossi na etapa:3
Andre Augusto Cesta na etapa:3
Andre Augusto Cesta na etapa:4
Corrida de threads terminada:Andre Augusto Cesta
Leonardo Xavier Rossi na etapa:4
Corrida de threads terminada:Leonardo Xavier Rossi

INTERFACES USADAS PARA CRIAR THREADS


Colocar sua classe abaixo da classe Threads em uma hierarquia, as vezes um preo
muito grande para ter um mtodo dela rodando em um Thread. por isso que Threads
pode ser criados usando interfaces. s tem que dizer que implementa a interface
Runnable, que composta do mtodo run(). Quando um Thread construdo usando
como argumento uma classe que implementa a interface Runnable, executar o mtodo
start para este thread faz com que o mtodo run() de nossa classe comece a ser
executado neste thread paralelo.
Manual de Curso

Pgina 109

MANUAL DE JAVA
Cdigo:
public class RodemeEmUmThread implements Runnable {
public String str; //nome do objecto que vai ter o metodo run rodado em um
//thread
public RodemeEmUmThread(String nome)
{
str=nome;
}
public void run()
{
for (int i=0; i<5; i++) {
System.out.println(str+ " na etapa:"+i);
}
//As mensagens de corrida terminada poderiam se postas aqui.
}
}
class ThreadsRodadores
{
public static void main (String args[])
{
Thread a,b;
RodemeEmUmThread leo,andre;
leo=new RodemeEmUmThread("Leonardo Xavier Rossi");
andre=new RodemeEmUmThread("Andre Augusto Cesta");
a=new Thread(leo);
a.start();
b=new Thread(andre);
b.start();
try { a.join(); } catch (InterruptedException ignorada) { }
//espera thread terminar seu metodo run
try { b.join(); } catch (InterruptedException ignorada) { }
}
}
Resultado:
thread A
thread B

Leonardo Xavier Rossi na etapa:0


Andre Augusto Cesta na etapa:0
Andre Augusto Cesta na etapa:1
Leonardo Xavier Rossi na etapa:1
Andre Augusto Cesta na etapa:2
Leonardo Xavier Rossi na etapa:2
Leonardo Xavier Rossi na etapa:3
Andre Augusto Cesta na etapa:3
Leonardo Xavier Rossi na etapa:4

Andre Augusto Cesta na etapa:4


Exerccios:

Pgina 110

As tarefas de transpor uma matriz ou fazer o espelho de uma imagem (que


pode ser representada por uma matriz) so exemplos fceis de tarefas que
podem ser divididas em dois ou mais Threads. lgico que aqui estaremos
Manual de Curso

MANUAL DE JAVA
buscando tirar vantagem da possvel existncia de mais de um processador e
tambm buscando liberar o Thread principal dessa computao, para que ele
possa fazer outras atividades antes do join().
Escolha uma dessas tarefas e implemente-as usando Threads. Dica: os Threads
devem ser construdos de modo a conter a referncia para a matriz que vai
armazenar o resultado, a referncia para a matriz original e os valores que
indicam em que rea da matriz este Thread deve trabalhar. Por exemplo: no
caso da inverso da imagem um Thread trabalharia em uma metade e o outro
na outra metade.
Seria interessante imprimir no ecr os instantneos da matriz resultado para
ver o trabalho sendo feito em paralelo.

MULTITHREADED
Este tpico discute alguns dos problemas que podem surgir quando lidando com
threads e apresenta algumas das solues da linguagem. No nos aprofundaremos
muito em threads.
Existe um exemplo clssico dos problemas que podem acontecer quando est usando
concorrncia. Imagine que tem um programa que l dados em bytes de algum lugar
(teclado/disco) e os transmite via rede. decidiu utilizar threads porque no quer ficar
com um programa de um nico fluxo de execuo bloqueado porque est esperando o
teclado ou o disco enquanto poderia estar tentando transmitir parte de seu buffer pela
rede.
Para tal dividiu o seu programa em dois threads que ficam repetindo o mesmo
conjunto de aes.
Thread A, Enfileirando valores do teclado (Leitura):
1-L valor do fonte.
2-Consulta o nmero de elementos da fila.
3-Soma um a esse nmero.
4-Enfilera o valor lido.
Thread B, Desenfileirando os valores (E escrevendo-os na sada):
1-Consulta o tamanho da fila se for maior que zero executa prximo passo
2-Retira elemento da fila.
3-Decrementa contador de elementos.
Os seus threads podem no rodar em intervalos definidos, regulares de tempo. Alguns
problemas podem surgir pois a mesma regio de memria acessada por dois fluxos
de execuo distintos que podem ter executados apenas alguns de seus passsos.

Manual de Curso

Pgina 111

MANUAL DE JAVA
public class ThreadA {
//Leitura
while (!fimLeitura)
{
EnfileraUm();
}
}

Thread A

public class ThreadB {


//Escrita
while (!fimEscrita)
{
Escreve(DesenfileraUm());
}
}

Atributo No
elementos
3

Fila:

Thread B
.

1-Consulta No
elementos----2-Incrementa No
elementos-.

>-[D]-[R]-[O]>
>-[D]-[R]-[O]>
>-[D]-[R]-[O]>
>-[D]-[R]-[O]>
>-[D]-[R]->

>-[D]-[R]->

>-[D]-[R]->

4
4

-----Consulta
tamanho da fila-3
-----------Retira um
elemento-4
---Decrementa No
elementos-5
.

A sequncia de operaes 1,2,3,4,5 corrompe o estado de sua estrutura de dados. Se


um s thread estivesse executando sobre a mesma estrutura, ainda assim poderiam
tambm haver momentos em que o atributo nmero de elementos no reflete
exactamente quantos esto na fila, mas isso logo seria consertado. S que com dois
threads, um outro thread pode utilizar essa informao inconsistente sem que haja
tempo para ela ser reparada. Seu programa pode falhar quando tentar retirar um
elemento de uma fila vazia.
Alguns dos passos dos programas acima podem ser divididos em passos menores, mas
o que importa nesse exemplo que sem o uso dos recursos especficos da linguagem
impossvel tornar este programa seguro. O ideal para este nosso exemplo seria que um
Thread tivesse que esperar um ciclo do outro Thread terminar para iniciar o seu prximo
ciclo e vice versa, ou seja os ciclos teriam que ser sincronizados, ocorrer um aps o
outro, podendo intercalar ciclos do Thread A com ciclos do Thread B, mas no pedaos
desses ciclos. Em casos assim , costuma dizer que cada ciclo compe um conjunto de
aes indivisvel.

Pgina 112

Manual de Curso

MANUAL DE JAVA
Agora que
j sabe a soluo, basta saber como implement-la. Os mtodos
EnfileraUm(); e DesenfileraUm(); devem ser especificados como sincronizados. Evite
especificar mtodos muito grandes como sincronizados, pois outros Threads tero que
esperar muito tempo para comear a executar.
public synchronized void EnfileraUm(byte a) {
//esta parte voce ja sabe
}
public synchronized Byte DesenfileraUm() {
//Byte e uma classe wrapper, ela e igual a null se nao ha elementos
//o restante voce ja sabe
}
Agora sua classe segura. s deve se preocupar com a sincronizao dos mtodos do
seu programa. Os mtodos e as classes da linguagem j so escritos para serem
Thread safe, o que gerou muito trabalho para os programadores do Java team.
//Comentrios
Acabamos agora o tpico sobre threads e tambm o manual. Antes de comear a
estudar outros textos, um comentrio final: Se quiser rodar um mtodo de uma classe
j pronta em um thread, lembre-se de coloc-lo (a sua chamada) dentro de um mtodo
com o nome run().

Manual de Curso

Pgina 113

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