Professional Documents
Culture Documents
A LINGUAGEM DE PROGRAMAO
JAVA
ORIENTAO A OBJETOS
Instituto de Computao
outubro, a
Marcas Registradas:
3
4
Prefcio:
Erro! Indicador no definido.Este texto faz parte de um estudo comparativo de linguagens de
programao orientadas a objetos. O contedo deste estudo tambm est disponvel na World Wide
Web, rea multmidia da internet, sob o endereo http://www.dcc.unicamp.br/~aacesta . Neste
endereo, voc pode complementar seu aprendizado, rodando exerccios iterativos, acessando links
para outros hipertextos sobre linguagens de programao, vendo exemplos de programas e interagindo
com aplicaes para a internet.
A diferena entre este estudo e outros textos que voc possa encontrar sobre o mesmo assunto o
carter prtico. Exemplos completos, dicas de programao, explicaes sobre detalhes normalmente
ignorados em livros, tornaro seu aprendizado mais fcil, principalmente na segunda parte onde
tratamos da construo de aplicaes para a internet.
No inicio, os exemplos podem ser considerados fceis, mas eles vo se complicando cada vez
mais de modo que importante que o leitor acompanhe o texto fazendo os exerccios. Forneceremos
uma srie de idias de programas simples para que voc possa testar seu conhecimento. Estes
programas simples podem ser melhorados atravs do uso de interfaces grficas, assunto que no
coberto neste tutorial.
Qualquer leitor que tenha experincia com pelo menos uma linguagem de programao.
Erro! Indicador no definido.Apesar de Java ser uma linguagem que serve para vrios
propsitos, o seu sucesso atual (poca do seu lanamento) se deve a possibilidade de elaborao de
aplicaes para a internet. Dada a importncia deste aspecto da linguagem, este texto est organizado
de maneira semelhante as pginas encontradas na WWW, frequentemente voc encontrar diagramas
como o seguinte:
Este diagrama representa um hipertexto que pode ser acessado de modo a complementar seu
estudo. A parte escrita em letra maior o endereo, o texto em itlico faz um resumo do contedo
desta pgina. Usando estes linksErro! Indicador no definido. ou diagramas voc encontrar uma
maneira ordenada de aprender sem se perder no mar de informaes da internet.
5
O diagrama acima aparecer toda vez que introduzirmos uma palavra nova. Caso voc encontre
alguma palavra desconhecida, basta usar o ndice remissivo para obter sua definio.
importante lembrar que os hipertextos citados neste tutorial, no so de nossa responsabilidade.
Como eles esto sujeitos a mudanas, contamos com a sua ajuda para efetuarmos atualizaes, conte
voc tambm com a nossa ajuda na internet.
Os programas exemplo deste texto so apresentados em caixas retangulares, e todo cdigo
escrito em fonte diferente da usada neste texto comum. O trechos de cdigo que aparecem
desmembrados de seus arquivos, tem fundo cinza claro. Todos os arquivos presentes dentro dos
retngulos, so arquivos text-only, qualquer formatao (negrito) tem apenas funo didtica.
DIVISO DO TUTORIAL
Erro! Indicador no definido.Este tutorial contm uma sequncia de tpicos que permite
apresentar a linguagem sob a tica da teoria de orientao a objetos. A apresentao do modelo de
objetos da linguagem e conceitos relacionados tais como polimorfismo, tratamento de excees est
em primeiro plano. Ao longo dessa apresentao, em segundo plano, voc aprender os aspectos
bsicos da linguagem tais como loops, desvios condicionais, etc.
Estes tpicos so frequentemente retomados, cada vez de maneira mais aprofundada. Quando
terminamos o assunto mtodos, voc j est pronto para saber o que so contrutores, e exatamente
isto que ensinamos. Porm o assunto contrutores no esgotado, voc ainda vai aprender a usar
construtores em conjunto com agregao e depois em conjunto com herana.
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-
APPLETS se...
APPLETS: So pequenos programas escritos em Java que podem ser embebidos em documentos
hipetextos. So exemplos de applets: animaes, imagens, botes, etc. Applets podem suportar efeitos de
multimidia como sons, iteraes com o usurio (mouse, teclado), imagens, animaes, grficos, etcErro!
Indicador no definido..
Ao longo do texto,voc perceber que Java excelente para desenvolver aplicaes comerciais e
para ser usada em universidades. Java pode ser vista como uma fuso de vrias tcnologias que vm
6
sendo desenvolvidas na rea de computao, de modo que estudantes dessa linguagem tem a
oportunidade de tomar contato com vrios tpicos recentes: programao concorrente, sitemas
distribudos, orientao a objetos, protocolos da internet, e uma srie de outros assuntos fceis de
praticar nessa linguagem.
claro que os resultados dependero de seu esforo, portanto depois de ler esta introduo,
descanse um pouco, tome um cafezinho1. Pois durante o restante do texto esperaremos que voc se
envolva com a linguagem, reuse programas encontrados na W.W.W, se comunique com colegas
programadores, participe de listas de discusses, newsgroups (comp.lang.Java & alt.www.hotJava),
e o mais importante: PROGRAME, PROGRAME, RE-PROGRAME!
BROWSERS: So uma categoria de programas que permitem voc visualizar um documento criado em
um certo padro, no caso html (hipertext markup language). Atualmente os browsers tem se tornado
complexos devido a quantidade de padres existentes (ex. imagens .gif .jpg, etc). A linguagem Java pode
contribuir para minimizar esta complexidade.Erro! Indicador no definido.
CARACTERSTICAS DA LINGUAGEM
1
Um dos smbolos da linguagem uma xcara de caf que aparece em animaes com sua fumaa quente tremulando.
7
Erro! Indicador no definido.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:
Portvel:
Java foi criada para ser portvel. 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)Erro! Indicador no definido.Erro! Indicador no
definido.Erro! Indicador no definido.. No necessrio recompilar um programa para que ele rode
numa mquina e sistema 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 d
os programas exemplo deste tutorial foram escritos e compilados numa plataforma Windows-95 e
rodaram perfeitamente quando simplesmente copiados para uma plataforma Solaris 2.3. Em Java
um inteiro por exemplo, tem sempre 32 bits, independentemente da arquitetura. O prprio compilador
Java escrito em Java, de modo que ele portvel para qualquer sistema que possua o interpretador
de byte-codes. Um exemplo de programa escrito em Java o browser hotjava.
Orientada a Objetos:
A portabilidade uma das caractersticas que se inclui nos objetivos almejados por uma
linguagem orientada a objetos. Em Java ela foi obtida de maneira inovadora com relao ao grupo
atual de linguagens orientadas a objetos.
Java suporta herana, mas no 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 abstratas. Outra caracterstica importante em linguagens
orientadas a objetos a segurana. Dada a sua importncia o tpico foi escrito a parte.
Segura:
Erro! Indicador no definido.A presena de coleta automtica de lixo, evita erros comuns que
os programadores cometem quando so obrigados a gerenciar diretamente a memria (C , C++, Pascal
). A eliminao do uso de ponteiros, em favor do uso de vetores, objetos e outras estruturas
substitutivas traz benefcios em termos de segurana. O programador proibido de obter acesso a
8
memria que no pertence ao seu programa, alm de no ter chances de cometer erros comuns tais
como reference aliasing e uso indevido de aritmtica de ponteiros. Estas medidas so
particularmente teis quando pensarmos em aplicaes comerciais desenvolvidas para a internet.
Ser strongly typed tambm uma vantagem em termos de segurana, que est aliada a
eliminao de converses implcitas de tipos de C++.
A presena de mecanismos de tratamento de excees torna as aplicaes mais robustas, no
permitindo que elas abortem, mesmo quando rodando sob condies anormais. O tratamento de
excees ser til na segunda parte para modelar situaes tais como falhas de transmisso e formatos
incompatveis de arquivos.
Suporta concorrncia:
Eficiente:
Erro! Indicador no definido.Como Java foi criada para ser usada em computadores pequenos,
ela exige pouco espao, pouca memria. Java muito mais eficiente que grande parte das linguagens
de scripting existentes, embora seja cerca de 20 vezes mais lenta que C, o que no um marco
definitivo. Com a evoluo da linguagem, sero criados geradores de byte-codes cada vez mais
otimizados 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 arquitetura
on the fly, tudo a partir do byte-code.
Erro! Indicador no definido.Java fornece facilidades para programao com sockets, remote
method call, tcp-ip, etc. Estes tpicos no sero abordados neste texto.
9
PROGRAMAO ORIENTADA A OBJETOS
Erro! Indicador no definido.
NOTA AOS PROGRAMADORES C
Iniciaremos com um pouquinho de teoria sobre orientao a objetos. Se voc quiser algum
hipertexto para aprofundamento ou para ler em paralelo com esta introduo sobre classes e objetos e
use:
http://www.dcc.unicamp.br/~aacesta/java/group.html
Esta a homepage do grupo de estudos em Java. Voc vai encontrar links atualizados para diversos
TUTORIAIS lugares na internet onde se estuda Java.
1. CLASSES E OBJETOS
Erro! Indicador no definido.Uma classe um tipo definido pelo usurio que contm o molde,
a especificao para os objetos, algo mais ou menos como o tipo inteiro contm o molde para as
variveis declaradas como inteiros. A classe envolve, associa, funes e dados, controlando o acesso a
estes, defin-la implica em especificar os seus atributos (dados) e seus mtodos (funes).
Um programa que utiliza uma interface controladora de um motor eltrico provavelmente
definiria a classe motor. Os atributos desta classe seriam: temperatura, velocidade, 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 vetor 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 objeto contendo
as informaes particulares do novo texto. Isto se chama instanciao ou criao do objeto.
10
Vamos abstrair todos estes detalhes por enquanto e modelar somente a interface do motor como
uma classe, a pergunta que mtodos e que atributos deve ter nossa classe, que argumentos e valores
de retorno devem ter os mtodos?
Representao da velocidade:
Erro! Indicador no definido.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.
O motor precisa conhecer a sua sada serial, a sua ligao com o motor do mundo real. Suponha
uma representao em hexadecimal do atributo endereo de porta serial, um possvel nome para o
atributo: enderecomotor. No se preocupe em saber como usar a representao hexadecimal.
Internamente o usurio 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.
O ato de invocar um mtodo tambm chamado de passar uma mensagem para o objeto que est
executando este mtodo.
No faz sentido usar, chamar, este mtodo separado de uma varivel do tipo motor, mas ento
porque na lista de argumentos da funo no se encontra um motor? Este pensamento reflete a
maneira de associar dados e cdigo (funes) das linguagens procedurais. Em linguagens orientadas a
objetos o cdigo e os dados so ligados de forma diferente, a prpria declarao de um tipo definido
pelo usurio j engloba as declaraes das funes inerentes a este tipo, isto ser explicado em 1.2. O
objeto ao qual aplicado o mtodo passado de outra forma.
Note que no fornecemos o cdigo do mtodo, isto no importante, por hora 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.
11
Este e outros diagramas deste texto foram elaborados com uma ferramenta case para object oriented modeling Erro!
Indicador no definido.and design segundo a metodologia descrita emErro! Indicador no definido.Erro! Indicador
no definido. [[1]]
Exerccios:
1-
Lembre-se de algum programa em que voc trabalhou, cite que tipos de classes seriam criadas se
esse programa fosse escrito em Java, que atributos e que mtodos estariam associados a esses objetos?
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 usar os tipos da linguagem inda). Dentre os mtodos desta classe
estariam funes para efetuar saques, depsitos e computar juros.Erro! Indicador no definido.
Uma classe e suas instancias: Cada estudante (ou instancia) poderia ser
modelado, desenhado como:
Objetos podem conter objetos, ou seja os atributos de um objeto podem ser objetos, da mesma
classe ou no. Objetos podem ser passados pela rede, armazenados em meio fsico. Objetos possuem
um estado e um comportamento. Mtodos podem receber objetos como argumentos, podem declarar
12
objetos como variveis locais, podem chamar outros mtodos. Voc pode chamar um mtodo (mandar
uma mensagem) para objetos em outras mquinas atravs de sua rede.
Um objeto pode ser visto como um RECORD, s que com uma tabela de funes que podem ser
chamadas para ele. Na verdade esta definio no muito terica, mas um bom comeo para os
programadores que esto acostumados com linguagens procedurais. Na verdade podemos fazer com
objetos 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.
Erro! Indicador no definido.Erro! Indicador no definido.Erro! Indicador no
definido.Esta filosofia simples e semelhante a adotada 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, voc pensar que em
Java toda funo implementa um mtodo de uma classe.
O leitor no acostumado com o paradigma de orientao a objetos, pode achar estranhas as
afirmaes acima, e a pergunta mais comum neste momento : Mas ento como voc sabe aonde vai
comear o programa?. Antes da resposta a essa pergunta, leia o primeiro programa exemplo, que
semelhante ao primeiro programa em C, Hello World, presente em [[2]].
Erro! Indicador no definido.Este exemplo visa apresentar um programa simples para imprimir
uma mensagem na tela, este provavelmente ser seu primeiro programa em Java.
Erro! Indicador no definido.
COMPILANDO UM PRIMEIRO PROGRAMA:
1-Certifique-se de ter adicionado a sua lista de //Comentario de uma linha
paths o path do compilador e interpretador Java.
Javac e Java respectivamente. public class HelloInternet {
Erro! Indicador no definido.
2-Crie o arquivo ao lado em um diretrio qualquer
(folder para usurios mac) e salve com o nome: public static void main (String args[])
HelloInternet.Java {
13
HelloInternet
HelloInternet
Erro! Indicador no definido. o nome dado a esta classe. O abre chaves marca o
incio das declaraes da classe que so os atributos e mtodos. Esta classe s possui uma declarao, a
do mtodo main, note que um mtodo, ao contrrio de C++, s pode ser declarado {internamente} a
classe a qual pertence, evitando as confuses sobre escopo. Desta forma, todo pedao de cdigo em
Java deve pertencer ao abre chaves, fecha chaves da definio de uma classe.
public
1
Identificadores em letras maisculas e minsculas so diferentes, a linguagem case-sensitive.
14
um qualificador do mtodo que indica que este acessvel externamente a esta classe (para
outras classes que eventualmente seriam criadas), no se preocupe com ele agora, apenas declare todos
os mtodos como public. Voltaremos a este assunto em 1.5. Erro! Argumento de opo
desconhecido.
static
um outro qualificador ou specifier, que indica que o mtodo deve ser compartilhado por
todos os objetos que so criados a partir desta classe. Os mtodos static podem ser invocados, mesmo
quando no foi criado nenhum objeto para a classe, para tal deve-se seguir a sintaxe:
<NomeClasse>.<NomemetodoStatic>(argumentos);. Retornaremos a esta explicao mais tarde,
por hora voc precisa saber que particularmente o mtodo main precisa ter essa qualificao porque
ele chamado sem que se crie nenhum objeto de sua classe (a classe HelloInternet).
Curiosidade:
void
Erro! Indicador no definido.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
Erro! Indicador no definido.Este um nome particular de mtodo que indica para o
compilador o incio do programa, dentro deste mtodo e atravs das iteraes entre os atributos,
variveis e argumentos visveis nele que o programa se desenvolve.
(String args[])
o argumento de main e por consequncia do programa todo, ele um vetor de Strings que
formado quando so passados ou no argumentos atravs da invocao do nome do programa na linha
de comando do sistema operacional, exemplo:
Java HelloInternet argumentotexto1 argumentotexto2
No nosso caso, ignoramos a possvel passagem de argumentos via linha de comando,
retornaremos a este assunto em 1.3.
{ ... }
1
main, do ingls: Principal.
15
Erro! Indicador no definido. 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 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 objeto 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. Por hora voc pode guardar esta linha de
cdigo como o comando para imprimir mensagens na tela, onde o argumento que vem entre aspas a
String a ser impressa. O ; ponto e vrgula separa operaes.
}
Finalmente o fecha chaves termina com a declarao da classe HelloInternet.
Concluso:
Exerccios:
1-
Experimente fazer modificaes no programa HelloInternet. Imprima outras mensagens na tela,
adicione comentrios.
1.2.2. ATRIBUTOS
16
um trecho de cdigo, at o tpico Erro! Argumento de opo desconhecido. cada classe ser
especificada em um arquivo.
importante entender este exemplo, quando voc estudar interfaces grficas, poder usar a classe
crculo pr-definida na linguagem para desenhar crculos que se movem na tela. 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). No final deste tpico forneceremos uma explicao
detalhada sobre tipos.Erro! Indicador no definido.
(0,0,0)
(17,0,0)
17
Erro! Indicador no definido.Erro! Indicador no definido.Erro! Indicador no definido.A
declarao umcirc.x=umcirc.x+17 presente em nosso programa deixa os matemticos doidos pois de
voc 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 chamado para ambos arquivos. Ou voc pode usar os chamados
wildcards1 javac *.javaErro! Indicador no definido..
Sem Includes:
O primeiro arquivo deste exemplo contm o cdigo da classe Circulo, esta classe contm trs
atributos . A declarao de atributos segue sintaxe semelhante a de C++ (havero acrscimos a esta
sintaxe): Erro! Indicador no definido.
1
Wild-Card, do ingls: Coringa , carta de baralho. O * substitui os nomes de todos os arquivos, assim como o coringa pode
susbtituir todas as cartas em jogos de baralho.
18
public float raio;
public float x;
public float y;
Todos os atributos pertencentes a classe so do tipo float (Ponto flutuante 32-bit IEEE754, veja
tabela de tipos bsicos). Esto especificados como public o que significa que podem ser modificados a
partir de uma classe que usa um objeto Circulo seja como varivel de mtodo ou como atributo (este
tipo de modificao ser exemplificado na classe Principal).
Existem outros especificadores que abordaremos mais adiante, por hora todos os mtodos e
atributos que criarmos devero ser public. Vale lembrar que na declarao de variveis simples em
mtodos, no faz sentido usar o EspecificadorModoAcesso. Esta classe Circulo no possui
mtodos.Erro! Indicador no definido.Erro! Indicador no definido.
Como exemplo de declarao de variveis simples tome 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 usada. Note que os atributos so por default inicializados para
zero.
A classe Principal no possui atributos, porque nenhum objeto desta classe criado, apenas seu
mtodo main chamado. O mtodo main declara uma referncia para objeto da classe Circulo:
Circulo umcirc;. Note que diferentemente de C++ no so necessrios includes ou header files
para poder declarar essa varivel de um tipo definido pelo usurio e existente em outro arquivo.
Antes da referncia ao objeto ser usada, este precisa ser alocado na memria o que feito
atravs de umcirc=new Circulo();. Se voc tivesse declarado um objeto da classe String, j definida
na linguagem, e depois fizesse sua alocao, o cdigo seria semelhante ao seguinteErro! Indicador
no definido.:
String umastring;
umastring=new String(Valor inicial);
Erro! Indicador no definido.A diferena com a alocao do objeto Circulo que entre os
parnteses incluem um argumento Valor inicial, isto ocorre porque a linguagem permite que voc
aproveite a alocao de um objeto para inicializar alguns de seus atributos, isto ser explicado em
1.2.6.Erro! Argumento de opo desconhecido.. Neste nosso programa, os atributos contidos na rea
de memria alocada por new, so alterados de outra forma.
19
Acesso aos atributos e mtodos e alteraes dos atributos:
System.out.println("("+umcirc.x+","+umcirc.y+","+umcirc.raio+")");
Erro! Indicador no definido.Erro! Indicador no definido.O argumento de println que
conhecemos uma nica varivel do tipo String, no entanto o cdigo acima mistura nos argumentos
desse mtodo os seguintes elementos: Strings: (, operadores : +, e variveis float: umcirc.y. Fica
muito fcil de voc 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 StringsErro! Indicador no definido..
20
Java) a==a tem valor 1 com o significado dado pelo programador de true ou verdadeiro, mas
a=1+0; tambm tem como resultado o valor 1, mas agora com o significado inteiro, numrico. O
compilador no sabe distinguir entre os significados numrico e booleano.
Essa ambiguidade faz com que programadores (C ou C++) no acostumados com esta conveno
de operadores = e ==, incorram no erro de escrever j=1 quando na verdade queriam dizer j==1, mas
para o compilador ambas as expresses tem valor inteiro de modo que se esse engano ocorrer num
teste de parada de um loop, pode ocorrer que ele nunca pare, pois 1 tem o mesmo valor de true.
Java elimina este tipo de erro introduzindo o tipo boolean com os valores true e false, que no
tem nenhuma relao com o tipo int e qualquer outros tipos.
boolean Valor true ou false, diferente representao de C++, sem converso em outros tipos.
O tipo boolean no tem relao nenhuma com outros tipos (coero). Eliminando problemas que
surgiram por exemplo em C++ que usa inteiros para representar valores booleanos. Os possveis
valores so true e false que so os resultado dos testes lgicosErro! Indicador no definido.Erro!
Indicador no definido..
boolean pertenceAoConjunto; //declara variavel
21
pertenceAoConjunto=true; //exemplo
Exerccios:
1-
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 objeto imprimindo seus atributos na tela.
22
2-
Simplifique o programa anterior retirando o atributo raio. Voc 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 voc aprendeu corretamente a sintaxe da linguagem.
3-
Reescreva a classe Circulo para trabalhar com atributos do tipo int.
23
{
num=n;
}
}
Erro! Indicador no definido.
//Classe principal, Arquivo Princ.Java
umcont=new Contador();
//alocacao
umcont.comeca(0);
System.out.println(umcont.num);
umcont.incrementa();
System.out.println(umcont.num);
}
0
1
Exerccios:
Erro! Indicador no definido.
1-
Defina um mtodo chamado mostra para a classe contador. Este mtodo deve imprimir o estado
do contador na tela. A implementao deste mtodo depende de onde voc est imprimindo o estado
do contador? Pense em programas de interfaces grficas e de linha de comando.
Mquinas de estados:
24
Erro! Indicador no definido.Olhando para o desenho contido no canto direito superior do
arquivo da Classe contador, voc consegue imaginar este contador como uma mquina de estado? O
uso de objetos como mquinas de estados um dos conceitos que exemplificaremos deste texto.
this:
Erro! Indicador no definido.this uma palavra chave usada num mtodo como referncia
para o objeto corrente, ela tem o significado de: o objeto 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 objeto corrente.
Agora reapresentaremos o programa Circulo baseado no exemplo 1.2.2, porm um pouco mais
complicado:
Mtodo move:
25
O mtodo move altera as coordenadas do objeto. O objeto tem suas coordenadas x e y somadas
com os argumentos dessa funo. Note que este mtodo representa uma maneira mais segura, clara,
elegante de alterar as coordenadas do objeto do que acess-las diretamente da seguinte forma:
ac.x+=dx;. ac.y+=dy;. Lembre-se que ac.x+=dx uma abreviao para ac.x=ac.x+dx;.
Mtodo mostra:
//Classe circulo
public float x;
//posicoes em coordenadas cartesianas
public float y;
class Principal {
26
umcirc.y=0;
umcirc.raio=12;
umcirc.mostra();
umcirc.move(10,10);
umcirc.mostra();
umcirc.x=100;
umcirc.mostra();
}
}
Erro! Indicador no definido.
(0,0,12)
(10,10,12)
(100,10,12)
Exerccios:
1-
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?
2-
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. Voc pode abstrair o uso desse mtodo como uma
maneira de inicializar o objeto de uma s vez embora isto seja feito seqencialmente. Comente as
vantagens desta abordagem, comparando com as outras opes, tenha sempre em mente a questo de
segurana quando avaliar tcnicas diferentes de programao.
3-
No programa anterior, verifique que nada impede que voc acesse diretamente 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
27
funes pudessem modificar x, y e raio. Voc ver que isso possvel em encapsulamento 1.5. Por
hora, crie esses mtodos se preocupando em permitir atravs chamadas a eles tudo o que for possvel
fazer com acesso direto 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
4-
Teste o mtodo move com argumentos negativos, exemplo ac.move(-1.0,-1.5);. O resultado
coerente?
Erro! Indicador no definido.At agora s havamos visto mtodos com valor de retorno igual a
void. Um mtodo, assim como uma funo comum, pode retornar um nico elemento de qualquer tipo,
inclusive os definidos pelo usurio ou seja: objetos. Sendo assim, sua chamada no programa se 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:
28
public void atrave(String q)
//move o circulo de lugar
{
this.travado=true;
this.quem=q;
}
umatrava=new Trava();
umatrava.atrave("ProgramaPrincipal");
System.out.println(umatrava.estado());
umatrava.adestrave("ProgramaPrincipal");
System.out.println(umatrava.estado());
}
true
false
29
A classe trava demasiadamente simples, mas se no o fosse no estaria na parte introdutria
deste tutorial. Esta classe acaba tendo a funcionalidade de uma varivel booleana e o custo de um
objeto, mas neste ponto cabe a voc estender este modelo para representar uma trava de arquivo
(armazena o nome e path deste) ou uma trava de um objeto, evitando que este seja alterado.
Exerccios:
1-
Melhore a classe Contador de Erro! Argumento de opo desconhecido., defina um mtodo
que imprime o contador na tela. Se voc estivesse fazendo um programa para funcionar em uma
interface grfica com o usurio este mtodo para imprimir na tela seria o mesmo? Definir um mtodo
que retorna uma cpia do valor atual do contador garante maior portabilidade? Por qu? Para aprender
a retornar valores consulte este tpico.
2-
Insira um novo mtodo na classe Trava que tenha a funo de alternar entre os estados do objeto,
independente do estado atual (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.
3-
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.
30
//garante o estado do objeto
{
this.x=ax; this.y=ay; this.raio=ar;
}
31
}
Erro! Indicador no definido.
Disposio dos mtodos e atributos na declarao de uma classe:
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 objeto
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.Erro! Indicador no definido.
Existem libraries de classes que permitem o programador C++ desenvolver aplicaes para
ambientes como o Microsoft Windows de uma maneira bastante abstrata, este um exemplo claro de
reuso 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 usurio seja para
aplicaes para a internet (rodando em browsers) ou para sistemas como o Windows ou Mac/Os e
X-Windows .Erro! Indicador no definido.
(0,0,10)
(1,1,10)
(100,1,12)
PROGRAM Comparacao;
{COMPARACAO COM UM PROGRAMA Java}
TYPE Circulo=RECORD
x:real;
{COORDENADAS X E Y}
32
y:real;
r:real;
{somente dados}
END;
var ac:circulo;
leitura:integer;
FUNCTION Retorna_Raio(copieme:Circulo):real;
BEGIN
Retorna_Raio:=copieme.r;
END;
PROCEDURE Mostra(copieme:Circulo);
{MOSTRA O CIRCULO NA TELA}
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);
33
Mostra(ac);
ac.x:=100.0;
Altera_Raio(ac,12.0);
Mostra(ac);
read(leitura);
END.
//COMENTARIOS JAVA:
As classes em Java so compostas de atributos e mtodos. Para executar uma ao sobre o objeto
ou relativa a este basta chamar um mtodo : ac.mostra(); O mtodo no precisa de muitos
argumentos, porque prprio da classe e portanto ganha acesso aos atributos do objeto para ao qual ela
foi associado:
public float retorna_raio(void)
{ return raio; //tenho acesso direto a raio. }
{ COMEntArios Pascal: }
Segurana:
Em ambos programas (Pascal, Java) o programador pode obter acesso direto aos dados do tipo
definido pelo usurio: ac.x:=100.0; (Pascal) ou ac.x=100.0; (Java).
Veremos em 1.5 ENCAPSULAMENTO maneiras de proibir este tipo de acesso direto 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.
Eficincia:
Erro! Indicador no definido.Algum pode argumentar que programas que usam bastante
chamadas de mtodos podem se tornar pouco eficientes e que poderia ser melhor obter acesso direto
34
aos dados de um tipo definido pelo usurio 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 direto aos dados de um tipo definido pelo usurio por razes de segurana.
Exerccios:
1-
Implemente outros mtodos do estilo public void altera_raio(float a) e float
retorna_raio(void) para os atributos X e Y.
3-
Verifique que em main() voc pode modificar o atributo x do objeto 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 voc
gostaria que o usurio se limitasse ao uso da interface do objeto, como faz-lo ser explicado em 1.5
encapsulamento. Por hora, apenas crie mtodos que sirvam como alternativas a este tipo de acesso
direto.
1.2.6. CONSTRUTORES
35
dados de forma organizada, imagine se voc esquece de inicializar corretamente 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:Erro! Indicador no definido.
String a;
a=new String(Texto); //alocacao e inicializacao atraves do construtor
a.mostra(); //mostra so pode ser chamada depois do construtor
Nos exemplos anteriores tambm usvamos construtores no momento de inicializar nossos
objetos, 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:
Erro! Indicador no definido.
//Classe ponto
36
public class Principal {
}
Erro! Indicador no definido.
(0,0)
(1,1)
(100,1)
//COMENTARIOS:
Erro! Indicador no definido.
Note que com a definio do construtor, voc obrigado a passar os argumentos deste no
momento da alocao do objeto. Se voc precisa ter a opo de no passar esses valores ou passar
outros, as possveis solues sero dadas em 3.
(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 objetos em diversos locais de um programa muito comum.
Objetos podem ser criados dentro de estruturas condicionais, armazenados em arquivos, passados
como parmetros, inseridos em estruturas dinmicas dentro de outros objetos, etc.
Exerccios:
1-
Um mtodo pode chamar outro mtodo da mesma classe. Parta do exemplo de 1.2.5 e crie um
construtor que chama o antigo mtodo inicializa(float a,float b) repassando os argumentos do
construtor:Erro! Indicador no definido.Erro! Indicador no definido.
ponto(float a, float b)
{ inicializa(a,b); }
Na chamada de inicializa() fica implcito que ela se aplica ao objeto cujo construtor foi chamado.
Isto vlido tambm para outros mtodos que chamam mtodos, ou seja, no necessrio o operador
identificador.inicializa(a,b); , veja 1.2.4 uso de this.
37
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 objeto 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 objeto
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.
2-
Introduza mensagens no construtor tipo: System.out.println(Objeto instanciado); introduza
trechos parecidos em outros pontos de seu programa. O objetivo acompanhar visualmente a
seqncia de criao e modificao dos objetos.
3-
Esta classe Ponto pode ser adaptada para funcionar como representao de vetores em duas
dimenses, para tal fornea outros mtodos teis: mtodos para tornar o vetor unitrio, retornar o
mdulo do vetor, a componente x e y. Para tal voc ter que fazer uso de Math.cos(double a); Erro!
Indicador no definido.Erro! Indicador no definido.Erro! Indicador no
definido.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 usar 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.Erro! Indicador no definido.
4-
Erro! Indicador no definido.Crie uma classe reta que tem como atributos dois objetos da
classe ponto. Dica: No use construtores, use funes do tipo inicializa(), j apresentadas. Quando
seu programa ficar pronto acrescente mtodos para esta reta tais como inclinao, coeficiente linear,
etc. Para acrescentar construtores leia 1.2.7. Existem maneiras mais eficientes e compactas de
representar uma reta, porm faa como foi sugerido, neste caso o objetivo no eficincia.
38
Este programa busca chamar sua ateno para o fato de que objetos so alocados dinamicamente
e que caso voc 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 objetos era fcil, mas agora que temos objetos funcionando
dentro de outros objetos h necessidade de adotar tcnicas melhores. Veremos a seguir duas
alternativas para alocar os atributos Ponto presentes na classe Reta:
Alternativa 1:
Primeiro aloca-se o objeto da classe Reta, depois chama-se para cada atributo da classe Ponto a
rotina de alocao:Erro! Indicador no definido.
Reta r1;
r1=new Reta();
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 Reta a tarefa de alocar e inicializar os atributos de forma
coerente. Os argumentos do construtor da classe Reta passam a conter valores teis para a chamada
dos construtores de seus atributos. Esta alternativa executada pelo programa a seguir:
class Reta {
}
Erro! Indicador no definido.
Erro! Indicador no definido.Erro! Indicador no definido.
//Classe principal, Arquivo Principal.java
39
class Principal {
Alguns podem argumentar que esta maneira de representar uma reta no muito eficiente, mas
no do escopo deste texto tratar de problemas dessa natureza, o que alis complicaria muito o cdigo
, desviando-nos do objetivo principal: simplicidade na apresentao de conceitos de orientao a
objetos. O leitor deve ampliar os modelos aqui sugeridos em aplicaes na sua rea de interesse. Como
ainda faltam conceitos importantes para serem apresentados este tipo de aplicao deve ser feita em
paralelo com a leitura.
Erro! Indicador no definido.
Exerccios:
1-
Implemente um programa que use a mesma lgica do exemplo anterior para criar uma classe
composta de outras . Voc estar usando agregao. Por exemplo um tringulo precisa de trs pontos
para ser definido.
2-
Uma implementao mais eficiente da classe Reta seria feita armazenando apenas um coeficiente
angular e um linear, mas esta reta deveria prover tambm um construtor que aceitasse dois pontos
como argumentos. Como voc no aprendeu sobrecarga de construtores (definir vrios construtores),
use s um construtor que tem coeficiente angular e linear como argumentos e implemente esta nova
classe reta (sem usar agregao agora).
3-
Defina um mtodo para a classe Reta que retorna o ponto de intercesso com outra reta: public
Ponto intercessao(Reta a);. No se esquea de tratar os casos degenerados, tais como retas
paralelas e coincidentes, use por exemplo mensagens de erro ou valor de retorno igual a null. Verifique
que um mtodo de uma reta recebe outra reta (mesmo tipo) como argumento. Dentro do mtodo os
atributos do argumento a devem ser acessados do seguinte modo:
ap1.x;
Mais tarde, em 4.3 tratamento de excees, veremos maneiras melhores de lidar com esses casos
degenerados.
4-
Defina um mtodo chamado move para a classe Reta, lembre-se de mover os dois pontos juntos
(a inclinao no deve mudar).
40
5-
Defina um mtodo public void gira(tipox angulo); para a classe Reta. Este mtodo recebe um
ngulo como argumento, voc 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 reta deve ser girada (voc pode usar mais de um argumento). Use funes matemticas (seno
cosseno) e outras descritas no exerccio 3 de 1.2.6
41
1.3. PONTEIROS, POINTERS, REFERNCIAS E OBJETOS
Exerccios:
1-
class X {
42
//imprima os atributos de um objeto OBJ da classe X
//chame o metodo troca de outro objeto, usando OBJ como argumeto
//verifique a alteracao nos atributos desse argumento
O cdigo acima mostra como definir um mtodo que usa a existncia implcita de ponteiros na
linguagem para criar um mtodo que troca os atributos de dois objetos da mesma classe. Implemente
este mtodo e faa os testes sugeridos nos comentrios desse cdigo.
Erro! Indicador no definido. Vetores so objetos, eles possuem papel importante no estilo
de programao desta linguagem que exclui ponteiros. Por serem objetos, vetores so obrigatoriamente
alocados de maneira dinmica. O exemplo a seguir aloca um vetor de inteiros com trs posies,
seguindo uma sintaxe semelhante a de alocao de objetos:Erro! Indicador no definido.
class VetorTest {
public static void main (String args[]) {
int vetor[]=new int[3];
vetor[0]=0; //indexacao semelhante a C , C++
vetor[1]=10;
vetor[2]=20;
System.out.println(vetor[0]+" "+vetor[1]+" "+vetor[2]+" ");
}
}
0 10 20
43
int a[3][3]={{0,10,20},{30,40,50},{60,70,80}};
Erro! Indicador no definido.
Em mtodos, argumentos e valores de retorno que so vetores, so escritos da seguinte forma:
int[] , ou tipo[] nomedavariavel //no caso de argumentos.
Diagrama do vetor:
Perceba que a faixa til do vetor vai de 0 at (n-1) onde n o valor dado como tamanho do vetor
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 voc usa corretamente os ndices do vetor. Se ocorrer um acesso ao vetor[i] onde i
um ndice invlido (fora da faixa de valores permitidos), voc receber uma mensagem parecida
com: java.lang.ArrayIndexOutOfBoundsException: #. Retornaremos ao 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 vetor de dados:
a.length; //armazena o numero de elementos do vetor a
Declarar um vetor de objetos, por exemplo objetos da classe Ponto, no implica que os objetos
de cada posio do vetor 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 vetores no lugar de ponteiros)
Exerccios:
1-
Escreva um programa simples que toma um vetor de preos e um de descontos (50%=.5), e altera
o vetor 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
Vetor calculado: 20.25 9.09 2.52 50
A linguagem Java ser muito usada no comrcio da internet, tabelinhas assim, usadas para
clculos de preos de produtos j esto se tornando comuns. Os nomes que voc pode dar as classes e
mtodos so:
Classe: TabelaPrecos
Atributo: boolean ComDesconto;
Atributo: double[] Precos;
Mtodo: void AplicaDescontos(int[] descontos);
44
1.3.3. COPIA , COMPARAO E DETERMINAO DA CLASSE EM
OBJETOS
Erro! Indicador no definido.Erro! Indicador no definido.Erro! Indicador no definido.Erro! Indicador no
definido.Erro! Indicador no definido.Erro! Indicador no definido.
Este tpico ainda no est completo, devido a indefinies sobre o que estar contido nas
packages e interfaces da Java API.
Objetos so implicitamente referncias, portanto sua cpia (atravs do operador =) est sujeita ao
problema de reference aliasing e efeitos colaterais. A comparao de objetos atravs do operador ==
tem o significado da comparao de referncias, ou seja ela verifica se os objetos1 compartilham o
mesmo espao alocado na memria.
Observe que com as operaes conhecidas at agora, no conseguimos comparar dois objetos
quanto ao contedo a no ser que comparemos atributo por atributo, o mesmo vale para a cpia.
Seria til dispor de um conjunto de operaes de igualdade, desigualdade e copia que se aplicasse
ao contedo dos objetos e no ao endereo de memria de suas variveis. Uma outra necessidade seria
verificar a classe de um objeto em tempo de execuo. Antes de ver a soluo procure sentir o
problema no exemplo a seguir:
Usaremos o arquivo da classe Ponto, j apresentado em Erro! Argumento de opo
desconhecido. 1.2.6., mas com uma modificao no mtodo mostra. No lugar de mostra criaremos
um mtodo chamado public String toString(). Este mtodo padro em muitas classes e deve ser
definido de modo a retornar uma String descritiva do objeto. Fazendo isto voc pode concatenar uma
varivel Ponto com uma String no argumento do mtodo System.out.println(meuPonto1+ Na
vizinhanca de +meuPonto2);. Esta deciso de implementao certamente mais genrica que
mostra, visto que nem sempre estaremos imprimindo atravs de System.out.println(), por exemplo
na segunda parte ocorrero casos em que temos que pintar Strings em reas especiais na tela.
Erro! Indicador no definido.Erro! Indicador no definido.Erro! Indicador no definido.Erro! Indicador no
definido.Erro! Indicador no definido.Erro! Indicador no definido.
Apresentao do problema
//Classe ponto
class Ponto {
1
Strings e vetores so objetos de classes pr definidas na linguagem, portanto as afirmaes feitas aqui se aplicam a eles
tambm.
45
}
class Principal {
//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 objetos
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) );
Original:(0,0)
Alias:(0,0)
Modificando Alias.x para 2
Veja como o original ficou:(2,0)
46
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
//COMENTARIOS
//comparacao de objetos:
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 objetos, esta operao teria o
significado de comparao entre endereos de memria dos objetos.
Erro! Indicador no definido.Erro! Indicador no definido.Erro! Indicador no definido.Erro! Indicador no
definido.Erro! Indicador no definido.Erro! Indicador no definido.
As possveis solues, comentadas incluindo verificao da classe dos objetos
//Classe Ponto
class Ponto {
47
return "("+this.x+","+this.y+")"; //(x,y)
}
class Principal {
//copia de objetos
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 objetos
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");
48
}
Erro! Indicador no definido.Erro! Indicador no definido.Erro! Indicador no definido.Erro! Indicador no
definido.Erro! Indicador no definido.Erro! Indicador no definido.
Este programa exemplo no opera corretamente, isto se deve a no implementao destes
mtodos na verso beta (a disponvel atualmente).
1 import java.io.*;
2
3 class EntraDados {
4
5 public static void main (String args[])
6 {
7
8 byte vetortexto[] = new byte[200]; //declaracao de um vetor de bytes
9 int byteslidos = 0;
10
11 System.out.println("Escreva algo:");
12
49
13 try {
14 byteslidos = System.in.read(vetortexto);
15 System.out.print("Voce escreveu:");
16 System.out.write(vetortexto,0,byteslidos);
17 }
18 catch (IOException e) {
19 // Alguma acao de recuperacao da falha
20 }
21 }
22 }
Erro! Indicador no definido.Erro! Indicador no definido.
Escreva algo:
Como assim escreva algo?
Voce escreveu:Como assim escreva algo?
//COMENTARIOS:
Este programa usa o mtodo System.in.read(vetortexto); para ler do teclado. Este mtodo
precisa de um vetor de bytes como argumento(onde sero lidos os caracteres) e alm disso retorna o
nmero de bytes lidos, para que voc possa usar o vetor corretamente.
Para descarregar o vetor no vdeo use o mtodo System.out.write(vetortexto,0,byteslidos);
que imprime na tela as posies de 0 at byteslidos do vetor de bytes passado como o primeiro
argumento.
Voc deve estar se perguntando qual a funo dos blocos de cdigo try {} catch {} deste
programa exemplo. Eles so importantes no tratamento de excees, 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 excees.
A maneira ensinada nos tpicos anteriores (leitura de bytes) suficiente para que voc leia do
teclado, mas aproveitaremos agora que voc j est mais experiente para ensinar uma outra maneira
elegante que serve para ler do teclado, de um arquivo ou de uma conexo da rede que aceita por
exemplo a leitura direta para uma String e outros tipos desta linguagem e no s para um vetor de
bytes.Erro! Indicador no definido.
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 na tela (System.out uma classe presente em
java.lang).
50
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
arquivos, no tpico adequado.
Erro! Indicador no definido.Erro! Indicador no definido.
Erro! Indicador no definido.
Este programa simplesmente l uma linha do teclado e a imprime novamente.
1 import java.io.DataInputStream; //classe DataInputStream para a entrada de dados
2
3 public class ReadString {
4
5 public static void main(String args[]) {
6
7
8 String linha="";
9
10 DataInputStream meuDataInputStream;
11
12 meuDataInputStream = new DataInputStream(System.in);
13
14 try{
15 linha = meuDataInputStream.readLine();
16 }
17 catch (Exception erro) { System.out.println(Erro de leitura); }
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.
20 System.out.println(linha);
51
21
22
23 }/
24
25 }
//COMENTARIOS
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 usar, 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:Erro! Indicador no definido.Erro! Indicador no definido.
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.
52
Se voc inserir o seguinte mtodo na nossa classe ReadString, poder ler valores inteiros do
tecladoErro! Indicador no definido.Erro! Indicador no definido..Erro! Indicador no definido.
static int leInteiro() {
String line;
int i = Integer.valueOf(line).intValue();
um exemplo de chamadas consecutivas ou aninhadas de mtodos. Olhe da esquerda para a
direita. Primeiro o mtodo valueOf(line) chamado para a classe1 Integer retornando um objeto da
classe Integer. Depois o objeto da classe Integer tem seu mtodo intValue() invocado retornando um
valor do tipo int que correspondente a String line.
Voc se lembra que ns falamos que a linguagem fornece uma auxiliar(wrapper) para cada tipo
bsico da linguagem? A classe Integer uma classe que mapeia em termos de objetos o tipo bsico int
de 32 bits. Agora que voc j conhece o nome da classe, pesquise mais sobre ela na JAVA API.
Erro! Indicador no definido.
Exerccios:
1-
Voltaremos a falar sobre Strings, porm por hora, voc j tem condies de ler as bibliografias
adicionais sobre eles.
1
possvel criar mtodos para serem chamados para classes e no s para objetos, so os chamados class methods em
contraposio a instance methods.
53
Interrompa sua leitura agora e experimente passar argumentos para um dos programas criados
anteriormente, os argumentos obviamente sero ignorados pelo programa e este se comportar da
mesma forma que antes.
O vetor de Strings o argumento do mtodo main que normalmente chamvamos de String
args[]:
public static void main (String args[]) ...
Erro! Indicador no definido.Erro! Indicador no definido.
class MostraArgumentos {
public static void main(String args[]) {
for (int i=0; i < args.length; i++) {
System.out.println("Argumento" + i+": "+ args[i]);
}
}
}
Exerccios:
1-
Mude o primeiro programa em Java (HelloInternet) para imprimir Hello seguido do primeiro
argumento de linha de comando (se existir: args.length>0 ).
2-
Construa um programa simples que recebe argumentos da linha de comando e os imprime atravs
de cout. Normalmente isso que deve ser feito antes de usar um recurso da linguagem pela primeira
vez, experiment-lo em programas simples.
54
1.5. ENCAPSULAMENTO COM PRIVATE, PUBLIC, PACKAGE e PROTECTED
Erro! Indicador no definido.Erro! Indicador no definido.
Encapsulamento, data hiding um conceito bastante importante em orientao a objetos. Neste
tpico vamos falar das maneiras de restringir o acesso as declaraes de uma classe e a prpria classe,
isto feito atravs do uso das palavras reservadas public, private e protected1 2 que so
qualificadores.
Algum pode estar se perguntando o porqu de se restringir o acesso a certas partes de uma
classe. A idia simples, devemos fornecer ao usurio, cliente de uma classe, o necessrio e somente o
necessrio para que ele tire proveito da funcionalidade desta classe. Os detalhes devem ser omitidos,
somente a lista de operaes a qual uma classe deve atender fica visvel.
Os benefcios so muitos: clareza do cdigo, minimizao de erros, facilidade de extenso.
Talvez a facilidade de modificao seja o mais importante dos benefcios. Como a classe conhecida
pela sua interface, muito fcil mudar a representao interna sem que o cliente, usurio, 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 voc ser capaz de criar componentes de software reutilizveis, seguros,
fceis de modificar.
protected Estes atributos e mtodos so acessveis nos mtodos da prpria classe e suas
subclasses, o que ser visto em Herana 2.
1Protected
ser explicada juntamente com herana na seo 2.
2
PACKAGE ser explicado juntamente com packages.
55
Nada especificado, Estes atributos e mtodos so acessveis somente nos mtodos das classes que
equivale package pertencem ao package em que foram criados. Este modo de acesso tambm
ou friendly chamado de friendly.
(existem outros qualificadores, no relacionados com encapsulamento que sero explicados depois)
Erro! Indicador no definido.Erro! Indicador no definido.Erro! Indicador no definido.Erro! Indicador no
definido.Erro! Indicador no definido.
Package e friendly: Aparecem entre aspas porque no so palavras reservadas da
linguagem, so apenas nomes dados para o tipo de encapsulamento padro (default),
que ocorre quando no existe um especificador. So nomes fceis de memorizar.
Friendly significa amigvel, no sentido de que as classes que permitem este tipo de
acesso possuem um encapsulamento mais relaxado com relao as classes do mesmo
package (amigas). Package um grupo de classes relacionadas.
Protected ser explicada em 2.1 pois est relacionada com herana, por hora vamos focalizar
nossa ateno em private e public que qualificam os atributos e mtodos de uma classe quanto ao tipo
de acesso (onde eles so visveis) . Public, private e protected podem ser vistos como qualificadores
ou specifiers.
Fica fcil entender essas declaraes se voc 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 voc instanciou (criou)
um objeto do tipo Ponto em seu programa:
Ponto meu; //instanciacao
meu=new Ponto();
Segundo o uso da definio da classe Ponto dada acima voc no pode escrever no seu
programa:
meu.x=(float)5.0; //erro !
,como fazamos nos exemplos anteriores, a no ser que x fosse declarado como public na definio da
classe o que no ocorre aqui. Mas voc 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.
56
Voc 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 hierarquia e de seu PUBLIC
package. Veja que s a parte public visvel neste caso: PRIVATE
PROTECTED
PACKAGE
57
}
class Principal {
(0,0)
//COMENTARIOS:
Este programa no deixa voc 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 usurios tomem conhecimento disto.
Exerccios:
1-
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). Voc provavelmente usar a
funo Math.sqrt() que define a raiz quadrada de um double, no preciso fazer nenhum import para
usar 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
objeto, uma maneira de prover este tipo de acesso para outras classes (distancia de reta a ponto) dotar
a classe Ponto de mtodos do tipo float retorna_x(void);.
2-
58
Escolha um programa implementado anteriormente e aplique encapsulamento, analise a
funcionalidade de sua classe. Voc teve que implementar mais mtodos? Quais?
Comentrios:
Observe que agora nada impede que voc acesse diretamente 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:
1-
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.
2-
Qual das seguintes declaraes permite que se acesse em main somente os mtodos move e
inicializa, encapsulando todos os outros elementos da classe? Obs.: A ordem das declaraes private e
public pode estar invertida com relao aos exemplos anteriores.
a)
public class Ponto {
public float x;
public float y;
public void inicializa(float a, float b) {x=a; y=b;};
public void move(float dx, float dy) ; {x+=dx; y+=dy; };
};
b)
public class Ponto {
public void inicializa(float a, float b) {x=a; y=b;};
public void move(float dx, float dy) ; {x+=dx; y+=dy; };
private float x;
private float y;
59
};
c)
public class Ponto {
public void inicializa(float a, float b) {x=a; y=b;};
private void move(float dx, float dy) ; {x+=dx; y+=dy; };
public float x;
private float y;
};
60
Erro! Indicador no definido.Erro! Indicador no definido.Erro! Indicador no definido.Erro! Indicador no
definido.
Note que a package Geometria est toda sob um diretrio 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.
//Classe ponto
package Geometria;
61
System.out.println("("+this.x+","+this.y+")");
}
}
Erro! Indicador no definido.
//Classe circulo
package Geometria;
62
System.out.println("("+this.x+","+this.y+","+this.raio+")");
}
}
Erro! Indicador no definido.
//Arquivo Reta.java
//Classe Reta
package Geometria;
{
a=new Ponto(ax,ay);
b=new Ponto(bx,by);
}
63
Circulo acirc;
//acirc.x=(float)10.0; erro! atributo encapsulado (modo package)
Ponto apto;
acirc=new Circulo((float)0.0,(float)0.0,(float)1.0);
acirc.mostra();
apto=new Ponto((float)4.0,(float)3.0);
apto.mostra();
System.out.println("Dist:" + acirc.distancia(apto));
}
(0,0,1)
(4,3)
Dist:4
64
At agora, tnhamos declarado todas as classes como public (public class Nomeclasse {}),
embora sem explicar exatamente porque. Este tpico trata da possibilidade de o programador desejar
criar uma classe para seu uso prprio e no fornec-la para o usurio.
O que a linguagem Java permite neste sentido :
1- A criao de classes que s podem ser usadas dentro de packages, ou seja, voc no pode
declarar um objeto desta classe externamente ao package.
2- A criao de classes que podem ser usadas somente pelas classes presentes no mesmo arquivo,
embora no tenhamos mostrado, um arquivo pode conter a declarao de mais de uma classe desde que
somente uma delas seja public.
O encapsulamento de classes segue uma sintaxe semelhante ao encapsulamento de mtodos e
atributos, ou seja: atravs de qualificadores ou modificadores:
QualificadorDaClasse class NomeDaClasse { /*Atributos e metodos */ }
Os qualificadores so:
public Estas classes so sempre acessveis em todos os packages do seu cdigo. Somente
uma classe publica permitida por arquivo, e o arquivo deve ter o mesmo nome da
classe.
private Estas classes so acessveis somente pelas classes declaradas no mesmo arquivo.
Um arquivo pode possuir vrias classes private, mas uma nica classe public.
Nada especificado Estas classes podem ser acessadas no package que elas pertencem, se nenhum
package package especificado, elas pertencem ao programa.
(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.
Voc teve ter notado que sempre definimos uma classe por arquivo, isto feito porque a
linguagem s permite uma classe public por arquivo, 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 usada 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 tutorial:
Erro! Indicador no definido.Erro! Indicador no definido.
Inicio: Aps Javac:
65
package listas;
//classe Lista, classe No arquivo Lista.java
private char info; //se eu ja tivesse ensinado protected usaria em lugar de private
private No prox; //"ponteiro" para o proximo no
char retorna_info()
//retorna valor do campo
{
return info;
}
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;
}
66
private No cabeca; //inicio da lista
private int elementos; //numero de nos na lista
public Lista()
//construtor
{
cabeca=null;
elementos=0;
}
67
while (temp!=null)
{
System.out.print( "[" + temp.retorna_info() + "]-" );
temp=temp.retorna_prox();
}
System.out.print("null");
System.out.println();
}
}
Erro! Indicador no definido.Erro! Indicador no definido.Erro! Indicador no definido.
Agora voc 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 voc acha-lo complicado pode usar a segunda verso presente a direita deste
arquivo 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 voc 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 na tela. Pelo
resultado do programa voc entender melhor esses comandos rudimentares de teste. Voc 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.
//Classe principal, Arquivo Principal.java versao 1 //Classe principal, Arquivo Principal.java versao 2
import java.io.DataInputStream; import java.io.DataInputStream;
import listas.*; import listas.*;
public static void main(String args[]) { public static void main(String args[]) {
Lista ml=new Lista(); //ml=minhalista char e;
char o,e; //o=opcao, e=temporario Lista ml=new Lista(); //ml=minhalista
ml.insere('a');
DataInputStream meuDataInputStream //mesma sequencia da versao com menu
=new DataInputStream(System.in); //de programa principal
ml.mostra();
try{
do ml.insere('v');
{ ml.insere('a');
o =(char)meuDataInputStream.read(); ml.insere('j');
switch (o) { ml.mostra();
case 'i':
68
e=(char)meuDataInputStream.read(); e=ml.remove();
ml.insere(e); System.out.println(e);
break; ml.mostra();
case 'r':
e=ml.remove(); ml.remove(); //embora o metodo
System.out.println(e); //remove retorne um valor
//System.out.flush(); ml.remove(); //nestas chamadas,
break; //este valor de retorno e'
case 'm': ml.remove(); //ignorado
ml.mostra(); ml.mostra();
System.out.println();
//System.out.flush(); }
break; }
default: ;
}
} while (o!='q');}
catch (Exception erro) { /* nao faco nada */ }
}
}
ia [a]-null
m [j]-[a]-[v]-[a]-null
[a]-null j
[a]-[v]-[a]-null
iviaij null
m
[j]-[a]-[v]-[a]-null
r
j
m
[a]-[v]-[a]-null
r
a
r
v
r
a
69
m
null
Os programadores que no esto acostumados com coleta automtica 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 um conceito muito importante em programao orientada a objetos e por
este motivo logo apresentado neste tutorial. Os exemplos seguintes so simples por no podermos
usar 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.
70
Exerccios:
1-
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.
71
Teste de desigualdade
Teste de maior ou igual que
Teste de menor ou igual que
Teste de maior que
Teste de menor que
Impresso na tela
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
TPICOS ABORDADOS:
Erro! Indicador no definido.Erro! Indicador no definido.
Construtores em geral, criao de mtodos de converso de tipos, chamadas de mtodos do
mesmo objeto, operador % que retorna o resto da diviso de dois inteiros.
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 exatamente 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 objeto
facilidades de clculos (mdc(a,b) , fatorial(b) , fibonaci(x), combinacoes(n,k) ). No entanto a
classe frao precisa da operao mdc. Ocorre que j estudamos uma maneira de implementar um
72
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.Erro! Indicador no
definido.Erro! Indicador no definido.Erro! Indicador no definido.
IMPLEMENTAO:
//TAD fracao.
//File Fracao.java
class Fracao {
73
//operacoes matematicas basicas
public Fracao soma (Fracao j)
{
Fracao g;
g=new Fracao((num*j.den)+(j.num*den),den*j.den);
return g;
}
//operacoes de comparacao
74
}
75
c=a.soma(b);
c.mostra();
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());
//COMENTARIOS:
Uma implementao completa do tipo de dados frao tem que checar 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.
Exerccios:
76
1-
Complete o tipo frao com os mtodos faltantes da shopping list approach
long retorna_den(void) {return den;}
long altera_den(int a) {den=a;}
Considerando que os atributos declarados em private no so acessveis fora da classe, descreva
a utilidade desses mtodos. Eles so teis se usados pelos prprios mtodos de frao?
1
2-Erro! Indicador no definido.
Implemente o tipo abstrato de dados nmero complexo com as operaes matemticas inerentes.
Faa antes um projeto dos mtodos que sero implementados, descreva (detalhadamente) as operaes
matemticas necessrias. Que forma de representao voc escolher: coordenadas polares ou
retangulares?
3-
Pesquise sobre matrizes em Java: 1.3.2. 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.
4-
Implemente o tipo abstrato de dados relgio, pesquise as operaes normalmente oferecidas por
relgios reais, o nico objetivo marcar as horas. Se voc precisar de inspirao para este
exerccio, consulte o exemplo da classe Contador e seus exerccios.
1
Estes exerccios so considerados difceis. recomendvel somente esboar o projeto deles e depois, a implementao pode
ser deixada como exerccio das prximas sees.
77
Para concatenar Strings use o operador +. Os operandos podem no ser Strings, nesse caso sero
convertidos para objetos desta classe, por exemplo se um dos argumentos for um inteiro, o objeto
String correspondente conter o valor literal deste inteiro.
System.out.println(teste + Andre!); //Ola meu amigo Andre!
teste+= Andre!; //atalho para concatenacao seguida de atribuicao: teste=teste+ Andre!
System.out.println(teste); //totalmente equivalente a primeira
Para obter o comprimento em nmero de caracteres de uma String, chame o mtodo length()
para a String em questo. Para obter o caractere presente na posio 6 da String, chame o mtodo
charAt(); . Note que o primeiro caractere da String est na posio zero:
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 chamar o mtodo
toUpperCase();
teste=teste.toUpperCase(); //teste fica igual a OLA MEU AMIGO
Um mtodo interessante para usar 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, voc pode achar esses mtodos um pouco estranhos, pois eles tem todos os mesmos
nomes e no precisam de um objeto 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.
class StringTest {
public static void main (String args[]) {
String teste="Ola meu amigo";
78
char umChar=teste.charAt(5); //um char receber e
System.out.println("Andre "+umChar+teste.substring(3,13));
System.out.println(teste.indexOf("AMIGO")); //retorna 8
System.out.println(teste.lastIndexOf("AMIGO")); //retorna 8
//COMENTARIOS
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 a objetos,
leia-o sempre que estiver disponvel e quando no estiver, preste ateno na sua interface.
Voc 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.*
Erro! Indicador no definido.Erro! Indicador no definido.
Tabela de mtodos da classe StringBuffer
StringBuffer endereco=http://www.java.com; //Erro! Esta facilidade para instanciao no
79
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 objeto String equivalente
Exerccios:
1-
Melhore um dos exerccios anteriores introduzindo um nome para o objeto. Este nome pode ir nas
sadas de tela executadas pelo objeto e o nome dado para o construtor como uma String. No se
esquea de prover mtodos como String get_name().
3-
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.
Resumindo : sua classe atuar 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.
80
1.6.3. TAD E ALOCAO DINMICA.
Erro! Indicador no definido.Erro! Indicador no definido.Erro! Indicador no definido.
Este exemplo cria um tipo abstrato de dados matriz bidimensional de inteiros (int). O leitor pode
achar estranho que para representar esta matriz usamos um vetor, mas que isto traz algumas
vantagens:
Matriz:
1:3 2:32 3:1
4:23 5:90 6:12
7:21 8:08 9:32
Vetor equivalente:
1:3 2:32 3:1 4:23 5:90 6:12 7:21 8:08 9:32
Vantagem da representao linear (vetor): para referenciar uma posio gasta-se somente um
inteiro contra dois da representao matriz. Pode-se considerar posies que apontam para outras
posies, basta interpretar o contedo do vetor como um ndice linear. Este tipo de construo pode
ser til em Java, pois a linguagem no possui ponteiros este um dos motivos de estarmos ensinando
esta tcnica.
Desvantagem da representao linear (vetor): necessrio criar funes de converso de ndice
na forma (linha,coluna) para (ndice linear) e de (ndice linear) para (coluna) ou (linha). So as
funes lin e col e linear deste exemplo. Em uma primeira leitura, no preciso entender os clculos
com ndices, apenas o uso dos mtodos que oferecem estes clculos.
Para ns, clientes da classe Matriz2DInt, os elementos sero indexados de 1 at m (arbitrrio)
em termos de ndice linear. Em termos de linhas e colunas, eles sero indexados de (1,lmax) e de
(1,cmax). O fato da linguagem adotar ndices de 0 at m-1 para matrizes e vetores no importa, ns
construmos em volta dessa representao para que nosso objeto 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 voc capaz de programa-las.
Dentre os objetivos de um programador de uma linguagem orientada a objetos 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.
81
SHOPPING LIST APPROACH PARA O TAD MATRIZ2DInt:
(As operaes implementadas esto marcadas com . As operaes marcadas com devem ser implementadas como
exerccio avanado cujo objetivo completar um de seus primeiros componentes de software reutilizvel, estamos incluindo
desta vez os atributos tambm).
Erro! Indicador no definido.
private int linhas; //numero de linhas da matriz
private int colunas; //numero de colunas da matriz
private int tam; //=linhas*colunas
private int lc[]; //=new int[linhas*colunas]=vetor[0..(tam-1)]=~matriz[l][c]
//qualquer uma das funcoes abaixo retorna int negativo se nao obteve sucesso
82
{
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;
}
83
lc[j-1]=aux; //para mim vai de o ate l*c-1
return true; //sucesso
}
else
{ return false; } //falhou
}
84
{
return tam;
}
}
Erro! Indicador no definido.
//Classe principal, Arquivo Principal.java
class Principal {
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)));
linear(5,5)=45
Atribuindo 2 a posicao (5,5)
Atribuindo 4 a posicao (4,2)
Trocando estas posicoes
Conteudo da posicao (5,5):4
85
Dica de programao: Erro! Indicador no definido.
Saiba que uma prtica bastante til na fase de testes de um programa introduzir mensagens
informativas em pontos convenientes. Quando trabalhando com objetos tal prtica pode ser usada de
vrios modos, por exemplo pode-se inserir uma mensagem no construtor de uma classe para verificar
quando os objetos so criados e se so criados corretamente.
Exerccios:
1-
Melhore a classe matriz para aceitar nas suas funes argumentos do tipo (linha,coluna) e no s
ndices lineares.
2-
Note que no foram impostas restries para ndices invlidos da matriz de modo que nosso
componente de software falha se no usado corretamente. Adote uma estratgia de deteco de ndices
invlidos e use-a de modo a evitar o travamento do programa. Veremos como fazer esta checagem de
ndices de forma segura e uniforme em 4.3 Exception handling.
3-
Implemente um mtodo chamado ordena para o tipo abstrato de dados matriz definido acima. Use
qualquer algoritmo de ordenao para deixar a matriz ordenada como um vetor quebrado em vrias
linhas. De que forma a facilidade que a interface oferece de enxergar a matriz como um vetor facilita
este processo?Erro! Indicador no definido.
Ser que este mtodo ordena realmente imprescindvel para esta classe? Os mtodos criados at
o momento j no formam um modelo computacional suficiente para que o cliente desta classe possa
definir em seu cdigo os mtodos de ordenao de matrizes que desejar? A dvida sobre a necessidade
ou no de um mtodo em uma classe bastante frequente.
Guardadas as devidas propores, programao orientada a objetos como brincar com blocos de
encaixar, ou legos. Existem blocos que no se encaixam, existem blocos que podem ser construdos
atravs de outros menores, mas que ainda sim existem porque so bastante usados, e a tarefa de
compo-los a partir de outros blocos torna-se inconveniente. Existem blocos sem os quais no se pode
construir praticamente nada.
4-
Crie um mtodo de nome preenche, que inicializa todas as posies da matriz com o valor de
um de seus argumentos. Este mtodo pode ser composto pelos mtodos j implementados?
*5-
Defina um programa chamado grandes que implementa o tipo abstrato de dados nmeros grandes
e inteiros, este tipo deve usar um vetor do tipo numrico que voc achar conveniente para representar
os algarismos. Talvez estudar 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
86
espao, voc pode usar cada posio do vetor para representar mais de um dgito, mas haver muito
trabalho em termos de tratar overflow e underflows.
6-
Note que na alocao da matriz:
public Matriz2DInt(int l,int c)
, no checado se os valores passados so maiores que 0, faa este teste.
Quando explicarmos exception handling voc ter mtodos melhores de lidar com esses erros.
87
2. HERANA
Erro! Indicador no definido.
Existe uma viso um pouco tacanha de orientao a objetos 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 a objetos e um dos fatores de sucesso desta como muito mais
que uma simples maneira de organizar melhor seu cdigo.
Um dos aspectos que distinguem objetos de procedimentos e funes que o tempo de existncia
de um objeto pode ser maior do que o do objeto que o criou. Isto permite que em sistemas distribudos
objetos 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.
1
lagosta crustceo no peixe.
88
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 a objetos.
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 tutorial em 1.2.6, 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 diretamente na classe filha a no ser que sejam qualificados
como protected ou public, veja 2.1.2.
Diagrama de acesso, visibilidade, dos elementos da classe pai para uma classe filha ou PUBLIC
herdeira. Os atributos e mtodos da classe pai so classificados quanto ao PRIVATE
encapsulamento. A parte sombreada significa no visvel, encapsulado. PROTECTED
*As duas so consideradas como sendo do mesmo package. PACKAGE*
89
class Ponto {
}
Erro! Indicador no definido.
//Classe PtoMove
90
//adicione algum atributo private se quiser
}
Erro! Indicador no definido.
//Classe PtoReflete
void reflete()
//troca o sinal das coordenadas
{
this.altera_x(-retorna_x());
this.altera_y(-retorna_y());
}
class Principal {
91
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();
}
Exerccios:
92
A classe forma no tem um significado prtico, uma abstrao, voc no pode desenhar
(mostrar) uma forma, no entanto neste programa voc poder instanci-la. Esta classe est na
hierarquia, somente para capturar as caractersticas comuns a Ponto e Retangulo. Em 3.3
aprenderemos como definir estas classes abstratas de forma mais condizente com o paradigma de
orientao a objetos.
O mtodo mostra deve imprimir na tela os atributos destas classes.
2.1.2. PROTECTED
Erro! Indicador no definido.Erro! Indicador no definido.Erro! Indicador no definido.
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 usurio no percebe isso, para o usurio (uma classe externa) o
que continua existindo o que public.
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 (voc herdando de uma classe pronta em PRIVATE
Java)
PROTECTED
PACKAGE
PUBLIC
O que o restante do programa v das declaraes da classe pai na classe filha. PRIVATE
93
(por restante do programa entenda: outros packages e outras hierarquias) PROTECTED
PACKAGE
PUBLIC
Erro! Indicador no definido.
O mesmo exemplo s que usando protected.
//Classe Ponto
class Ponto {
94
}
}
Erro! Indicador no definido.
//Classe PtoMove
}
Erro! Indicador no definido.
//Classe PtoReflete
void reflete()
{
x=-x;
y=-y;
}
95
class Principal {
96
O diagrama acima mostra as reas de visibilidade de cada tipo de modificador aplicado aos
atributos da classe destacada. Os retngulos grandes, representam os packages, optamos por construir a
hierarquia da esquerda dentro do mesmo package o que nem sempre feito. Normalmente quando
voc estende uma classe das packages que vem com a linguagem, sua classe herdeira no pertence a
aquela package, mas pertence a hierarquia, saindo fora dos retngulos maiores como na hierarquia da
direita. Suponha que todas as classes so declaradas como public. Existem algumas declaraes de
qualificadores de atributos que no fazem sentido com classes private e so erros de compilao.
//Insira aqui o arquivo da classe Ponto do exemplo anterior: Erro! Argumento de opo
desconhecido.
97
//Insira aqui o arquivo da classe PtoMove do exemplo anterior: Erro! Argumento de opo
desconhecido.
//Classe PtoReflete
void reflete()
{
x=-x;
y=-y;
}
//Insira aqui o arquivo da classe Principal do exemplo anterior: Erro! Argumento de opo
desconhecido.
//COMENTARIOS
No caso de redefinio de mtodos, a busca da implementao do mtodo a ser executado ocorre
de baixo para cima na hierarquia. Exemplo: se voc tem um objeto 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.
98
Exerccios:
1-
Teste redefinio de mtodos colocando System.outs em mtodos da hierarquia, tais como:
System.out.println(Metodo redefinido na classe X, chamado.) ;
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.
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.
99
Erro! Indicador no definido.
Interfaces
public interface Imprimivel { //alem das classes, so interfaces pode ocupar um arquivo
final char nlin='\n'; //nova linha
public String toString();
class Principal {
100
}
macarrao100
macarrao 100
//COMENTARIOS
Exerccios:
1-
Defina uma interface para um conjunto de classes que representam figuras geomtricas que
podem ser desenhadas na tela.
101
3. POLIMORFISMO, CLASSES ABSTRATAS
Erro! Indicador no definido.Erro! Indicador no definido.
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
ao 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 objeto e operador um mtodo, operando pode significar
um tipo e operador um objeto deste tipo.
102
O mtodo Ponto(Ponto ap); um copy constructor, pois tem o mesmo nome que
Ponto(float dx,float dy);. Tal duplicao de nomes pode parecer estranha, porm Java permite que
eles coexistam para uma mesma classe porque no tem a mesma assinatura (nome+argumentos). Isto
se chama sobrecarga de mtodo, o compilador sabe distinguir entre esses dois construtores. Outros
mtodos, no s construtores podero ser sobrecarregados para vrios argumentos diferentes, esse
recurso um polimorfismo do tipo ad-hoc.
O que interessante para ns o fato 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 objeto 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 objetos apresentados em 1.3.3.
Erro! Indicador no definido.
Por questes de espao, basearemos nosso exemplo no tipo abstrato de dados frao, apresentado
em 1.6.1. Voc deve modificar a classe Fracao para que ela tenha dois construtores, o que esta em
negrito dever ser acrescentado ao cdigo original:
103
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: ");
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());
104
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 objeto que no o argumento copieme, ento para distinguir o atributo
num deste objeto, do atributo num de copieme usamos copieme.num e simplesmente num para o
objeto local, objeto em questo, ou objeto dono do mtodo chamado.
Exerccios:
1-
Faa um copy constructor para uma das classes j implementadas neste texto.
2-
Sobrecarregue o mtodo move da classe Ponto para aceitar um Ponto como argumento,
subentende-se que devemos mover a distncia x e a distncia y daquele ponto a origem.
3-
Crie um mtodo de nome unitarizado para a classe Ponto. Este mtodo deve interpretar o Ponto
como um vetor e retornar um novo Ponto que contm as coordenadas do vetor unitarizado. Unitarizar
dividir cada coordenada pelo mdulo do vetor. O mdulo a raiz quadrada da soma dos quadrados
das componentes.
105
Mtodos abstratos, obrigatoriamente pertencem a classes abstratas, e so mtodos desprovidos de
implementao, so apenas definies que sero aproveitadas por outras classes da hierarquia.
Voltando ao exemplo da hierarquia Forma, Ponto e Retangulo. O mtodo mostra poderia ter sido
definido na classe base abstrata (Forma) como um mtodo abstrato.
//Classe ponto
106
//move nao precisa ser redefinido
//Classe Retangulo
class Principal {
107
Retangulo ar=new Retangulo(0,0,13,14);
ar.mostra();
ar.move(1,1);
ar.mostra();
}
(0,0)(13,14)
(1,1)(14,15)
//COMENTARIOS:
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.
Erro! Indicador no definido.Erro! Indicador no definido.
Classes abstratas X Interfaces:
Voc deve estar achando que classes abstratas e interfaces so conceitos parecidos e que podem
ser usados com objetivos 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 abstratas permitem. Interfaces esto mais ligadas a
comportamento, enquanto que classes abstratas esto mais ligadas a implementao.
Exerccios:
1-
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 usada
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.
Neste exemplo iremos criar uma classe base abstrata iterador, que servir como topo de uma
hierarquia para iteradores de estruturas de dados como listas, vetores e rvores. O iterador de vetor
definido por herana da classe base abstrata de iteradores.
Perceba que alguns mtodos da classe base so desprovidos de implementao, porm nada
impede que voc coloque como cdigo desses mtodos uma mensagem de erro do tipo Erro, mtodo
deveria ter sido redefinido, mas agora o compilador no pode mais te lembrar de redefini-los.
108
(As operaes implementadas esto marcadas com , existem outras operaes teis, no mencionadas por motivos de
espao. Esta classe base abstrata no tem a funcionalidade de uma classe que possa estar instanciada, perceba a ausncia de
um mtodo para avanar na iterao).
//Classe IteradorI
//Classe IteradorVetorI
109
public void comeca()
{
conta=0;
}
import java.io.DataInputStream;
//Classe principal, Arquivo Principal.java
110
class Principal {
char o; //o=opcao,
int e; //temporario
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?
111
mit.comeca();
break;
case 'e': //fim da iteracao?
System.out.println(mit.fim());
break;
case 'v': //valor atual
System.out.println("V:"+mit.retorna_conta());
break;
case 'm': //mostra vetor
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
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
112
Exerccios:
Erro! Indicador no definido.
1-
Defina uma classe de nome ArrayServices que fornece servios para vetores. Implemente os
servios de: ordenao de subvetor (vetor interno menor ou igual ao vetor em questo) , busca, troca
de posies, etc. Esta classe opera sobre os vetores passados como argumentos de seus mtodos
(passagem implcita do ponteiro para o vetor). Os vetores devem ser de tipos numricos definidos na
linguagem (conte com a existncia de operadores + - < ==, etc).
Voc ter que definir uma verso desta classe para cada tipo da linguagem (byte, float, etc). Na
verdade isto no trabalhoso, basta voc 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 vetor. No
confunda estas duas classes, elas executam tarefas distintas.
113
Diagrama das classes:
A classe filha garante no mnimo o mesmo comportamento, behaviour da classe pai, podendo
acrescentar ou redefinir parte do que foi herdado. Por este motivo, uma varivel da classe pai pode
receber um objeto da classe filha, o comportamento da classe pai fica garantido e o restante (o que a
classe filha acrescentou) perdido. J uma varivel da classe filha no pode receber um objeto da classe
pai, porque os mtodos definidos para variveis desta classe passam a no fazer sentido para o objeto
contido nesta varivel.Erro! Indicador no definido.Erro! Indicador no definido.
O diagrama reflete o aspecto das caractersticas acrescentadas pela classe filha a classe pai, mas
no o fato de uma varivel da classe pai poder receber um elemento da 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.
O exemplo a seguir cria dois objetos (pai e filho) e faz atribuies e chamadas de mtodos entre
eles.
Erro! Indicador no definido.Erro! Indicador no definido.
//Classe SuperClasse
class SuperClasse {
//Classe SubClasse
114
public int novoatributo;
class Principal {
} //class Principal
Metodo da subclasse
Metodo da superclasse
Metodo da subclasse
//COMENTARIOS:
Note que o mtodo escolhida de acordo com o contedo da varivel e no de acordo com a
classe desta.
115
Depois do programa anterior, voc deve estar se perguntando o que acontece com o que foi
acrescentado pela classe filha quando um objeto desta classe atribudo a classe pai.
class Principal {
} //class Principal
Metodo da subclasse
Metodo da superclasse
Metodo da subclasse
Metodo da subclasse
Novo metodo:10
//COMENTARIOS
Embora voc seja capaz de recuperar os mtodos e atributos acrescentados atravs do type
casting, enquanto isto no for feito, estes mtodos e atributos esto inacessveis.
116
Exerccios:
1-
Implemente em suas classes mtodos que imprimem uma frase identificando o tipo da classe, por
exemplo: Eu sou a classe conta corrente, especializao de conta bancaria.
class Principal {
117
vetorgrafico[0]=new Retangulo(0,0,20,10);
vetorgrafico[1]=new Ponto(0,1);
vetorgrafico[2]=new Retangulo(100,100,20,20); //lados iguais
vetorgrafico[3]=new Ponto(2,1);
for(int i=0;i<4;i++)
{
vetorgrafico[i].mostra();
}
for(int j=0;j<4;j++)
{
vetorgrafico[j].move(12.0f,12.0f);
vetorgrafico[j].mostra();
}
(0,0)(20,10)
(0,1)
(100,100)(20,20)
(2,1)
(12,12)(20,10)
(12,13)
(112,112)(20,20)
(14,13)
//COMENTARIOS:
Exerccios:
1
Considere as seguintes declaraes em Java:
public class T
{
public void f(void) { System.out.println( Estou em T);}
};
118
public void f(void) { System.out.println(Estou em S);}
};
T x= new T();
S y=new S();
T p=new T();
p.f(); //primeira
p=y;
p.f(); //segunda
x.f(); //terceira
y.f(); //quarta
x=y;
x.f() //quinta
Responda qual o resultado na tela de cada uma destas chamadas.
119
4. CONCEITOS AVANADOS
Erro! Indicador no definido.
Neste tpico apresentaremos conceitos avanados da linguagem, estes conceitos so importantes
se voc deseja criar softwares relativamente grandes em Java.
//Classe Robo
class Robo {
public int x;
public int y;
public static int quantos; //quantos foram instanciados
120
}
class Principal {
} //class Principal
0
1
2
//COMENTARIOS:
Quando definimos atributo static, estvamos nos referindo ao sentido geral de atributo. Apesar
de termos exemplificado com um inteiro, voc poderia ter usado uma classe no lugar desse atributo,
tomando o cuidado de chamar new antes de us-lo.
Neste tpico no mostraremos um exemplo propriamente dito, apenas mostraremos como definir
um mtodo static, portanto importante que voc faa os exerccios.
121
Mtodos static so definidos assim como atributos static:
public static int MDC(int a,int b) { //maximo divisor comum de a e b
}
Exerccios:
1-
Defina uma classe com mtodos static que permite clculos matemticos como MDC,
FATORIAL, COMBINAES(n,k), PERMUTAES, etc.
3-
Voc pode desejar armazenar as informaes da classe Robot em outra classe, que computa
outros clculos, neste caso temos pelo menos duas alternativas a seguir:
a)Crie uma classe auxiliar externa de armazenagem e para todos objetos robo instanciados passe
o ponteiro desta classe auxiliar como argumento do construtor . Assim esses objetos 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, voc pode at achar engraado, mas muito prtico pensar assim.
4-
Em alguma classe que voc criou anteriormente defina variveis static com o seguinte objetivo:
Contar, fazer estatsticas das chamadas de mtodos da classe.
122
5-
Use o que foi aprendido sobre static variables no programa contas, o objetivo armazenar
informaes sobre os movimentos de todas as contas num objeto static. Para que a modificao fique
a contento voc pode precisar tornar o exemplo mais prximo da realidade, adicionando no construtor
de contas um argumento: nmero de conta. Comente se voc usaria alocao dinmica para essa classe
de armazenagem agregada em conta, ou no. Tenha em mente a questo do tamanho em bytes do
objeto.
Se os conceitos de orientao a objetos dados at agora fossem suficientes para modelar qualquer
atividade ou objeto 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 objetos e iteraes
entre eles podem ser modelados ou previstos. Os mecanismos de tratamento de excees se encaixam
justamente nessa lacuna.
O modelo de tratamento de excees adotado por Java muito semelhante ao de C++. Se voc j
teve alguma experincia com tratamento de excees, este tpico ser bastante fcil.
Erro! Indicador no definido.Erro! Indicador no definido.
123
de excees, 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 atual e passar um
objeto para o bloco catch mais prximo na cadeia de chamadas de mtodos atual. Isto feito atravs
da declarao:
throw nomedoobjeto; //ou throw new nomedaclassedoobjeto(argumentos do construtor)
throw como um break para mtodos.
Como excees so objetos, voc pode definir hierarquias de classes de excees, que mapeiem
em termos de informaes as condies anormais de seu programa contendo as mensagens de erro e as
possveis solues
As excees geradas pela linguagem pertencem a uma hierarquia cujo topo a classe
Throwable, imediatamente estendida por Error e Exception. Neste exemplo voc ver que os
tratadores de exceo so escolhidos comparando a classe da exceo jogada e a classe de excees
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 excees 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 excees mais baixas da hierarquia, possvel escolher que cdigo de tratamento usar com
cada tipo de exceo gerada.
Por sorte, das excees levantadas pela linguagem, voc 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
vetor:
class Principal {
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;
124
}
System.out.println(a[3]);
}
}
Erro! Indicador no definido.
12
//COMENTARIOS:
O fato do cdigo imediatamente aps o ponto onde foi gerada a exceo no ser executado te
preocupa? Voc gostaria por exemplo de ter uma chance de liberar recursos do sistema (ex..:fechar um
arquivo) 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 arquivo
//gera uma excecao com arquivos
}
catch (ExcecaoArquivo e){
//tenta recuperar aquivo e informacoes perdidas
}
finally {
arquivo.close();
}
finally tem sido usado para fechar arquivos, parar threads e descartar janelas.
Exerccios:
1-
Em vrios dos programas anteriores mencionamos que haveria uma maneira melhor de tratar
situaes anormais. Um desses programas era o do tipo abstrato de dados matriz. Leia este programa e
adicione tratamento de excees para as condies anormais que podem surgir, tais como acesso a
ndices invlidos. Complemente este exerccio aps ter lido os tpicos seguintes.
125
desconhecido.. Nossa exceo ser gerada quando nas operaes de fraes ocorrer uma diviso por
zero.
Em Java, excees 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.
Voc deve modificar a classe Fracao apresentada anteriormente na pgina 70, 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 {
126
}
}
Erro! Indicador no definido.
Esta e' a fracao a: (5/3)
Esta e' a fracao b: (1/0)
Nao posso dividir por zero
//COMENTARIOS
Exerccios:
1-
Implemente, tratamento de excees completo para o exemplo de 1.6.1 Erro! Argumento de
opo desconhecido.. Antes faa um levantamento das excees que podem ser geradas, lembre das
restries matemticas para o denominador em uma diviso. Leve em conta tambm o overflow de
variveis int que so uma representao com nmero de bits finito da sequncia dos nmeros inteiros
(conjunto Z da matemtica). Compare este tratamento com o de outros programas por exemplo na
diviso por zero, quais as vantagens que voc pode apontar e as desvantagens?
4.4. THREADS
127
interagindo, mudando de pgina no hipertexto enquanto o arquivo nem foi carregado totalmente? Isto
no seria possvel sem o uso de threads.
O seu editor de textos permite que voc v editando o comeo do arquivo, 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 voc tem a sensao de que tudo est funcionando ao mesmo tempo, simultaneamente. Se
voc um felizardo e sua mquina tm mais de um processador, ento seu ambiente ser capaz de
mapear seus threads em hardware e voc ter realmente processamento paralelo.
Se voc olhar a traduo de threads no dicionrio at capaz que voc 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 execuo cuida de uma tarefa: transferir um arquivo,
tratar a entrada do usurio, mostrar sua janela na tela, 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 voc no vai querer implement-los/us-los.
Existem duas maneiras bsicas de criar threads em Java, usando interfaces e usando herana.
Usando herana, sua classe j um thread (is a relationship), que quando tiver seu mtodo start()
chamado vai executar tudo o que estiver no mtodo run() em paralelo.
Usando interfaces, voc define uma classe cujo mtodo run() vai ser executado por um thread.
128
Se voc quer ter uma idia do que vai acontecer no programinha abaixo, veja
o desenho ao lado. Ns faremos uma corrida de Threads: A e B. Eles sero
iniciados depois que o programa principal (main) comear. A sai com alguma
vantagem pois iniciado primeiro, depois sai B. A cada loop estes Threads so
obrigados a fazer uma pausa por um intervalo aleatrio at completarem 4
loops: 0,1,2,3,4.
No final, pedimos ao programa principal que espere os Threads terminarem
seus ciclos para se juntar a eles (mtodo join() da classe thread).O mtodo join
no retorna enquanto o seu threads no terminar.
Existem uma srie de outras primitivas para lidar com Threads: pausa.
parada, retorno a execuo, etc. No explicaremos todas aqui. Voc deve fazer
leituras complementares, isso que temos aconselhado. Agora estas leituras
podem ser mais tcnicas, tipo guias de referncia, uma vez que ns j fizemos a
introduo do assunto.
Alguns assuntos, a exemplo de Threads exigem um conhecimento terico
forte, de modo que tambm aconselhamos que voc adquira um livro sobre
programao concorrente.
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
{
129
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) {}
}
}
Erro! Indicador no definido.
Leonardo Xavier Rossi na etapa:0
Andre Augusto Cesta na etapa:0
Andre Augusto Cesta na etapa:1
Leonardo Xavier Rossi na etapa:1
thread A Andre Augusto Cesta na etapa:2
thread B Leonardo Xavier Rossi na etapa:2
Leonardo Xavier Rossi na etapa:3
Andre Augusto Cesta na etapa:3
Andre Augusto Cesta na etapa:4
Corrida de threads terminada:Andre Augusto Cesta
Leonardo Xavier Rossi na etapa:4
Corrida de threads terminada:Leonardo Xavier Rossi
Colocar sua classe abaixo da classe Threads em uma hierarquia, as vezes um preo muito
grande para ter um mtodo dela rodando em um Thread. por isso que Threads pode ser criados
usando interfaces. Voc s tem que dizer que implementa a interface Runnable, que composta do
mtodo run(). Quando um Thread construdo usando como argumento uma classe que implementa
a interface Runnable, chamar o mtodo start para este thread faz com que o mtodo run() de nossa
classe comece a ser executado neste thread paralelo.
public String str; //nome do objeto que vai ter o metodo run rodado em um
//thread
130
}
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) { }
}
}
Exerccios:
131
1-
As tarefas de transpor uma matriz ou fazer o espelho de uma imagem (que pode ser
representada por uma matriz) so exemplos fceis de tarefas que podem ser divididas em dois ou mais
Threads. lgico que aqui estaremos 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 na tela os instantneos da matriz resultado para voc ver o trabalho
sendo feito em paralelo.
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 voc est usando
concorrncia. Imagine que voc tem um programa que l dados em bytes de algum lugar
(teclado/disco) e os transmite via rede. Voc decidiu usar 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 voc 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.
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:
132
{ {
EnfileraUm(); Escreve(DesenfileraUm());
} }
} }
133
public synchronized void EnfileraUm(byte a) {
//esta parte voce ja sabe
}
Agora sua classe segura. Voc 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.
//COMENTARIOS
Acabamos agora o tpico sobre threads e tambm o tutorial. Antes de voc comear a estudar
outros textos, um comentrio final: Se voc 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().
134
135
ndice remissivo:
Caractersticas da linguagem....................................................... 7
Carriage return, caractere especial ............................................ 21
% Case, ferramentas ...................................................................... 12
catch ........................................................................................ 123
%, operador de resto da diviso .......................................... 24; 72 viso geral sobre ................................................................... 52
char ........................................................................................... 21
class .......................................................................................... 14
Classe
= ArrayServices, ex.1 ............................................................. 113
Circulo ................................. 17; 18; 19; 25; 26; 30; 31; 61; 63
= 17; 20 Contador .........................................................................23; 24
= = ...................................................................................... 17; 20 DataInputStream ................................................................... 51
de objetos .......................................................... 44; 45; 47; 48
Especificando uma................................................................ 10
A Exception ................................................... 125; 127; 130; 131
Forma ................................................................................. 106
Acoplamento dinmico de mensagens .................................... 113 Forma, ex.1 ........................................................................... 92
Agregao ........................................................................... 38; 39 Fracao .................................................................... 71; 75; 103
Alocao HelloInternet...................................................................13; 14
de matrizes ........................................................................... 81 Iterador ............................................................................... 109
de objetos ............................................................................. 19 Lista ................................................................................65; 68
Applets Matriz2DInt ....................................................................81; 85
definio................................................................................. 6 motor .................................................................................... 11
Argumentos de linha de comando ...................................... 53; 54 Mouse ................................................................................... 35
Arquivos No ...................................................................................65; 68
estrutura de........................................................................... 18 Ponto ................................. 36; 37; 57; 61; 62; 89; 94; 97; 106
Atribuies entre classes ........................................................ 114 Ponto, ex.1 ............................................................................ 92
Atributo .................................................................................... 12 PtoMove .................................................................. 90; 95; 97
Atributos ................................................................................... 16 PtoReflete ................................................................ 91; 95; 97
acesso de .............................................................................. 19 Reta ................................................................... 39; 40; 61; 63
de classe ............................................................................. 120 Reta ex. 4 .............................................................................. 38
de instncia .......................................................................... 16 Retangulo ........................................................................... 106
declarao de........................................................................ 18 Retangulo, ex.1 ..................................................................... 92
disposio das declaraes de .............................................. 32 Robo ................................................................................... 120
encapsulamento de ......................................................... 57; 59 String Buffer ......................................................................... 80
Atributos e mtodos.................................................................. 23 Trava...............................................................................28; 29
Vetor 2D, ex. 3 ..................................................................... 38
Classes
B atribuies entre ................................................................. 114
e comportamento .................................................................. 70
encapsulamento de................................................................ 65
Backspace caractere especial .................................................... 21 Classes Abstratas ................................................... 102; 105; 109
Bancos de dados (curiosidade) ................................................. 88 Classes Abstratas X Interfaces ................................................ 108
Basic ......................................................................................... 17 Classes e Objetos ...................................................................... 10
Blocos de cdigo ...................................................................... 16 Coero ..................................................................................... 21
boolean ..................................................................................... 21 Coleta Automtica de lixo ............................................ 19; 41; 70
Browsers ..................................................................................... 7 Comparao
Busca de prades em texto ....................................................... 80 com Pascal ............................................................................ 30
byte ........................................................................................... 21 entre objetos ...................................................... 44; 45; 47; 48
Byte-code ................................................................................... 8 Compilao ............................................................................... 13
Compiladores .............................................................................. 7
Complexidade, lidando com ..................................................... 88
C Comportamento ................................................................70; 114
Conceitos avanados ............................................................... 120
C, dica aos programadores........................................................ 10 Concorrncia ............................................................................... 9
Capacidades da linguagem ......................................................... 7 Constantes literais ..................................................................... 21
Caracteres especiais .................................................................. 21 Construtores ........................................................................35; 37
Caracteres UNICODE .............................................................. 21 de copia .............................................................................. 102
136
e agregao..................................................................... 38; 39
e herana .............................................................................. 89
G
Contas bancrias ..................................................................... 117
Contas bancrias, exerccio ...................................................... 12 Generalizao/Especializao ................................................... 88
Converso
de Strings para inteiros................................................... 52; 54
de tipos bsicos .............................................................. 22; 52 H
Copia de objetos ..................................................... 44; 45; 47; 48
Copy constructors ................................................................... 102 Hello Internet ............................................................................ 13
Copyright .................................................................................... 3 Herana ..................................................................................... 88
Cosseno .................................................................................... 38 e construtores........................................................................ 89
e encapsulamento.................................................................. 93
e interfaces .......................................................................... 101
D mltipla................................................................................. 99
Hierarquias
Data hiding ............................................................................... 54 de tipos ................................................................................. 88
Debugging, dica de programao ............................................. 86 simples .................................................................................. 88
Destrutores ............................................................................... 41 Homepage
Diagramao do texto ................................................................. 5 Netscape ................................................................................. 7
Diretrios, organizao de ........................................................ 18 Sun ......................................................................................... 7
double ....................................................................................... 22 tutorial .................................................................................... 5
Dynamic binding .................................................................... 113
I
E
Imprimindo
Eficincia .............................................................................. 9; 34 na tela ................................................................................... 20
Eiffel ............................................................................. 13; 15; 16 tipos bsicos na tela .............................................................. 20
Encapsulamento........................................................................ 54 Includes ..................................................................................... 18
de atributos e mtodos com packages .................................. 60 Instncias .................................................................................. 12
de classes.............................................................................. 65 int 21
de mtodos e atributos ......................................................... 55 Interface
e herana .............................................................................. 93 Imprimivel .......................................................................... 100
e packages ............................................................................ 60 Interfaces................................................................................... 99
modo package ...................................................................... 56 e herana ............................................................................. 101
reviso final .......................................................................... 96 uma alternativa para herana mltipla .................................. 99
Especializao/Generalizao ................................................... 88 Interfaces grficas ..................................................................... 32
Euclides .................................................................................... 73 Interfaces X Classes Abstratas ................................................ 108
Excees Internet e vrus .......................................................................... 86
gerando-as .......................................................................... 125 Introduo ................................................................................... 5
tratamento de...................................................................... 123
tratando .............................................................................. 123
Expoentes em tipos nmericos ................................................. 22 L
Leitura
F do teclado .......................................................................49; 50
Line-feed
Ferramentas case ...................................................................... 12 caractere especial .................................................................. 21
finalizers ................................................................................... 41 Linha de comando
float .......................................................................................... 22 argumentos de.................................................................53; 54
Form feed caractere especial..................................................... 21 Linha de comando, argumentos de............................................ 53
Friendly, ou package, veja encapsulamento ............................. 56 Links, diagrama........................................................................... 5
Funes isoladas Lista ligada................................................................................ 68
ausncia de ........................................................................... 13 Listas heterogneas ................................................................. 117
Logo, exerccio 2 .................................................................... 122
long ........................................................................................... 21
2
M P
Mac/Os ........................................................................................ 8 Package
main .......................................................................................... 15 Geometria ............................................................................. 61
Mquinas de estado ................................................................... 24 Packages ............................................................................. 60; 64
Marcas registradas....................................................................... 3 e encapsulamento de classes ................................................ 65
Matriz e estruturas de diretrios ...................................................... 60
representao linear de ......................................................... 81 viso geral sobre ............................................................ 50; 51
Matrizes .................................................................................... 43 Pascal........................................................................................ 32
Mximo divisor comum ............................................................ 73 comparao com .................................................................. 30
MDC, Maximo divisor comum ................................................. 73 Plataformas ................................................................................. 7
Mensagens ................................................................................ 23 Pointers..................................................................................... 42
acoplamento dinmico de ................................................... 113 Polimorfismo .......................................................................... 102
Metainformao, veja static .................................................... 120 de incluso ................................................................. 102; 117
Mtodos Ponteiros................................................................................... 42
acesso de ............................................................................... 19 Ponto flutuante ......................................................................... 22
chamada de ........................................................................... 25 private ................................................................................. 56; 57
chamando mtodos ............................................................... 32 e herana .............................................................................. 92
construtores ....................................................................35; 37 Procedimentos .......................................................................... 34
de classe......................................................................120; 121 ausncia de ........................................................................... 13
destrutores ............................................................................ 41 Programa, Comparao ............................................................ 32
disposio das declaraes de ............................................... 31 protected ............................................................................. 56; 93
encapsulamento de................................................................ 57 public ............................................................................ 56; 57; 59
gerenciamento de chamadas pelo compilador....................... 27
quais e como definir, exerccios 3,4,5 .................................. 28
redefinio de ...............................................................97; 102 R
retornando valores ................................................................ 28
sintaxe de declarao de ....................................................... 24 Raiz quadrada ........................................................................... 38
sobrecarga de ...................................................................... 102 Redefinio de mtodos herdados ............................................ 97
static ................................................................................... 121 Referncias ............................................................................... 42
mtodos e atributos ................................................................... 23 passagem por ........................................................................ 42
Modulo, resto da diviso, veja % .............................................. 72 Resultados do programas diagrama ............................................ 6
N S
Netscape ...................................................................................... 3 Segurana, Caractersticas da linguagem .................................... 8
Nmeros complexos, ex. 2 ........................................................ 77 Seno .......................................................................................... 38
Nmeros racionais .................................................................... 71 Shopping List Approach ........................................................... 71
para a classe Matriz2DInt..................................................... 82
short .......................................................................................... 21
O Sistemas distribudos .................................................................. 9
Sobrecarga ...................................................................... 102; 105
Objetos ...................................................................................... 12 Solaris......................................................................................... 8
alocao de ........................................................................... 19 static ....................................................................................... 120
comparao de ................................................... 44; 45; 47; 48 Streams
copia de ............................................................. 44; 45; 47; 48 viso geral sobre .................................................................. 51
determinao da classe de .................................. 44; 45; 47; 48 Streams, viso geral sobre ........................................................ 50
inicializao de ..................................................................... 19 String ........................................................................................ 35
OOMD Object Oriented Modeling and Design ........................ 12 matching............................................................................... 80
Operador StringBuffer .............................................................................. 80
sobrecarga de ...................................................................... 105 Strings
Operadores converso de ........................................................................ 52
sobrecarga de ...................................................................... 102 definio de .................................................................... 77; 78
Ordenao, ex. 3 ....................................................................... 86 Subclasses, Superclasses e comportamento ............................ 114
Orientao a objetos .................................................................. 10 Sun ............................................................................................. 3
System.in .................................................................................. 50
3
T U
Tabulao caractere especial .................................................... 21 UNICODE ................................................................................ 21
TAD.......................................................................................... 70
Fracao .................................................................................. 71
Teclado V
lendo do ......................................................................... 49; 50
Texto Valores literais .......................................................................... 21
veja Strings .......................................................................... 78 Vetores ...................................................................................... 43
this ............................................................................................ 25 comprimento de (lenght) ...................................................... 54
Threads ....................................................................................... 9 Vdeo
Tipo escrevendo no ....................................................................... 20
char ...................................................................................... 21 Vrus
Tipo abstrato de dados .............................................................. 70 de computador ...................................................................... 86
Tipos bsicos ............................................................................ 21 void ........................................................................................... 15
Tratamento de excees .......................................................... 123 Volumes I, II, III ......................................................................... 6
try123
viso geral sobre .................................................................. 52
type cast .................................................................................... 22
e classes.............................................................................. 116 W
Windows ..................................................................................... 8
wrappers ..............................................................................42; 53
4
2
Contedo:
1. CLASSES E OBJETOS ...................................................................................................................................................... 10
1.1. ESPECIFICANDO UMA CLASSE .................................................................................................................................... 10
1.2. OBJETOS EM JAVA ......................................................................................................................................................... 12
1.2.1. PROGRAMA HELLO INTERNET! .............................................................................................................................. 13
1.2.2. ATRIBUTOS ................................................................................................................................................................ 16
1.2.3. ATRIBUTOS E MTODOS ......................................................................................................................................... 22
1.2.4. MTODOS QUE RETORNAM VALORES. ................................................................................................................. 28
1.2.5. COMPARAO COM UM PROGRAMA EM PASCAL .............................................................................................. 30
1.2.6. CONSTRUTORES ....................................................................................................................................................... 35
1.2.7. CONSTRUTORES E AGREGAO ............................................................................................................................ 38
1.2.8. DESTRUTORES OU finalizers ............................................................................................................................... 40
1.3. PONTEIROS, POINTERS, REFERNCIAS E OBJETOS ............................................................................................ 41
1.3.1. PASSAGEM POR REFERNCIA ................................................................................................................................ 41
1.3.2. VETORES E MATRIZES ............................................................................................................................................. 42
1.3.3. COPIA , COMPARAO E DETERMINAO DA CLASSE EM OBJETOS ............................................................ 44
1.4. OBTENDO VALORES DO USURIO ............................................................................................................................. 48
1.4.1. LENDO DO TECLADO............................................................................................................................................... 48
1.4.1.1. LEITURA DE STRINGS USANDO UM VETOR DE BYTES. .............................................................................................. 48
1.4.1.2. UMA VISO GERAL SOBRE PACKAGES E STREAMS .................................................................................................... 50
1.4.2. ARGUMENTOS DE LINHA DE COMANDO ............................................................................................................. 53
1.5. ENCAPSULAMENTO COM PRIVATE, PUBLIC, PACKAGE E PROTECTED ......................................................... 54
1.5.1. ENCAPSULANDO MTODOS E ATRIBUTOS .......................................................................................................... 54
1.5.1.1. ATRIBUTOS PRIVATE, MTODOS PUBLIC ....................................................................................................................... 56
1.5.1.2. UM ATRIBUTO PUBLIC .................................................................................................................................................... 58
1.5.2. ENCAPSULAMENTO E PACKAGES ..................................................................................................................... 59
1.5.2.1. ENCAPSULAMENTO DE ATRIBUTOS E MTODOS COM PACKAGES ......................................................................... 59
1.5.2.2. ENCAPSULAMENTO DE CLASSES COM PACKAGES ..................................................................................................... 64
1.6. TIPO ABSTRATO DE DADOS ......................................................................................................................................... 69
1.6.1. TAD FRAO ............................................................................................................................................................. 70
1.6.2. STRINGS, UM MODELO DE CLASSE ....................................................................................................................... 77
1.6.3. TAD E ALOCAO DINMICA. ................................................................................................................................ 80
2. HERANA ........................................................................................................................................................................... 87
2.1. HIERARQUIAS DE TIPOS ............................................................................................................................................... 87
2.1.1. UMA HIERARQUIA SIMPLES. .................................................................................................................................. 87
2.1.2. PROTECTED .............................................................................................................................................................. 92
2.1.3. REDEFINIO DE MTODOS HERDADOS ............................................................................................................ 96
2.2. INTERFACES, UMA ALTERNATIVA PARA HERANA MLTIPLA ........................................................................ 98
3. POLIMORFISMO, CLASSES ABSTRATAS ................................................................................................................ 101
3.1. REDEFINIO DE MTODOS PARA UMA CLASSE HERDEIRA ............................................................................ 101
3.2. SOBRECARGA ( MTODOS E OPERADORES) .......................................................................................................... 101
3.2.1. SOBRECARGA DE MTODOS, COPY CONSTRUCTOR ................................................................................... 101
3.2.2. SOBRECARGA DE OPERADOR .............................................................................................................................. 104
3.3. CLASSES ABSTRATAS E CONCRETAS ...................................................................................................................... 104
3.3.1. CLASSE ABSTRATA ITERADOR .............................................................................................................................. 107
3.3.2. ACOPLAMENTO DINMICO DE MENSAGENS .................................................................................................... 112
3.3.2.1. UM EXEMPLO ESCLARECEDOR ...................................................................................................................................... 113
3.3.2.2. O QUE ACONTECE COM O QUE FOI ACRESCENTADO ................................................................................................ 115
3.3.3. LISTA HETEROGNEA DE FORMAS (geomtricas) .............................................................................................. 116
4. CONCEITOS AVANADOS ........................................................................................................................................... 119
3
4.1. ATRIBUTOS STATIC ...................................................................................................................................................... 119
4.2. MTODOS STATIC ........................................................................................................................................................ 120
4.3. TRATAMENTO DE EXCEES .................................................................................................................................... 122
4.3.1. TRATANDO AS EXCEES GERADAS POR TERCEIROS .................................................................................... 122
4.3.2. GERANDO SUAS PRPRIAS EXCEES ............................................................................................................... 124
4.4. THREADS ........................................................................................................................................................................ 126
4.4.1. CRIANDO THREADS USANDO INTERFACES OU HERANA .............................................................................. 127
4.4.1.1. HERANA USADA PARA CRIAR THREADS .................................................................................................................... 127
4.4.1.2. INTERFACES USADAS PARA CRIAR THREADS ............................................................................................................. 129
4.4.2. PENSANDO MULTITHREADED .............................................................................................................................. 131
4
5
Bibliografia:
Alguns dos tutoriais aqui mencionados se tornaro livros, de modo que importante que voc
faa uma busca pelos nomes dos autores tambm.
[1]Rumbaugh, Blaha M., Premerlani W., Eddy F. & Lorensen W. ,Object-Oriented Modeling and Design. Prentice Hall,
1991.
[2]Kernigham Brian W. , Ritchie Dennis M. , The C Programming Language , Englewood Cliffs, N.J.:Prentice-Hall Inc,
1978
[3]Rubira, C.M.F. Structuring Fault-Tolerant Object Oriented Systems Using Inheritance and Delegation, Ph.D. Thesis,
Department of Computing Science, University of Newcastle upon Tyne, October 1994, see Chapter 2.
[4]Lemay Laura, Perkins Charles L., Teach Yourself JAVA in 21 days, samsnet, 1996
[5]van Hoff A., Shaio S., Starbuck O., Sun Microsystems Inc, Hooked on Java, Addison-Wesley, 1996
[7]Campione Mary, Walrath Kathy, The Java Tutorial!, Object-Oriented Programming for the Internet,
http://www.aw.com./cp/javaseries.html