Escolar Documentos
Profissional Documentos
Cultura Documentos
Apostila Java
Apostila Java
A LINGUAGEM DE PROGRAMAO
JAVA
ORIENTAO A OBJETOS
Instituto de Computao
maio, 04
INDCE
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.................................................................................................................................................................15
1.2.3. ATRIBUTOS E MTODOS ..........................................................................................................................................21
1.2.4. MTODOS QUE RETORNAM VALORES...................................................................................................................27
1.2.5. COMPARAO COM UM PROGRAMA EM PASCAL ..............................................................................................28
1.2.6. CONSTRUTORES ........................................................................................................................................................33
1.2.7. CONSTRUTORES E AGREGAO ............................................................................................................................36
1.2.8. DESTRUTORES OU finalizers ................................................................................................................................38
1.3. PONTEIROS, POINTERS, REFERNCIAS E OBJETOS .............................................................................................39
1.3.1. PASSAGEM POR REFERNCIA ................................................................................................................................39
1.3.2. VETORES E MATRIZES ..............................................................................................................................................40
1.3.3. COPIA , COMPARAO E DETERMINAO DA CLASSE EM OBJETOS .............................................................41
1.4. OBTENDO VALORES DO USURIO..............................................................................................................................45
1.4.1. LENDO DO TECLADO ...............................................................................................................................................45
1.4.1.1. LEITURA DE STRINGS USANDO UM VETOR DE BYTES................................................................................................45
1.4.1.2. UMA VISO GERAL SOBRE PACKAGES E STREAMS.....................................................................................................46
4. CONCEITOS AVANADOS............................................................................................................................................109
4.1. ATRIBUTOS STATIC......................................................................................................................................................109
4.2. MTODOS STATIC ........................................................................................................................................................110
4.3. TRATAMENTO DE EXCEES ....................................................................................................................................111
4.3.1. TRATANDO AS EXCEES GERADAS POR TERCEIROS ....................................................................................112
4.3.2. GERANDO SUAS PRPRIAS EXCEES...............................................................................................................114
2
Prefcio:
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.
QUEM DEVERIA LER ESTE TUTORIAL
Qualquer leitor que tenha experincia com pelo menos uma linguagem de programao.
DIAGRAMAO DESTE TEXTO
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:
http://www.dcc.unicamp.br/~aacesta
TUTORIAL
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 links ou diagramas voc encontrar uma maneira ordenada de
aprender sem se perder no mar de informaes da internet.
URL: Uniform Resource Locator, o endereo de um computador na internet
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
5
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.
Os resultados dos programas so indicados pelo diagrama ao lado:
DIVISO DO TUTORIAL
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
APPLETS
Links para vrios applets, divididos por categorias: games, sound, busines, animation... Divirtase...
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, etc.
Um dos smbolos da linguagem uma xcara de caf que aparece em animaes com sua fumaa quente tremulando.
6
DOWNLOAD compilador e outras ferramentas de desenvolvimento de aplicaes Java para a sua plataforma de
JAVA
programao. Fique atento! Outros desenvolvedores esto criando ambientes de programao Java.
http://www.netscape.com
Raiz do hipertexto montado pelos criadores do Netscape Navigator . Sob este endereo voc pode obter
DOWNLOAD o browser Java compatible da Netscape Comunications INC.. Outros desenvolvedores esto
BROWSERS lanando browsers compatveis com Java.
http://www.microsoft.com
A microsoft licenciou a tecnologia Java e a incorporou em seu novo browser: Internet Explorer verso
DOWNLOAD 3.0 ou superior.
BROWSERS
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.
CARACTERSTICAS DA LINGUAGEM
Parecida com C, C++:
Java tem a aparncia de C ou de C++, embora a filosofia da linguagem seja diferente. Por
este motivo estaremos frequentemente fazendo comparaes alguma destas linguagens. O leitor que
programa em qualquer uma delas, ou em uma linguagem orientada a objetos, se sentir mais a
vontade e se tornar um bom programador Java em menos tempo.
Java tambm possui caractersticas herdadas de muitas outras linguagens de programao:
Objective-C, Smalltalk, Eiffel, Modula-3, etc. Muitas das caractersticas desta linguagem no so
totalmente novas. Java uma feliz unio de tecnologias testadas por vrios centros de pesquisa e
desenvolvimento de software.
Compilada:
Um programa em Java compilado para o chamado byte-code, que prximo as instrues
de mquina, mas no de uma mquina real. O byte-code um cdigo de uma mquina virtual
idealizada pelos criadores da linguagem. Por isso Java pode ser mais rpida do que se fosse
simplesmente interpretada.
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). 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.
7
Java permitir a possibilidade de gerar cdigo executvel de uma particular arquitetura on the
fly, tudo a partir do byte-code.
Suporte para programao de sistemas distribudos:
Java fornece facilidades para programao com sockets, remote method call, tcp-ip, etc. Estes
tpicos no sero abordados neste texto.
por Kernighan & Ritchie [[2]], a referncia bsica para este texto. Cobre principalmente sintaxe de
loops e outros assuntos fceis no abordados aqui.
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
TUTORIAIS
1.
Esta a homepage do grupo de estudos em Java. Voc vai encontrar links atualizados para diversos
lugares na internet onde se estuda Java.
CLASSES E OBJETOS
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.
1.1.
Suponha um programa que controla um motor eltrico atravs de uma sada serial. A
velocidade do motor proporcional a tenso aplicada e esta proporcional aos bits que vo para
sada serial e passam por um conversor digital analgico.
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:
10
A velocidade do motor ser representada por um atributo inteiro (int). Usaremos a faixa de
bits que precisarmos, caso o valor de bits necessrio no possa ser fornecido pelo tipo , usaremos
ento o tipo long, isto depende do conversor digital analgico utilizado.
Representao da sada serial:
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.
Alterao do valor da velocidade:
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.
Um diagrama simplificado da classe motor com os atributos e mtodos:
Este e outros diagramas deste texto foram elaborados com uma ferramenta case para object oriented modeling and
design segundo a metodologia descrita em [[1]]
Exerccios:
1Lembre-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?
11
OBJETOS EM JAVA
Objetos so instncias de uma classe. Quando um objeto criado ele precisa ser inicializado,
ou seja para uma nica classe de nome EstudanteDeGraduacao podemos ter vrios objetos
durante a execuo de um programa.
Estudante de graduao Andre; Identificao 940718; Curso Computacao | Estudante de
graduao Luiza , Identificao 893249, Curso Medicina... A classe representa somente o molde
para a criao dos objetos, estes sim contm informao, veja tpico CLASSES E OBJETOS.
O atributo Identificao tem valor 940718 para a instncia (objeto) Andr da classe Estudantes
de Graduao.
INSTANCIAS: Um objeto existente durante um momento da execuo de um programa uma instancia
de uma classe.
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 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.
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.
12
System.out.println("Hello Internet!");
}
Hello Internet!
13
Comentrios em Java seguem a mesma sintaxe de C++, // inicia uma linha de comentrio,
todo o restante da linha ignorado. Existe tambm um outro tipo de comentrio formado por /*
Insira aqui o texto a ser ignorado */ , este tipo de comentrio pode ser intercalado em uma linha
de cdigo. Comentrios so tratados como espaos em branco.
public class HelloInternet {
class a palavra reservada que marca o inicio da declarao de uma classe. Public um
especificador, por enquanto guarde public class como o incio da declarao de uma classe. Toda
classes sero declaradas assim at o tpico encapsulamento de atributos e mtodos com
packagesencapsulamento de classes com packages.
HelloInternet
o nome dado a esta classe. O abre chaves marca o incio das declaraes da classe que
so os atributos e mtodos. Esta classe s possui uma declarao, a do mtodo main, note que um
mtodo, ao contrrio de C++, s pode ser declarado {internamente} a classe a qual pertence,
evitando as confuses sobre escopo. Desta forma, todo pedao de cdigo em Java deve pertencer
ao abre chaves, fecha chaves da definio de uma classe.
public static void main (String args[]) {
System.out.println("Hello Internet!");
}
public
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. encapsulando mtodos e
atributos
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:
Se voc gosta de paradoxos e j conhece um pouco de orientao a objetos, pense que se o
mtodo main tivesse que ser chamado para um objeto (o que no o caso) este objeto teria que ter
sido criado em algum outro lugar ento este lugar seria o incio do programa e main1 deixaria de
ter esta finalidade.
A linguagem de programao Eiffel adota uma tcnica diferente para resolver este problema:
todo programa comea com a criao de um objeto (e no mais a chamada automtica de main),
este objeto chamado ROOT, ele pode conter atributos que so inicializados e um mtodo de
inicializao, construtor do objeto, que o incio do cdigo do programa.
void
1
...
}
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:
Normalmente o volume de conceitos presentes num primeiro programa de uma linguagem
orientada a objetos como Java ou Eiffel grande se comparado com o de um primeiro programa
em C ou Pascal. Esses conceitos ainda sero aprofundados e so citados aqui apenas por
curiosidade, normal que voc no tenha entendido tudo.
De agora em diante no explicaremos mais como compilar os programas.
Exerccios:
1-
16
O compilador deve ser chamado para ambos arquivos. Ou voc pode usar os chamados
wildcards1 javac *.java.
Sem Includes:
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.
17
Se voc j programa em alguma outra linguagem provavelmente deve estar com a seguinte
dvida: Vocs usaram o nome da classe Circulo na classe Principal, ambas esto em arquivos
separados, como o compilador sabe em que diretrio est a classe Circulo? No preciso fazer
uma espcie de include para poder usar a classe Circulo em outro arquivo?
A resposta no. O compilador sabe achar se ela estiver sob o diretrio de seu programa. Se
voc tiver que deixar esta classe em outro diretrio ento ela deve fazer parte de um package e voc
ter que importar explicitamente este package, veremos como faz-lo mais tarde.
Classe Circulo e declarao de atributos:
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):
EspecificadorModoAcesso NomeTipo NomeAtributo;
public float raio;
public float x;
public float y;
Todos os atributos pertencentes a classe so do tipo float (Ponto flutuante 32-bit IEEE754,
veja tabela de tipos bsicos). Esto especificados como public o que significa que podem ser
modificados a partir de uma classe que usa um 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.
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.
Classe Principal declarao e inicializao de atributos:
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 seguinte:
String umastring;
umastring=new String(Valor inicial);
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.construtores.
Neste nosso programa, os atributos contidos na rea de memria alocada por new, so alterados de
outra forma.
Coleta automtica de lixo:
18
mas a=1+0; tambm tem como resultado o valor 1, mas agora com o significado inteiro, numrico.
O compilador no sabe distinguir entre os significados numrico e booleano.
Essa ambiguidade faz com que programadores (C ou C++) no acostumados com esta
conveno de operadores = e ==, incorram no erro de escrever j=1 quando na verdade queriam
dizer j==1, mas para o compilador ambas as expresses tem valor inteiro de modo que se esse
engano ocorrer num teste de parada de um loop, pode ocorrer que ele nunca pare, pois 1 tem o
mesmo valor de true.
Java elimina este tipo de erro introduzindo o tipo boolean com os valores true e false, que
no tem nenhuma relao com o tipo int e qualquer outros tipos.
TIPOS BSICOS E CONSTANTES OU VALORES LITERAIS
(para nossa sorte os tipos bsicos so os mesmos para qualquer ambiente de programao Java, porque a linguagem
portvel):
char
O tipo char (caractere UNICODE) representado com 16-bits sem sinal, o que permite
enderear de 0 a 65535. O objetivo desta opo permitir internacionalizao da linguagem, bem
como a padronizao. Constantes do tipo caractere aparecem entre apstrofes: a, 1, $.
Tabela de caracteres especiais:
(ao contrrio de C/C++, no existe um caractere especial para o som de beep ou bell )
Representao visual:
\n
\r
\b
\t
\f
\
\
\\
\u223d
\gfa
\fff
boolean
Funo, significado:
Pula linha, linefeed
Retorno de carro
Backspace
Tabulao
Formfeed
Apstrofe
Aspas
Barra inversa
Caractere unicode
Octal
Hexadecimal
Valor true ou false, diferente representao de C++, sem converso em outros tipos.
O tipo boolean no tem relao nenhuma com outros tipos (coero). Eliminando problemas
que surgiram por exemplo em C++ que usa inteiros para representar valores booleanos. Os
possveis valores so true e false que so os resultado dos testes lgicos.
boolean pertenceAoConjunto; //declara variavel
pertenceAoConjunto=true; //exemplo
byte
short
int
long
20
No existem especificadores de tipos como unsigned, todos os tipos inteiros tem sinal.
Valores literais: O que voc v nem sempre o que voc tem: Um valor como 299792458
considerado int como padro, se voc quer atribuir esta constante a um long, faa o type cast
explicitamente:
long a;
a=(long)299792458; //a recebe PI
Ou ento use uma terminao em L para indicar que o nmero deve ser representado como long:
long a=299792458L; //ou L minusculo
Para indicar valores octais anteceda-os com um zero: 0444 , j para valores hexadecimais
anteceda-os com 0X ou 0x, exemplo: 0xBCD4
float
double
Um valor como 3.14159265 considerado double como padro, se voc quer atribuir esta
constante a um float, faa o type cast explicitamente:
float a;
a=(float)3.14159265; //a recebe PI
Ou ento usar uma terminao em f para indicar que o nmero deve ser representado como float:
float a=3.14159265f //ou F maiusculo
Expoentes podem ser escritos usando o caracter e ou E: 6,02E23 ou 1.380658e-23 . Onde e-1,
significa multiplicado por dez elevado a menos 1 ou *0.1. O separador de casas decimais o
ponto.
Apesar de todas estas regras para uso de valores literais, quando dois nmeros de tipo diferentes
como double e int so usados em um calculo do lado direito de uma atribuio, voc no precisa
fazer o type cast desses valores. O compilador promove o nmero do tipo mais fraco para o tipo
mais forte antes de fazer o calculo. Voc pode desejar fazer o type cast do resultado, para atribuir
a uma varivel long por exemplo.
Exerccios:
1Repita 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.
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.
complexos formam conjuntos de objetos que trocam mensagens entre si gerenciando inclusive os
recursos do sistema.
O programa a seguir exemplifica chamadas de mtodos, para tal define um objeto que serve
como contador, a implementao representa a contagem no atributo num que um nmero inteiro.
Os mtodos so simples: incrementa adiciona um ao contador em qualquer estado e comeca
inicializa a contagem em zero. Decrementa faz o oposto de incrementa.
umcont.incrementa();
System.out.println(umcont.num);
}
}
0
1
Exerccios:
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.
2Crie uma classe contador cclico, exemplo o contador de minutos de relgios digitais:
0,1,2,...,57,58,59,0,1,2,... . A operao modulo ou resto da diviso inteira, tem sintaxe semelhante a
de C++: a % b==a-((int)a/b)*b. No tente usar a estrutura de deciso if ainda.
Mquinas de estados:
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.
Sintaxe de declarao de mtodos:
A sintaxe simplificada para a declarao de mtodos de uma classe :
especificadordeacesso tipoderetorno nomedometodo(lista_de_argumentos) { /*codigo */
}.
Uma diferena do uso de funes comuns em linguagens no orientadas a objetos e do uso de
mtodos que como o mtodo est definido na classe, ele ganha acesso direto aos atributos, sem
precisar usar o ponto, exemplo um_objeto.atributo;. Lembre-se que as chamadas de mtodos
em um programa j se referem a um objeto especfico, embora os mtodos sejam definidos de uma
forma geral e parametrizada para toda a classe. Volte agora ao mtodo main e verifique sua
sintaxe.
this:
this uma palavra chave 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
23
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.
Sintaxe de chamada ou acesso a mtodos:
A sintaxe de chamada ou acesso mtodos semelhante a sintaxe de acesso aos atributos,
com exceo dos parnteses que contm a lista de argumentos da funo que implementa o mtodo,
mesmo que a lista seja vazia eles devem estar presentes: umcontador.incrementa();. Primeiro
insere-se o nome do objeto e depois a chamada da funo, estes so separados por um ponto.
Cuidado para no esquecer os parnteses em programas futuros, este um erro bastante comum.
24
//Classe circulo
public class Circulo {
public float raio;
public float x;
//posicoes em coordenadas cartesianas
public float y;
public void move(float dx,float dy)
//move o circulo de lugar
{
this.x+=dx;
y+=dy;
}
public void mostra()
//imprime na tela estado do objeto
{
System.out.println("("+x+","+y+","+raio+")");
}
} //fim da declaracao da classe
//Classe principal, Arquivo Principal.Java
class Principal {
public static void main(String args[]) {
Circulo umcirc;
//declaracao de atributo circulo
umcirc=new Circulo();
umcirc.x=0;
umcirc.y=0;
umcirc.raio=12;
umcirc.mostra();
umcirc.move(10,10);
umcirc.mostra();
umcirc.x=100;
umcirc.mostra();
}
}
25
(0,0,12)
(10,10,12)
(100,10,12)
Como funcionam no compilador as chamadas de mtodos:
possvel imaginar que as definies de mtodos ocupam um grande espao na representao
interna dos objetos, mas lembre-se que elas so todas iguais para uma classe ento basta manter
para cada classe uma tabela de mtodos que consultada no momento da chamada . Os objetos s
precisam ter uma referncia para esta tabela.
Exerccios:
1-
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 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-
526
H uma tendncia em definir o maior nmero de mtodos em uma classe, porque nunca se
pode prever exatamente o seu uso em programas futuros. Comente esta frase, tendo em vista o
conceito de portabilidade. Voc j capaz de citar outras medidas que tornem suas classes mais
portveis, flexveis e genricas? Leia o exerccio anterior e o exerccio 3.
1.2.4. MTODOS QUE RETORNAM VALORES.
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:
O estado da trava representado no atributo public boolean travado; e pode ser obtido
atravs de uma chamada ao mtodo estado(). Este exemplo bastante simples e no tem a
pretenso de ser uma implementao completa de uma classe que modele uma trava que possa ser
usada para evitar o acesso a um arquivo, por exemplo.
//COMENTARIOS
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-
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.
ac.inicializa(0,0,10);
ac.mostra();
ac.move(1,1);
ac.mostra();
ac.x=100;
ac.altera_raio(12);
ac.mostra();
}
}
Disposio dos mtodos e atributos na declarao de uma classe:
Em uma declarao de uma classe normalmente se coloca a declarao de mtodos depois da
declarao dos atributos, porm podemos fazer intercalaes ou adotar qualquer ordem que nos
convenha.
Uma boa tcnica de programao, que aconselhamos voc adotar em seus programas usar
linhas de comentrios para delimitar uma rea do cdigo de suas classes que englobe tudo o que
interessa a um usurio desta. Nestes programas exemplos praticamente tudo de interesse de um
usurio (cliente) de sua classe, mas nos exemplos mais avanados isto no ser verdade.
Comentrios:
Observe que o mtodo mostra chama o mtodo public float retorna_raio(void) que da
mesma classe. Fica claro da definio de mostra que this.retorna_raio() se aplica ao mesmo
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.
Programao orientada a objetos e interfaces grficas com o usurio:
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 .
(0,0,10)
(1,1,10)
(100,1,12)
Pascal:
30
PROGRAM Comparacao;
{COMPARACAO COM UM PROGRAMA Java}
TYPE Circulo=RECORD
x:real;
{COORDENADAS X E Y}
y:real;
r:real;
{somente dados}
END;
var ac:circulo;
leitura:integer;
PROCEDURE Inicializa(var altereme:Circulo;ax,by,cr:real);
{COLOCA O CIRCULO EM DETERMINADA POSICAO}
BEGIN
altereme.x:=ax;
altereme.y:=by;
altereme.r:=cr;
END;
PROCEDURE Altera_Raio(var altereme:Circulo;ar:real);
{ALTERA O RAIO DO CIRCULO}
BEGIN
altereme.r:=ar;
END;
FUNCTION Retorna_Raio(copieme:Circulo):real;
BEGIN
Retorna_Raio:=copieme.r;
END;
PROCEDURE Move(var altereme:Circulo;dx,dy:real);
{MODE AS COORDENADAS X E Y ACRESCENTANDO DX E DY}
BEGIN
altereme.x:=altereme.x+dx;
altereme.y:=altereme.y+dy;
END;
PROCEDURE Mostra(copieme:Circulo);
{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);
31
Move(ac,1.0,1.0);
Mostra(ac);
ac.x:=100.0;
Altera_Raio(ac,12.0);
Mostra(ac);
read(leitura);
END.
X: 0.0000000000E+00 Y: 0.0000000000E+00 R: 1.0000000000E+01
X: 1.0000000000E+00 Y: 1.0000000000E+00 R: 1.0000000000E+01
X: 1.0000000000E+02 Y: 1.0000000000E+00 R: 1.2000000000E+01
//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: }
Em Pascal os procedimentos e os dados so criados de forma separada, mesmo que s tenham
sentido juntos. A juno entre os dados e procedimentos se d atravs de passagem de parmetros.
No caso de uma linguagem procedural, o que normalmente feito se assemelha ao cdigo seguinte:
Move(ac,1.0,1.0);. Nesse caso AC um record, algo semelhante ao struct de C (no C++).
Move, acessa os dados do record alterando os campos. O parmetro passado por referncia e o
procedimento definido a parte do registro, embora s sirva para aceitar argumentos do tipo
Circulo e mover suas coordenadas.
Segurana:
Em ambos programas (Pascal, Java) o programador pode obter acesso 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:
Algum pode argumentar que programas que usam bastante chamadas de mtodos podem se
tornar pouco eficientes e que poderia ser melhor obter acesso direto 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
32
permitir sempre o acesso direto aos dados de um tipo definido pelo usurio por razes de
segurana.
Exerccios:
1Implemente outros mtodos do estilo public void altera_raio(float a) e float
retorna_raio(void) para os atributos X e Y.
2Faa um programa simples para testar uma classe que representa um mouse e que fornece a
posio na tela, os indicadores de estado dos botes e os mtodos: clica_botao( ); move(float dx,
float dy);. No preciso fazer a ligao do objeto com o mouse real, embora o leitor interessado
possa encontrar na segunda parte subsdios para esta tarefa.
8 Seu mouse deve ser capaz de caminhar para qualquer lugar da tela atravs de chamadas
de mtodos, no deve ultrapassar os limites estabelecidos, deve indicar o boto est pressionado ou
no atravs de um mtodo semelhante ao mostra( ) deste exemplo. O mouse deve ter de 1 boto.
Voc pode substituir mtodo move(float dx,float dy) por combinaes de move_x(float dx); e
move_y(float dy);
Voc pode achar o fato de o mouse ser obrigado a ter um boto um tanto estranho, mas no .
Os mouses dos machintoshes tm um boto, alguns mouses de pcs tm dois botes e mouses de
workstations tm trs botes. Para seu programa ser portvel ele deve contar apenas com a
existncia de um boto e isso vale a pena quando se fala em portabilidade. O que tem sido usado
em casos extremos a combinao de pressionamento dos botes e pressionamento de teclas para
diferenciar certas aes.
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
Construtores so mtodos especiais chamados pelo sistema no momento da criao de um
objeto. Eles no possuem valor de retorno, porque voc no pode chamar um construtor para um
objeto, voc s usa o construtor no momento da inicializao do objeto. Construtores representam
uma oportunidade de inicializar seus 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:
String a;
a=new String(Texto); //alocacao e inicializacao atraves do construtor
a.mostra(); //mostra so pode ser chamada depois do construtor
33
//Classe ponto
public class Ponto {
public float x,y;
public Ponto(float ax,float ay) // sempre omita o valor de retorno!
//garante o estado do objeto
{
this.x=ax; this.y=ay;
}
public void move(float dx,float dy)
{
this.x+=dx; this.y+=dy;
}
public void mostra()
{
System.out.println("("+this.x+","+this.y+")");
}
}
34
(0,0)
(1,1)
(100,1)
//COMENTARIOS:
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:
1Um 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:
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.
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.
2Introduza 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);
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
35
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.
4-
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.
1.2.7. CONSTRUTORES E AGREGAO
Este exemplo o resultado do exerccio anterior (exerccio 4 tpico construtores), ele cria
uma classe Reta com dois atributos da classe Ponto. Ou seja voc estar reutilizando a classe
Ponto na classe que representa uma Reta, a forma como essa reutilizao de cdigo ocorre
chamada de agregao.
O nome reutilizao de cdigo bastante apropriado, pois a classe Reta estar utilizando
todos os mtodos escritos para a classe Ponto. Em casos como este comum dizer que a classe
Reta cliente da classe Ponto em uma analogia com as relaes comerciais.
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:
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:
{
a=new Ponto(ax,ay); //chamadas dos contrutores da classe Ponto
b=new Ponto(bx,by);
}
public void mostra()
{
a.mostra();
b.mostra();
}
}
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).
3Defina 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
37
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).
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
1.2.8. DESTRUTORES OU finalizers
Em Java a liberao de memria que feita pelo coletor automtico de lixo que executado
de modo assncrono com o restante do programa, ou seja voc no pode contar com o fato de que o
destrutor ser chamado imediatamente aps o momento em que seu objeto sai de escopo, a no ser
que o programa seja executado com o modo assncrono do coletor automtico de lixo desligado
(java -noasyncgc NomePrograma). Na verso beta, voc no pode nem mesmo contar com a
chamada do destrutor pelo garbage collector, de modo que ele deve ser usado apenas para
otimizaes do cdigo.
1.3.
Algum pode ter achado estranho que no foram discutidos ponteiros em Java, ocorre que
eles no existem nessa linguagem. Existem estudos que afirmam que erros com ponteiros so um
dos principais geradores de bugs em programas, alm disso com todos os recursos que temos no
precisaremos deles.
Os programadores acostumados ao uso de ponteiros (e aos erros decorrentes desse uso),
acharo muito natural e segura a transio para Java onde passaro a usar principalmente vetores e
classes. A estruturao de seu cdigo dever agora ser feita em um modelo que se baseia no uso de
objetos (vetores e Strings tambm so objetos). Objetos superam a representatividade obtida com
records, funes isoladas e ponteiros.
De certo modo voc estar usando referncias, mas de forma implcita. Por exemplo: objetos
so alocados dinamicamente com new, eles so referncias ou ponteiros para posies na
memria, mas a linguagem mascara este fato por razes de segurana. Como objetos so ponteiros
(s que transparentes para voc), nos depararemos com o problema de reference aliasing quando
discutirmos cpia de objetos com outros objetos como atributos.
1.3.1. PASSAGEM POR REFERNCIA
Linguagens como Pascal ou C criam meios de passar parmetros por valor ou por referncia.
Como Java no possui ponteiros, a passagem por referncia deve ser feita atravs de objetos. Se o
parmetro j um objeto, ento a passagem dele obrigatoriamente por referncia.
No caso de tipos simples, podemos pass-los dentro de vetores que so objetos, ou ento criar
classes para embalar, empacotar estes tipos. Dada a necessidade destas classes, elas j foram
definidas na linguagem. So classes definidas para conter cada tipo bsicos e permitir certas
converses entre eles, falaremos destas classes conforme necessitarmos de seu uso. As vezes estas
classes so chamadas de wrappers.
Exerccios:
1-
class X {
public void troca(X valores)
{
int a;
a=val;
val=valores.val;
valores.val=a;
}
//imprima os atributos de um objeto OBJ da classe X
39
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
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:
1Escreva 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);
1.3.3. COPIA , COMPARAO E DETERMINAO DA CLASSE EM
OBJETOS
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
41
Strings e vetores so objetos de classes pr definidas na linguagem, portanto as afirmaes feitas aqui se aplicam a eles
tambm.
42
Original:(0,0)
Alias:(0,0)
Modificando Alias.x para 2
Veja como o original ficou:(2,0)
pCopia nao se modifica:(0,0)
Original==Alis:true
Copia==Original:false
Deixando atributos de copia iguais aos de Original
Copia==Original:false
Original.x==Copia.x:true
Original.y==Copia.y:true
//COMENTARIOS
//preparacao das variaveis, copia de objetos:
pAlias e uma referncia para o mesmo local de memria que pOriginal, por este motivo
quando pAlias alterado, pOriginal se altera por efeito colateral, eles compartilham o mesmo
objeto pois a atribuio pAlias=pOriginal, copia o endereo de pOriginal.
J pCopia, o resultado de uma nova alocao de memria, portanto um novo endereo, um
objeto independente dos outros.
//comparacao de objetos:
pOriginal==pAlias e outras comparaes equivalentes tm o significado de comparao do
endereo de memria e no do contedo.
43
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");
//verificacao da classe dos objetos
System.out.println("Obtendo a classe dos objetos");
System.out.println(pOriginal.getClass().getName());
System.out.print("Original e da classe String?");
boolean result=(pOriginal instanceof String);
System.out.println(result);
}
}
Este programa exemplo no opera corretamente, isto se deve a no implementao destes
mtodos na verso beta (a disponvel atualmente).
1.4.
Este tpico foi introduzido porque os programas seguintes so mais complexos e precisam ser
testados iterativamente. Mesmo que voc s v fazer programas em interfaces grficas
interessante saber como testar certas classes via teclado ou linha de comando, sem contar que sem o
contedo deste tpico os programas seguintes no sero possveis. Alm do que voc pode desejar
fazer algum programa de linha de comando (batch) em Java, por exemplo um programa de
comunicao entre as diversas mquinas de uma rede ou um programa que receba argumentos via
linha de comando.
1.4.1. LENDO DO TECLADO
Este tpico contm dois exemplos que ensinam como ler Strings do teclado, como convertlas para nmeros, e como controlar melhor a entrada e sada de dados.
1.4.1.1.LEITURA DE STRINGS USANDO UM VETOR DE BYTES.
Em Java praticamente um padro ler dados em bytes, seja do teclado, da rede, do disco ou
de qualquer outro lugar. Por este motivo o primeiro exemplo l em um vetor de bytes. Como
sabemos que voc quer mais do que isso( ex. ler outros tipos da linguagem ), o segundo exemplo
tratar desse caso.
45
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.io.*;
class EntraDados {
public static void main (String args[])
{
byte vetortexto[] = new byte[200]; //declaracao de um vetor de bytes
int byteslidos = 0;
System.out.println("Escreva algo:");
try {
byteslidos = System.in.read(vetortexto);
System.out.print("Voce escreveu:");
System.out.write(vetortexto,0,byteslidos);
}
catch (IOException e) {
// Alguma acao de recuperacao da falha
}
}
}
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.
1.4.1.2. UMA VISO GERAL SOBRE PACKAGES E STREAMS
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
46
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.
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).
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.
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
47
19 //processamento, mas nao estudamos a classe string ainda, por isso tenha paciencia.
20
System.out.println(linha);
21
22
23
}/
24
25 }
Voce pode andar rapido com paciencia
Voce pode andar rapido com paciencia
//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:
No bloco try { }, deve-se inserir as operaes passveis de falhas. Este bloco deve ser seguido
por catch (Exception erro) { /* nao faco nada */ }. No lugar de /* nao faco nada */ deveriam
estar as possveis aes de recuperao de falhas como no caso adotamos:
System.out.println(Erro de leitura);.
line = myDataInputStream.readLine(); o mtodo que faz com que o Stream leia da
entrada de dados em que foi associado uma linha. Este mtodo obviamente bloqueia a execuo do
programa at que se digite carriage return, o que no problemtico pois isto poderia ser feito
paralelamente, usando threads.
Como converter Strings para inteiros:
Se voc inserir o seguinte mtodo na nossa classe ReadString, poder ler valores inteiros do
teclado.
static int leInteiro() {
48
String line;
DataInputStream in = new DataInputStream(System.in);
try {
line = in.readLine();
int i = Integer.valueOf(line).intValue();
return i;
}
catch (Exception e) {
return -1;
}
}
int i = Integer.valueOf(line).intValue();
um exemplo de chamadas consecutivas ou aninhadas de mtodos. Olhe da esquerda para a
direita. Primeiro o mtodo valueOf(line) chamado para a 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.
Exerccios:
1-
Voltaremos a falar sobre Strings, porm por hora, voc j tem condies de ler as
bibliografias adicionais sobre eles.
1.4.2. ARGUMENTOS DE LINHA DE COMANDO
Na segunda parte veremos que os programas Java que rodam embebidos em hipertextos
podem receber parmetros iniciais de funcionamento do hipertexto. Os programas que estamos
descrevendo nesta parte so aplicaes executadas via linha de comando. De modo anlogo, essas
aplicaes podem receber argumentos de linha de comando.
Exemplo de passagem de trs argumentos de linha de comando para um programa Java:
java teste Texto 2 Nome
Interrompa sua leitura agora e experimente passar argumentos para um dos programas criados
anteriormente, os argumentos obviamente sero ignorados pelo programa e este se comportar da
mesma forma que antes.
O vetor de Strings o argumento do mtodo main que normalmente chamvamos de String
args[]:
public static void main (String args[]) ...
class MostraArgumentos {
possvel criar mtodos para serem chamados para classes e no s para objetos, so os chamados class methods em
contraposio a instance methods.
49
1
1.5.
private
protected
Nada especificado,
equivale package
ou friendly
Estes atributos e mtodos so acessveis somente nos mtodos das classes que
pertencem ao package em que foram criados. Este modo de acesso tambm
chamado de friendly.
(existem outros qualificadores, no relacionados com encapsulamento que sero explicados depois)
PUBLIC
PRIVATE
PROTECTED
PACKAGE
PUBLIC
PRIVATE
PROTECTED
PACKAGE
//atributos private
//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.
53
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 {
54
public float x;
public float y;
public void inicializa(float a, float b) {x=a; y=b;};
public void move(float dx, float dy) ; {x+=dx; y+=dy; };
};
b)
public class Ponto {
public void inicializa(float a, float b) {x=a; y=b;};
public void move(float dx, float dy) ; {x+=dx; y+=dy; };
private float x;
private float y;
};
c)
public class Ponto {
public void inicializa(float a, float b) {x=a; y=b;};
private void move(float dx, float dy) ; {x+=dx; y+=dy; };
public float x;
private float y;
};
1.5.2. ENCAPSULAMENTO E PACKAGES
Neste tpico explicaremos o recurso de packages com nfase nas opes de encapsulamento
relacionadas , em herana explicaremos este recurso com nfase no reuso de cdigo das packages
oferecidas com a linguagem. Packages so conjuntos de classes relacionadas, estes conjuntos so
determinados incluindo uma linha no topo de cada arquivo indicando a qual package pertencem as
classes ali declaradas. Se nenhuma linha inserida assume-se que todas as classes pertencem a uma
package s.
1.5.2.1. ENCAPSULAMENTO DE ATRIBUTOS E MTODOS COM
PACKAGES
O encapsulamento de atributos e mtodos atingido com o uso de packages muito semelhante
ao encapsulamento com private e public, s que agora o limite de visibilidade mais amplo do
que a classe. A questo aqui levantada se a classe visvel fora do package ou no. S para
lembrar, a questo que do item anterior: 1.5.1, era se os mtodos e atributos eram visveis fora da
classe ou no.
Visibilidade das declaraes de uma classe, dentro de seu package:
PUBLIC
PRIVATE
PROTECTED
PACKAGE
Aps Javac:
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;
public class Ponto {
float x,y; //nenhu especificador, default=package
public Ponto(float ax,float ay) //omita o valor de retorno!
//garante o estado do objeto
{
this.x=ax; this.y=ay;
}
public float retornaX()
{
return x;
}
public void move(float dx,float dy)
{
this.x+=dx; this.y+=dy;
}
public void mostra()
56
{
System.out.println("("+this.x+","+this.y+")");
}
}
//Classe circulo
package Geometria;
public class Circulo {
float raio,x,y; //nenhum especificador, defaul=package
public Circulo(float ax,float ay,float ar)
//garante o estado do objeto
{
this.x=ax; this.y=ay; this.raio=ar;
}
public void altera_raio(float a)
{
this.raio=a;
}
public float retorna_raio()
{
return this.raio;
}
public void move(float dx,float dy)
{
this.x+=dx; this.y+=dy;
}
public float distancia(Ponto ap)
{
float dcp; //distancia do centro do circulo ao ponto
dcp=(float)Math.sqrt((double) ((x-ap.x)*(x-ap.x)+(y-ap.y)*(y-ap.y)) ); //acesso direto
//aos atributos de ap, isto porque as classes pertencem ao mesmo package
if (dcp<raio) {return raio-dcp; }
else {return dcp-raio; }
}
public void mostra()
{
System.out.println("("+this.x+","+this.y+","+this.raio+")");
}
}
57
//Arquivo Reta.java
//Classe Reta
package Geometria;
public class Reta {
Ponto a,b; //idem , sao encapsulados como package
public Reta(float ax,float ay,float bx,float by)
{
a=new Ponto(ax,ay);
b=new Ponto(bx,by);
}
public float distancia(Ponto ap)
{
//metodo nao implementado
//acesse livremente os atributos do argumento Ponto
//de modo a calcular sua distancia a esta reta, ex copia=ap.x;
return 0.0f;
}
public void mostra()
{
a.mostra();
b.mostra();
}
}
(0,0,1)
(4,3)
Dist:4
As declaraes em negrito dos arquivos acima: package Geometria.*; e import
Geometria.* devem ser inseridas logo no incio do arquivo, s podendo ser precedidas por
comentrios.
Existe uma quantidade grande de packages, j definidas na linguagem, as quais
abordaremos na segunda parte. Por hora basta saber que j estamos usando declaraes da
package java.lang , mesmo sem especificar import java.lang.*; no incio de nossos arquivos.
Isto ocorre porque este package importado implicitamente em todos os programa Java.
O .* usado em import Geometria.*; tem o significado de todas as classes da package
Geometria, o asterisco usado como um coringa, um valor que pode substituir todos os demais,
assim como em alguns sistemas operacionais.
Embora de fcil utilizao, este conceito constitui uma inovao com relao a C++. Em
Modula-3 pode-se obter um efeito semelhante utilizando declaraes de classes (tipos objetos) no
mesmo mdulo e interfaces que no exportam tudo o que existe no mdulo, assim as classes
declaradas no mesmo mdulo oferecem facilidades umas as outras.
O modo de acesso de atributos e mtodos chamado friendly ou package proporcionado
pelo uso de packages e permite programar de maneira eficiente (sem muitas chamadas de
mtodos) e segura (com encapsulamento).
Se os tributos da classe Ponto forem especificados como friendly ou package (equivale a
nenhum especificador), eles podero ser acessados diretamente (sem chamadas do tipo
ap.retorna_x(); ) pela classe Reta que pertence a mesma package, mas continuam encapsulados
para as classes externas ao package ou seja para o usurio. Enfatizamos o termo diretamente
porque obter acesso a um atributo via mtodo bem mais custoso do que acess-lo diretamente,
mas se voc programar usando packages, ganhar o beneficio da eficincia sem perder o do
encapsulamento.
1.5.2.2.ENCAPSULAMENTO DE CLASSES COM PACKAGES
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 */ }
59
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
package
Estas classes podem ser acessadas no package que elas pertencem, se nenhum
package especificado, elas pertencem ao programa.
(existem outros qualificadores, no relacionados com encapsulamento que sero explicados depois)
Aps Javac:
package listas;
//classe Lista, classe No arquivo Lista.java
class No { //sem especificador de modo de acesso na classe
private char info; //se eu ja tivesse ensinado protected usaria em lugar de private
private No prox; //"ponteiro" para o proximo no
No(char i,No p) //construtor
{
info=i;
prox=p;
}
char retorna_info()
//retorna valor do campo
{
60
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;
}
}
public class Lista {
private No cabeca; //inicio da lista
private int elementos; //numero de nos na lista
public Lista()
//construtor
{
cabeca=null;
elementos=0;
}
public void insere(char a)
{ //realizada em muitos mais pacos para facilitar apredizado
elementos++;
No temp;
if (cabeca==null) cabeca=new No(a,null);
else{
temp=new No(a,null);
temp.altera_prox(cabeca);
cabeca=temp;
}
//se cabeca == null tambem funciona
}
61
62
class Principal {
class Principal {
DataInputStream meuDataInputStream
=new DataInputStream(System.in);
try{
do
{
o =(char)meuDataInputStream.read();
switch (o) {
case 'i':
e=(char)meuDataInputStream.read();
ml.insere(e);
break;
case 'r':
e=ml.remove();
System.out.println(e);
//System.out.flush();
break;
case 'm':
ml.mostra();
System.out.println();
//System.out.flush();
break;
default: ;
}
ml.insere('v');
ml.insere('a');
ml.insere('j');
ml.mostra();
e=ml.remove();
System.out.println(e);
ml.mostra();
ml.remove(); //embora o metodo
//remove retorne um valor
ml.remove(); //nestas chamadas,
//este valor de retorno e'
ml.remove(); //ignorado
ml.mostra();
}
}
} while (o!='q');}
catch (Exception erro) { /* nao faco nada */ }
}
}
ia
m
[a]-null
iviaij
m
[j]-[a]-[v]-[a]-null
[a]-null
[j]-[a]-[v]-[a]-null
j
[a]-[v]-[a]-null
null
r
63
j
m
[a]-[v]-[a]-null
r
a
r
v
r
a
m
null
q
//COMENTARIOS
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:
da desalocao.
Tipo abstrato de dados, TAD, se preocupa em proporcionar uma abstrao sobre uma
estrutura de dados em termos de uma interface bem definida. O encapsulamento mantm a
integridade do objeto evitando acessos inesperados. O fato de o cdigo estar armazenado em um s
lugar cria um programa modificvel, legvel, coeso.
A idia criar classes que ocultem a sua representao interna as quais podem geralmente ser
modeladas atravs de shopping list approach. Por shopping list approach entenda que voc
pode modelar sua classe atravs das operaes que ela suporta, ou seja, antes de comear a
implementar recomendvel que se faa uma lista (semelhante a uma lista de compras) das
operaes desejadas para a classe e depois se escolha a representao interna adequada.
Completando este conceito amplo podemos dizer que uma classe implementa um tipo abstrato de
dados.
So exemplos de tipos abstratos de dados:
Uma rvore binria com as operaes usuais de insero, remoo, busca ...
Uma representao para nmeros racionais (numerador, denominador) que possua as
operaes aritmticas bsicas e outras de converso de tipos.
Uma representao para ngulos na forma (Graus, Minutos, Segundos). Tambm com as
operaes relacionadas, bem como as operaes para converter para radianos, entre outras.
64
Teste de igualdade
Teste de desigualdade
Teste de maior ou igual que
Teste de menor ou igual que
Teste de maior que
Teste de menor que
Impresso 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:
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.
//TAD fracao.
//File Fracao.java
class Fracao {
private int num,den;
private int mdc(int n,int d)
{
if (n<0) n=-n;
if (d<0) d=-d;
while (d!=0) {
int r=n % d;
n=d;
d=r;
}
return n;
}
//numerador, denominador
//metodo private maximo divisor comum
//metodo de Euclides +- 300 anos AC.
//construtor comum
//divisor comum
Fracao g;
g=new Fracao(num*j.num,den*j.den);
return g;
}
//operacoes de comparacao
public boolean igual(Fracao t)
{ return ((num*t.den)==(den*t.num)); }
class Principal {
public static void main(String args[])
{
Fracao a,b,c;
a=new Fracao(5,3);
b=new Fracao(2,6);
System.out.print("Esta e' a fracao a: ");
a.mostra();
System.out.print("Esta e' a fracao b: ");
b.mostra();
c=a.soma(b);
System.out.print("c de a+b: ");
c.mostra();
System.out.print("a*b: ");
c=a.multiplicacao(b);
c.mostra();
System.out.print("a+b: ");
c=a.soma(b);
c.mostra();
//c(a+b)
System.out.print("a>=b: ");
System.out.println(a.maiorouigual(b));
System.out.print("a==b: ");
System.out.println(a.igual(b));
System.out.print("a!=b: ");
System.out.println(a.diferente(b));
System.out.print("(int)a ");
System.out.println(a.converteint());
System.out.print("(double)a ");
System.out.println( a.convertedbl());
}
}
69
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.
Estes exerccios so considerados difceis. recomendvel somente esboar o projeto deles e depois, a implementao
pode ser deixada como exerccio das prximas sees.
1
70
class StringTest {
public static void main (String args[]) {
String teste="Ola meu amigo";
System.out.println(teste + " Andre!"); //Ola meu amigo Andre!
teste+=" Andre!"; //atalho para concatenacao seguida de atribuicao
System.out.println(teste); //totalmente equivalente a primeira
char umChar=teste.charAt(5); //um char receber e
System.out.println("Andre "+umChar+teste.substring(3,13));
teste=teste.toUpperCase(); //teste fica igual a OLA MEU AMIGO ANDRE!
for (int i=0;i<teste.length();i++) //imprimindo caracteres um a um
{
System.out.print(teste.charAt(i));
}
System.out.println(); //pula uma linha
System.out.println(teste.indexOf("AMIGO")); //retorna 8
System.out.println(teste.indexOf("biba")); //nao acha, retorna -1
System.out.println(teste.lastIndexOf("AMIGO")); //retorna 8
System.out.println(String.valueOf(3.1415f)); //Metodo chamado para a classe
}
}
Ola meu amigo Andre!
Ola meu amigo Andre!
Andre e meu amigo
OLA MEU AMIGO ANDRE!
8
-1
8
3.1415
//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:
72
String e StringBuffer. StringBuffer permite ser modificada, abaixo apresentamos uma tabela de
seus principais mtodos, para maiores informaes consulte a documentao de java.lang.*
Tabela de mtodos da classe StringBuffer
StringBuffer endereco=http://www.java.com; //Erro! Esta facilidade para instanciao no
permitida para a classe StringBuffer, ao envs disso use o construtor descrito abaixo.
StringBuffer endereco=new StringBuffer(http://www.java.com); //agora sim esta correto
endereco.append("/fim.html"); //concatena e atribui, forma: http://www.java.com/fim.html
endereco.charAt(5); //retorna o caractere /
System.out.println(endereco + /outro.html);
//o operador+ tambem funciona para
StringBuffer
endereco.insert(15,"soft"); //forma http://www.javasoft.com/fim.html
endereco.setCharAt(25,O); //forma http://www.javasoft.com/fOm.html
System.out.println(endereco.toString()); //retorna objeto String equivalente
Exerccios:
1Melhore 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().
*2-
Este um exerccio avanado. Busca de padres em texto uma operao bastante comum
em editores. A busca de informaes na internet quando feita por palavras chave, executada por
aplicativos que podem ter como estratgia a contagem do nmero de ocorrncias de certas palavras
nos textos cadastrados.
Neste exerccio voc far parte desse trabalho de busca de informaes, eu vou te orientar
como: Crie um mtodo que aceita como argumento uma String grande que pode ter vindo de vrias
fontes (no importa quais). Este mtodo pode pertencer a uma classe de nome EstatisticasDeTexto
e deve quebrar o argumento String em palavras separadas por espaos (voc j pode fazer isso com
os mtodos conhecidos, mas talvez queira usar a classe StreamTokenizer). Para cada uma destas
palavras este mtodo faz uma busca na estrutura de armazenamento de palavras da classe, se a
palavra no constar, deve ser includa com multiplicidade 1, caso ela conste na estrutura, apenas sua
multiplicidade deve ser incrementada.
Um problema pode surgir. A estrutura deve ser capaz de crescer de tamanho durante as vrias
chamadas de mtodos com Strings para serem processadas. Se voc usar vetor uma opo realocar
o vetor com o dobro de espaos. Outra opo usar uma lista ligada.
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.
73
3:1
6:12
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.
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).
int result;
if ( (0<indlin) && (indlin<=tam) )
{ result=(indlin % colunas);
if (result==0)
{ result=colunas; }
}
else
{ result=-1; }
return result;
}
public int lin(int indlin)
//linha a partir do indice linear
//nao modifica nenhum atributo da classe
{
int result;
if ( (0<indlin) && (indlin<=tam) )
{ result=(int)( ( (indlin-1)/colunas )+1
else
{ result=-1; }
return result;
}
); }
}
public int retornaindlin(int indlin)
//retorna conteudo do indice i
//retorna -1 se nao conseguiu
{
int result;
if ( (0<indlin) && (indlin<=tam) )
{ result=lc[indlin-1]; }
else
{ result=-1; }
return result;
}
public int getl()
//retorna numero de linhas
{
return linhas;
}
public int getc()
//retorna numero de colunas
{
return colunas;
}
public int gett()
//retorna tamanho
{
return tam;
}
}
//Classe principal, Arquivo Principal.java
class Principal {
public static void main(String args[]) {
Matriz2DInt teste;
teste=new Matriz2DInt(5,10); //5 linhas 10 colunas
for(int i=1;i<teste.gett();i++) {teste.atribuiindlin(i,0); }
System.out.println("linear(5,5)="+ teste.linear(5,5) );
System.out.println("Atribuindo 2 a posicao (5,5)");
teste.atribuiindlin(teste.linear(5,5),2);
System.out.println("Atribuindo 4 a posicao (4,2)");
teste.atribuiindlin(teste.linear(4,2),4);
System.out.println("Trocando estas posicoes");
teste.trocaindlin(teste.linear(5,5),teste.linear(4,2));
System.out.println("Conteudo da posicao (5,5):"+teste.retornaindlin(teste.linear(5,5)));
77
}
}
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
Matrizes definidas na linguagem:
As matrizes definidas pela linguagem seguem uma sintaxe de declarao e uso semelhante a
sintaxe de vetores:
int custos[][]=new int [20,30]; //vinte por trinta, nao importa qual e linha qual e
coluna
custos[0][0]=145;
int a=custos[0][0];
Curiosidade:
Houve um caso de vrus na internet que se baseava no acesso a ndices fora de um vetor para
gravar por cima de instrues do sistema operacional o cdigo que garantisse a sua multiplicao.
No por acaso, Java, impede o acesso a posies fora do vetor.
Dica de programao:
Saiba que uma prtica bastante til na fase de testes de um programa introduzir mensagens
informativas em pontos convenientes. Quando trabalhando com 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:
1Melhore 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.
3Implemente 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?
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
78
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?
*5Defina 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 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.
6Note 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.
79
2.
HERANA
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.
Curiosidade:
Existem classes que podem ser obtidas na Internet para fazer interface com bancos de dados
SQL, servindo principalmente para facilitar esta faceta da programao na internet que bastante
limitada pelas restries de segurana da linguagem.
2.1.
HIERARQUIAS DE TIPOS
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 fazlo.
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
herdeira. Os atributos e mtodos da classe pai so classificados quanto ao
encapsulamento. A parte sombreada significa no visvel, encapsulado.
*As duas so consideradas como sendo do mesmo package.
PUBLIC
PRIVATE
PROTECTED
PACKAGE*
Construtores e herana:
No construtor de uma classe filha o programador pode incluir a chamada do construtor da
classe pai existente nela. Para referenciar a classe pai use a keyword super de modo analogo a
this (objeto corrente).
Hierarquia de generalizao e especializao.
//Classe Ponto
class Ponto {
private float x,y;
public Ponto(float ax,float ay) //omita o valor de retorno!
81
this.altera_y(retorna_y()+dy);
}
}
//Classe PtoReflete
class PtoReflete extends Ponto {
//adicione algum atributo private se quiser
public PtoReflete(float a, float b)
//construtor
{
super(a,b); //chamada de construtor da classe pai ou superclasse
}
void reflete()
//troca o sinal das coordenadas
{
this.altera_x(-retorna_x());
this.altera_y(-retorna_y());
}
}
//Classe principal, Arquivo Principal.java
class Principal {
public static void main(String args[]) {
PtoReflete p1=new PtoReflete(3.14f,2.72f);
System.out.println("Criando PontoReflete em 3.14,2.72");
p1.reflete();
System.out.println("Refletindo este ponto.");
p1.mostra();
PtoMove p2=new PtoMove(1.0f,1.0f);
System.out.println("Criando PontoMove em 1.0,1.0");
p2.move(.5f,.5f);
System.out.println("Movendo este ponto de 0.5,0.5");
p2.mostra();
}
}
Criando PontoReflete em 3.14,2.72
Refletindo este ponto.
(-3.14,-2.72)
Criando PontoMove em 1.0,1.0
Movendo este ponto de 0.5,0.5
83
(1.5,1.5)
//COMENTARIOS
Os atributos x e y da classe Ponto esto declarados como private. Pelo diagrama anterior ao
programa, atributos private no so visveis aos descendentes na hierarquia. E de fato ns
alteramos esses atributos (reflete e move) atravs de chamadas a mtodos public da classe pai,
chamadas de mtodos que impliquem em acesso indireto a atributos da mesma classe parecem ser
um pouco ineficientes. Lembre-se que os mtodos public sempre so visveis.
Nota aos programadores C++:
Java no permite herana private, a clausula extends equivale a herana pblica de C++ e
s. Para obter o efeito de herana private use agregao.
Exerccios:
1Programe e teste a hierarquia representada abaixo:
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
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.
84
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
Java)
PRIVATE
PROTECTED
PACKAGE
PUBLIC
PRIVATE
PROTECTED
PACKAGE
PUBLIC
}
86
REPRESENTAO
Representao no diagrama:
prpria classe escura.
LIMITE DE VISIBILIDADE
a Este o nvel de encapsulamento mais restritivo.
A visibilidade das declaraes limita-se ao
envoltrio da classe.
3) protected Representao no diagrama:
A visibilidade das declaraes se limita prpria
a hierarquia abaixo da classe escura. classe e as classes herdeiras dela.
2)Nada
Representao no diagrama:
A visibilidade das declaraes se limita a prpria
especificado retngulo envolvendo as classes classe e as classes do mesmo package, mas no s
package
pintadas.
classes herdeiras, . Classes herdeiras no precisam
ser do mesmo package.
1 )public
Representao no diagrama:
Estas declaraes so sempre acessveis.
todas as classes.
87
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.
2.1.3. REDEFINIO DE MTODOS HERDADOS
Uma classe filha pode fornecer uma outra implementao para um mtodo herdado,
caracterizando uma redefinio overriding de mtodo. Importante: o mtodo deve ter a mesma
assinatura (nome, argumentos e valor de retorno), seno no se trata de uma redefinio e sim
sobrecarga overloading. A redefinio garante que o mtodo ter o mesmo comportamento que o
anterior isto faz com que as subclasses possam ser atribudas a variveis da superclasse pois
atendem a todas as operaes desta.
Este exemplo igual ao exemplo anterior, mas agora redefinindo o mtodo mostra para a
classe filha PtoReflete. Na verdade este exemplo deveria pertencer ao tpico de polimorfismo,
contudo, nos exemplos seguintes usaremos tambm redefinies de mtodos, portanto faz-se
necessrio introduzi-lo agora. Teremos mais explicaes sobre o assunto.
No nosso exemplo a classe PtoReflete redefine o mtodo mostra da classe pai, enquanto que
a classe herdeira PtoMove aceita a definio do mtodo mostra dada pela classe Ponto que sua
classe pai.
//Classe PtoReflete
88
Exerccios:
1Teste redefinio de mtodos
como:
Herana mltipla:
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.
Interfaces
public interface Imprimivel { //alem das classes, so interfaces pode ocupar um arquivo
final char nlin='\n'; //nova linha
public String toString();
//forma preferida para impressao na tela
public void toSystemOut();
}
public class Produto implements Imprimivel {
//um produto comercial qualquer
protected String descricao;
protected int quantidade;
public Produto(String d,int q)
{
descricao=d;
quantidade=q;
}
90
//COMENTARIOS
O paradigma de orientao a objetos est refletido na capacidade de herana e
encapsulamento das interfaces. No caso deste exemplo, a interface foi declarada como public, mas
se nada fosse especificado ela pertenceria ao package dela, ou seja os modos de encapsulamentos
so semelhantes aos de classes.
Uma interface poderia estender a interface Imprimivel:
interface Imprimivel2 extends Imprimivel {
}
Interfaces tem sido representadas por retngulos de bordas arredondadas ligadas as classes que
as implementam por linhas tracejadas.
Muitos confundem interfaces com classes e o ato de implementar uma interface com o ato de
estender ou herdar uma classe. Por isso a relao entre interfaces e herana ser explicada s agora,
depois que voc j pensou no assunto.
Uma classe Produto2 herda da classe Produto(nosso exemplo) que implementa a interface
Imprimivel. A classe produto j fez a parte difcil que implementar a interface, agora a classe
91
Produto2 pode optar por aceitar ou redefinir os mtodos herdados, ou seja: A interface um dos
tems que herdado de uma classe, assim como os atributos e mtodos.
Exerccios:
1Defina uma interface para um conjunto de classes que representam figuras geomtricas que
podem ser desenhadas na tela.
92
3.
Este exemplo j foi apresentado em 2.1.3. Tambm trata-se de um polimorfismo, pode ser
classificado como polimorfismo de incluso. Um mtodo uma redefinio de um mtodo
herdado, quando est definido em uma classe construda atravs de herana e possui o mesmo
nome, valor de retorno e argumentos de um mtodo herdado da classe pai. A assinatura do mtodo
tem que ser idntica, ou seja, teremos redefinio quando uma classe filha fornece apenas uma
nova implementao para o mtodo herdado e no um novo mtodo.
Se a classe filha fornecer um mtodo de cabealho ou assinatura parecida com a do mtodo
herdado (difere ou no nmero ou no tipo dos argumentos, ou ento no tipo do valor de retorno)
ento no se trata mais de redefinio, trata-se de uma sobrecarga, pois criou-se um novo mtodo.
Uma chamada ao mtodo herdado no mais interceptada por esse novo mtodo de mesmo nome.
O mtodo tem o mesmo nome, mas ligeiramente diferente na sua assinatura (o corpo ou bloco de
cdigo {} no importa), o que j implica que no proporciona o mesmo comportamento
(behaviour) do mtodo da superclasse.
3.2.
Este tipo de polimorfismo permite a existncia de vrios mtodos de mesmo nome, porm
com assinaturas levemente diferentes ou seja variando no nmero e tipo de argumentos e no valor
de retorno. Ficaria a cargo do compilador escolher de acordo com as listas de argumentos os
procedimentos ou mtodos a serem executados.
3.2.1. SOBRECARGA DE MTODOS, COPY CONSTRUCTOR
No exemplo a seguir vamos sobrecarregar o construtor de uma classe, esta classe passar a ter
duas verses de construtores, vale lembrar que assim como o construtor ser sobrecarregado,
qualquer outro mtodo poderia ser. O compilador saber qual mtodo chamar no mais pelo nome,
mas pelos argumentos.
O mtodo Ponto(Ponto ap); um copy constructor, pois tem o mesmo nome que
Ponto(float dx,float dy);. Tal duplicao de nomes pode parecer estranha, porm Java permite
que eles coexistam para uma mesma classe porque no tem a mesma assinatura
(nome+argumentos). Isto se chama sobrecarga de mtodo, o compilador sabe distinguir entre esses
dois construtores. Outros mtodos, no s construtores podero ser sobrecarregados para vrios
argumentos diferentes, esse recurso um polimorfismo do tipo ad-hoc.
93
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());
}
}
Esta e' a fracao a: (5/1)
Esta e' a fracao b: (1/3)
c de a+b: (16/3)
a*b: (5/3)
a+b: (16/3)
a>=b: true
a==b: false
a!=b: true
(int)a 5
(double)a 5
Teste o copy constructor para o tipo abstrato de dados frao apresentado acima. Quando
um s nmero for passado para o construtor desta classe, subentende-se que o construtor chamado
o de um s argumento inteiro e que portanto o denominador ser igual a 1.
Agora vamos falar do copy constructor, que embora implementado, no foi testado em
main() . Esse mtodo, pertence a outro 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.
395
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.
3.2.2.
SOBRECARGA DE OPERADOR
Em um dos exerccios anteriores (no tpico sobre herana) pedamos que voc definisse uma
hierarquia composta de trs classes. A classe pai tinha o nome de Forma, e as classes herdeiras
desta eram Ponto e Retangulo. Embora a classe forma no possusse sentido prtico, ela permitia
certas operaes como move, altera_x(int nx), entre outras (retorne a este exerccio).
Na verdade o que desejvamos era que esta classe Forma se comportasse como um esqueleto
para as suas classes filhas, ns no queramos instanci-la. Classes abstratas permitem exatamente
isto pois no podem ser instanciadas embora possam ser usadas de outras maneiras.
Classes abstratas so poderosas, elas permitem: criao de listas heterogneas, ocorrncia de
dynamic binding e maior clareza no projeto de sistemas. Os packages que vem com a linguagem
esto repletos de exemplos de classes abstratas.
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.
Classes abstratas
//Classe Forma
abstract class Forma {
96
//Classe Retangulo
class Retangulo extends Forma {
protected float dx,dy; //delta x e delta y
//protected acaba sendo menos inflexivel e mais eficiente que private
public Retangulo(float ax,float ay,float dx,float dy)
//garante o estado do objeto
{
x=ax; y=ay;
this.dx=dx; this.dy=dy; //this usado para eliminar ambiguidade
}
//metodo move precisa ser redefinido
public void move(float dx,float dy)
{
this.x+=dx; this.y+=dy;
this.dx+=dx; this.dy+=dy; //this distingue o argumento do atributo de mesmo nome
97
}
public void mostra()
{
System.out.println("("+this.x+","+this.y+")("+dx+","+dy+")");
}
}
//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.
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:
1Defina 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.
98
(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).
(Uma tarefa desagradvel quando iterando sobre vetores manter os ndices das iteraes atualizados durante avanos e
retrocessos. Note que retrocessos no fariam sentido em uma lista simplesmente ligada, por isso essa operao somente
definida neste nvel da hierarquia.)
//Classe IteradorI
abstract class IteradorI {
abstract public void comeca();
abstract public int retorna(); //metodos abstrato
abstract public void atribui(int a);
abstract public boolean fim();
}
//Classe IteradorVetorI
class IteradorVetorI extends IteradorI {
protected int[] vet; //itero sobre ele
private int conta; //posicao atual da iteracao
99
class Principal {
public static void main(String args[]) {
int[] vet=new int[6];
vet[0]=0; vet[1]=1; vet[2]=2; vet[3]=3; vet[4]=4; vet[5]=5;
IteradorVetorI mit=new IteradorVetorI(vet);
char o; //o=opcao,
int e; //temporario
String line; //linha a ser lida do teclado
DataInputStream meuDataInputStream=new DataInputStream(System.in);
try{
do
{
do { o=meuDataInputStream.readLine().charAt(0); }
while (o=='\n');
switch (o) {
case 'a': //atribui
line=meuDataInputStream.readLine();
try {
e=Integer.valueOf(line).intValue();
mit.atribui(e);
}
catch (Exception erro) {
System.out.println("Entrada invalida!");
}
break;
case 'r': //retorna
e=mit.retorna();
System.out.println(e);
break;
case 'f': //frente
mit.avanca();
break;
case 't': //tras
mit.retrocede();
break;
case 'c': //comeca iteracao?
mit.comeca();
break;
case 'e': //fim da iteracao?
System.out.println(mit.fim());
break;
case 'v': //valor atual
101
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
Exerccios:
1Defina 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.
102
Pense como fazer a classe ArrayServices trabalhar em conjunto com a classe Iterador vetor.
No confunda estas duas classes, elas executam tarefas distintas.
de
objeto da classe pai, porque os mtodos definidos para variveis desta classe passam a no fazer
sentido para o objeto contido nesta varivel.
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.
3.3.2.1.UM EXEMPLO ESCLARECEDOR
O exemplo a seguir cria dois objetos (pai e filho) e faz atribuies e chamadas de mtodos
entre eles.
//Classe SuperClasse
class SuperClasse {
public void nome()
{
System.out.println("Metodo da superclasse");
}
}
//Classe SubClasse
class SubClasse extends SuperClasse {
public int novoatributo;
public void nome() //redefinicao
{
System.out.println("Metodo da subclasse");
}
public void novometodo()
{
System.out.println("Novo metodo:"+novoatributo);
}
}
//Classe principal, Arquivo Principal.java
class Principal {
public static void main(String args[]) {
SubClasse esub1=new SubClasse();
104
} //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.
3.3.2.2.O QUE ACONTECE COM O QUE FOI ACRESCENTADO
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.
esub1.novometodo();
} //main method
} //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.
Exerccios:
1Implemente 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.
2-
Modele e implemente uma hierarquia de CONTAS BANCRIAS, use os recursos que achar
conveniente: classes abstratas, interfaces, variveis static. Voc deve definir classes semelhantes as
contas bancrias como poupana, conta corrente, etc. Os mtodos devem ter nomes como deposita,
saca, computa, etc.
3.3.3. LISTA HETEROGNEA DE FORMAS (geomtricas)
Este exemplo lida com um vetor de objetos da classe forma definida em 3.3classes abstratas e
, estes objetos so retngulos, pontos, etc. O objetivo mostrar: subclasses contidas em
variveis (posies de vetor) da superclasse e acoplamento dinmico de mensagens.
O nosso vetor de formas conter objetos grficos de classes heterogneas. Trataremos todos
de maneira uniforme, chamando os mtodos mostra e move. Voc j viu nos exemplos anteriores
como recuperar o objeto em uma varivel de sua prpria classe e no superclasse.
concretas
108
4.
CONCEITOS AVANADOS
ATRIBUTOS STATIC
At o momento s havamos aprendido como definir atributos de instncia. Cada objeto tinha
seus prprios atributos e uma modificao nos atributos de um objeto no afetava os atributos de
outros objetos.
Neste tpico iremos apreender como definir atributos de classe. Esses atributos so os
mesmos para todos os objetos, eles so compartilhados. Uma mudana em um destes atributos
visvel por todos os objetos instanciados. Atributos de classe tambm so chamados de atributos
static.
Neste exemplo definiremos uma classe robo que usa atributos static para saber quantos
robos foram criados (instanciados). Um outro uso de atributos static seria usar uma estrutura de
dados que permitisse que um robo saber a posio(coordenadas) dos demais objetos de sua classe.
//Classe Robo
class Robo {
public
int x;
public
int y;
public static int quantos; //quantos foram instanciados
public Robo(int ax,int ay)
{
x=ax; y=ay;
quantos++;
}
}
//Classe principal, Arquivo Principal.java
class Principal {
109
} //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.
4.2.
MTODOS STATIC
Mtodos static tambm so chamados de mtodos de classes. Estes mtodos s podem operar
sobre atributos de classes. Nos j vnhamos usando estes mtodos. Existem exemplos de chamadas
de mtodos static em nossos programas anteriores porque as packages da linguagem so repletas de
exemplos de mtodos static. Por este motivo eu escolhi uma das definies de mtodos static da
Java API (Sun Microsystems) para transcrever:
abs(double). Static method in class java.lang.Math
Returns the absolute double value of a.
Neste tpico no mostraremos um exemplo propriamente dito, apenas mostraremos como
definir um mtodo static, portanto importante que voc faa os exerccios.
Mtodos static so definidos assim como atributos static:
public static int MDC(int a,int b) { //maximo divisor comum de a e b
}
No exemplo da classe Fracao (1.6.1tad frao), tivemos que lidar com o mtodo mdc. Este
mtodo no fazia muito sentido para o usurio desta classe, embora fosse necessrio para fazer
certas operaes que envolviam simplificao de frao. Naquele momento nossa opo foi por
implementar o mtodo como private na prpria classe Fracao. Algum rigoroso poderia ter dito:
Voc est errado, mdc no tem nada a ver com Fracao e eu vou implement-lo em uma classe
separada chamada ServicosMatematicos. A minha resposta a esta afirmao seria: Acho sua
idia boa, mas sem o uso de mtodos static na classe ServicosMatematicos, voc vai ter que
110
declarar um objeto da classe ServicosMatematicos dentro de cada Fracao para poder usar o
mtodo mdc.
Exerccios:
1Defina uma classe com mtodos static que permite clculos matemticos como MDC,
FATORIAL, COMBINAES(n,k), PERMUTAES, etc.
*2-
Existe uma linguagem de programao chamada Logo que muito usada no Brasil em escolas
de primeiro e segundo grau. Nesta linguagem voc pode programar os movimentos na tela de uma
tartaruguinha ou cursor. Este cursor descreve movimentos riscando ou no a tela, dentre os
movimentos descritos esto crculos, quadrados e sequncias repetitivas (loops). Modifique seu
objeto robo para apresentar alguns desses recursos. Crie ento um programa que l de um arquivo
texto instrues para este objeto robo executar movimentos na tela.
Logo foi criada por um cientista de computao do MIT.
3Voc 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.
4Em alguma classe que voc criou anteriormente defina variveis static com o seguinte
objetivo: Contar, fazer estatsticas das chamadas de mtodos da classe.
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.
4.3.
TRATAMENTO DE EXCEES
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:
Acesso a ndice invlido do vetor sem corromper o sistema, programadores C pasmem!
//Classe principal, Arquivo Principal.java
class Principal {
public static void main(String args[]) {
int a[]=new int[4];
try {
a[4]=10;
//linha acima gera excecao, os indices validos sao quatro:0,1,2,3
//qualquer codigo escrito aqui (depois de a[4]=10;)
//nunca sera executado
}
catch(Exception ae) {
//refaz a pergunta do indice a alterar ao usuario
//e descrobre que ele queria alterar o valor no indice 3, escrevendo 12
a[3]=12;
}
System.out.println(a[3]);
}
}
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
113
}
finally {
arquivo.close();
}
finally tem sido usado para fechar arquivos, parar threads e descartar janelas.
Exerccios:
1Em 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.
4.3.2. GERANDO SUAS PRPRIAS EXCEES
O exemplo a seguir ensina como trabalhar com throw, a palavra chave usada para levantar
excees. Este exemplo se baseia na classe Fracao de 1.6.1 tad frao. 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.
public class DivisaoPorZero extends Exception
{
public String info;
public DivisaoPorZero(String i)
{
info=i;
}
}
Voc deve modificar a classe Fracao apresentada anteriormente na pgina 65, para aceitar o
seguinte mtodo:
public Fracao divisao(Fracao j) throws DivisaoPorZero
{
Fracao g;
if (j.den==0) throw new DivisaoPorZero("Na classe Fracao");
//se for zero a execucao nao chega aqui
g=new Fracao(num*j.den,den*j.num);
return g;
}
class Principal {
public static void main(String args[])
{
Fracao a,b,c;
114
a=new Fracao(5,3);
b=new Fracao(2,0);
System.out.print("Esta e' a fracao a: ");
a.mostra();
System.out.print("Esta e' a fracao b: ");
b.mostra();
try {
c=a.divisao(b);
c.mostra();
}
catch(DivisaoPorZero minhaexcecao)
{
System.out.println("Nao posso dividir por zero");
}
}
}
Esta e' a fracao a: (5/3)
Esta e' a fracao b: (1/0)
Nao posso dividir por zero
//COMENTARIOS
Ns no apresentamos um exemplo de uma exceo propagando em uma cadeia longa de
chamadas de mtodos. Mas com os conhecimentos dados, voc pode fazer isso.
Outro fato importante que um bloco catch tambm pode gerar excees, assim se voc
pegou uma exceo e resolveu que no consegue trat-la voc pode fazer um throw dela mesma ou
mudar a classe da exceo e continuar propagando (throw de outra exceo), ou fazer o que voc
pode para reparar o erro e jogar uma exceo para que o que voc fez seja completado por outros
mtodos. Lembre-se que se voc pegou uma exceo, ela para de propagar.
Exerccios:
1Implemente, tratamento de excees completo para o exemplo de 1.6.1 tad frao. 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
mais de uma aplicao ao mesmo tempo enquanto que threads permitem que sua aplicao execute
mais de um mtodo ao mesmo tempo.
Todos os programas que fizemos at agora s tinham um nico caminho, fio, fluxo, de
execuo. Nenhum deles executava duas coisas (dois pedaos de cdigo) simultaneamente. Grande
parte do software de qualidade escrito hoje faz uso de mais de uma linha de execuo, mais de um
thread. So os chamados programas multithreaded.
O seu browser de hipertexto consegue fazer o download de vrios arquivos ao mesmo tempo,
gerenciando as diferentes velocidades de cada servidor e ainda assim permite que voc continue
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.
4.4.1. CRIANDO THREADS USANDO INTERFACES OU HERANA
Existem duas maneiras bsicas de criar threads em Java, usando interfaces e usando herana.
Usando herana, sua classe j um thread (is a relationship), que quando tiver seu mtodo start()
chamado vai executar tudo o que estiver no mtodo run() em paralelo.
Usando interfaces, voc define uma classe cujo mtodo run() vai ser executado por um thread.
4.4.1.1.HERANA USADA PARA CRIAR THREADS
116
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.
b.start();
try {a.join(); } catch (InterruptedException ignorada) {}
try {b.join(); } catch (InterruptedException ignorada) {}
}
}
thread A
thread B
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) { }
}
}
thread A
thread B
Exerccios:
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.
119
Atributo No elementos
3
o
3
1-Consulta N elementos----4
2-Incrementa No elementos-.
4
Fila:
>-[D]-[R]-[O]->
>-[D]-[R]-[O]->
>-[D]-[R]-[O]->
>-[D]-[R]-[O]->
.
.
.
>-[D]-[R]->
>-[D]-[R]->
>-[D]-[R]->
Thread A
4
3
3
120
Thread B
.
.
-----Consulta tamanho da fila3
-----------Retira um elemento-4
---Decrementa No elementos-5
.
122
ndice remissivo:
%
%, operador de resto da diviso ......................................23; 67
=
= 17; 19
= =...................................................................................17; 19
A
Acoplamento dinmico de mensagens ................................ 104
Agregao .......................................................................36; 37
Alocao
de matrizes........................................................................ 75
de objetos.......................................................................... 18
Applets
definio ............................................................................. 6
Argumentos de linha de comando ......................................... 50
Arquivos
estrutura de ....................................................................... 17
Atribuies entre classes ..................................................... 105
Atributo................................................................................. 12
Atributos ............................................................................... 16
acesso de........................................................................... 19
de classe.......................................................................... 110
de instncia ....................................................................... 16
declarao de .................................................................... 18
disposio das declaraes de........................................... 30
encapsulamento de......................................................53; 55
Atributos e mtodos .............................................................. 22
B
Backspace caractere especial................................................. 20
Bancos de dados (curiosidade).............................................. 81
Basic ..................................................................................... 17
Blocos de cdigo................................................................... 15
boolean.................................................................................. 21
Browsers ................................................................................. 7
Busca de prades em texto.................................................... 74
byte ....................................................................................... 21
Byte-code ................................................................................ 7
C
C, dica aos programadores .................................................... 10
Capacidades da linguagem...................................................... 7
Caracteres especiais .............................................................. 20
Caracteres UNICODE........................................................... 20
Caractersticas da linguagem................................................... 7
Carriage return, caractere especial ........................................ 20
Case, ferramentas .................................................................. 11
catch.................................................................................... 113
viso geral sobre ............................................................... 49
char ....................................................................................... 20
class....................................................................................... 14
Classe
D
Data hiding............................................................................51
123
E
Eficincia.......................................................................... 9; 33
Eiffel............................................................................... 13; 15
Encapsulamento.................................................................... 51
de atributos e mtodos com packages .............................. 56
de classes.......................................................................... 60
de mtodos e atributos...................................................... 51
e herana .......................................................................... 85
e packages ........................................................................ 56
modo package .................................................................. 52
reviso final...................................................................... 88
Especializao/Generalizao............................................... 81
Euclides ................................................................................ 67
Excees
gerando-as ...................................................................... 115
tratamento de.................................................................. 113
tratando .......................................................................... 113
Expoentes em tipos nmericos ............................................. 21
F
Ferramentas case .................................................................. 11
finalizers ............................................................................... 38
float ...................................................................................... 21
Form feed caractere especial................................................. 20
Friendly, ou package, veja encapsulamento ......................... 52
Funes isoladas
ausncia de ....................................................................... 13
G
Generalizao/Especializao............................................... 81
H
Hello Internet........................................................................ 13
Herana................................................................................. 81
e construtores ................................................................... 82
e encapsulamento ............................................................. 85
e interfaces ....................................................................... 92
mltipla ............................................................................ 91
Hierarquias
de tipos............................................................................. 81
simples ............................................................................. 81
Homepage
Netscape............................................................................. 7
Sun ..................................................................................... 7
tutorial................................................................................ 5
I
Imprimindo
124
na tela ............................................................................... 19
tipos bsicos na tela.......................................................... 19
Includes ................................................................................ 18
Instncias .............................................................................. 12
int21
Interface
Imprimivel........................................................................ 91
Interfaces .............................................................................. 91
e herana .......................................................................... 92
uma alternativa para herana mltipla.............................. 91
Interfaces grficas ................................................................. 30
Interfaces X Classes Abstratas.............................................. 99
Internet e vrus...................................................................... 79
Introduo............................................................................... 5
L
Leitura
do teclado ................................................................... 46; 47
Line-feed
caractere especial.............................................................. 20
Linha de comando
argumentos de .................................................................. 50
Linha de comando, argumentos de ....................................... 50
Links, diagrama ...................................................................... 5
Lista ligada ........................................................................... 63
Listas heterogneas............................................................. 107
Logo, exerccio 2 ................................................................ 112
long....................................................................................... 21
M
Mac/Os ................................................................................... 8
main ...................................................................................... 15
Mquinas de estado .............................................................. 23
Marcas registradas .................................................................. 4
Matriz
representao linear de ..................................................... 75
Matrizes ................................................................................ 40
Mximo divisor comum........................................................ 67
MDC, Maximo divisor comum............................................. 67
Mensagens ............................................................................ 22
acoplamento dinmico de............................................... 104
Metainformao, veja static ................................................ 110
Mtodos
acesso de .......................................................................... 19
chamada de....................................................................... 24
chamando mtodos........................................................... 30
construtores ................................................................ 33; 35
de classe ................................................................. 110; 111
destrutores ........................................................................ 38
disposio das declaraes de .......................................... 30
encapsulamento de ........................................................... 53
gerenciamento de chamadas pelo compilador .................. 26
quais e como definir, exerccios 3,4,5 .............................. 27
redefinio de............................................................. 89; 94
retornando valores............................................................ 27
sintaxe de declarao de................................................... 23
sobrecarga de.................................................................... 94
static ............................................................................... 111
mtodos e atributos............................................................... 22
Modulo, resto da diviso, veja %.......................................... 67
N
Nmeros complexos, ex. 2 .................................................... 71
Nmeros racionais ................................................................ 66
O
Objetos.................................................................................. 12
alocao de ....................................................................... 18
comparao de ......................................................42; 44; 45
copia de ................................................................42; 44; 45
determinao da classe de.....................................42; 44; 45
inicializao de ................................................................. 18
OOMD Object Oriented Modeling and Design .................... 11
Operador
sobrecarga de .................................................................... 97
Operadores
sobrecarga de .................................................................... 94
Ordenao, ex. 3 ................................................................... 80
Orientao a objetos.............................................................. 10
P
Package
Geometria ......................................................................... 57
Packages..........................................................................56; 60
e encapsulamento de classes ............................................. 60
e estruturas de diretrios................................................... 56
viso geral sobre .........................................................47; 48
Pascal .................................................................................... 31
comparao com ............................................................... 29
Plataformas ............................................................................. 7
Pointers ................................................................................. 39
Polimorfismo ........................................................................ 94
de incluso................................................................94; 107
Ponteiros ............................................................................... 39
Ponto flutuante...................................................................... 21
private .............................................................................52; 53
e herana........................................................................... 85
Procedimentos....................................................................... 32
ausncia de ....................................................................... 13
Programa, Comparao ......................................................... 31
protected .........................................................................52; 85
public ........................................................................52; 53; 55
R
Raiz quadrada ....................................................................... 36
Redefinio de mtodos herdados......................................... 89
Referncias............................................................................ 39
passagem por .................................................................... 39
Resultados do programas diagrama......................................... 6
S
Segurana, Caractersticas da linguagem ................................ 8
Seno ...................................................................................... 36
Shopping List Approach ....................................................... 66
para a classe Matriz2DInt ................................................. 75
short ......................................................................................21
Sistemas distribudos...............................................................9
Sobrecarga.......................................................................94; 97
Solaris .....................................................................................7
static ....................................................................................110
Streams
viso geral sobre ...............................................................48
Streams, viso geral sobre.....................................................47
String.....................................................................................34
matching ...........................................................................74
StringBuffer ..........................................................................74
Strings
converso de .....................................................................49
definio de.......................................................................72
Subclasses, Superclasses e comportamento.........................105
Sun ..........................................................................................4
System.in...............................................................................47
T
Tabulao caractere especial .................................................20
TAD ......................................................................................65
Fracao ...............................................................................66
Teclado
lendo do ......................................................................46; 47
Texto
veja Strings .......................................................................72
this.........................................................................................24
Threads....................................................................................8
Tipo
char ...................................................................................20
Tipo abstrato de dados ..........................................................65
Tipos bsicos.........................................................................20
Tratamento de excees ......................................................113
try ........................................................................................113
viso geral sobre ...............................................................49
type cast ................................................................................21
e classes ..........................................................................106
U
UNICODE.............................................................................20
V
Valores literais ......................................................................20
Vetores ............................................................................40; 41
comprimento de (lenght)...................................................50
Vdeo
escrevendo no ...................................................................19
Vrus
de computador ..................................................................79
void .......................................................................................15
Volumes I, II, III .....................................................................6
W
Windows .................................................................................7
wrappers..........................................................................40; 50
125
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
[6]Harold Elliotte Rusty, Brewing Java: A Tutorial, http://sunsite.unc.edu/javafaq/javatutorial.html
[7]Campione Mary, Walrath Kathy, The Java Tutorial!, Object-Oriented Programming for the Internet,
http://www.aw.com./cp/javaseries.html
126