Documente Academic
Documente Profesional
Documente Cultură
ndice
INTRODUO......................................................................................5
ADQUIRINDO
CARACTERSTICAS DA LINGUAGEM.................................................................................6
CLASSES
OBJECTOS...........................................................................9
ESPECIFICANDO
UMA
CLASSE.......................................................................................9
OBJECTOS EM JAVA................................................................................................10
DO
ENCAPSULAMENTO
TIPO ABSTRATO
UTILIZADOR................................................................................40
COM
DE
PROTECTED.........................................45
DADOS.......................................................................................58
HERANA........................................................................................73
HIERARQUIAS DE TIPOS...........................................................................................73
INTERFACES, UMA ALTERNATIVA PARA HERANA MLTIPLA..................................................82
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
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:
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.
Cdigo:
//Comentario de uma linha
public class HelloInternet {
}
}
Pgina 11
MANUAL DE JAVA
6-Observe o resultado no ecr: Hello
Internet!
Hello Internet!
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:
...
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.
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 : ==
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.
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.
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.
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
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
Manual de Curso
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
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.
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)
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.
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.
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:
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:
//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+")");
}
}
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
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
}
Pgina 34
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 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.
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
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
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:
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
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
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:
//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.
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 ).
ENCAPSULAMENTO
COM
PROTECTED
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.
private
protected
Nada
especificado,
equivale
package
ou friendly
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
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
//atributos private
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);.
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.
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.
PUBLIC
PRIVATE
PROTECTED
PACKAGE
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();
}
}
Pgina 53
MANUAL DE JAVA
}
Resultado:
(0,0,1)
(4,3)
Dist:4
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: ;
}
} 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
//divisor
//move sinal
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)); }
//exibe fracao
//converte para
//converte
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:
//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:
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.
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:
//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
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.
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
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
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;
}
); }
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.
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
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
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
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
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:
REPRESENTAO
LIMITE DE VISIBILIDADE
4)private
Pgina 82
Manual de Curso
MANUAL DE JAVA
//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;
}
}
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
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
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.
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:
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.
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
ser
contornada
definindo
Pgina 89
MANUAL DE JAVA
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.
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
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
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
MANUAL DE JAVA
definir classes semelhantes as contas bancrias como poupana, conta corrente,
etc. Os mtodos devem ter nomes como deposita, saca, computa, etc.
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
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.
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
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
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
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.
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
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
Pgina 110
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
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
.
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