Você está na página 1de 77

Introduo

Linguagem Java


por Christian Cleber Masdeval Braz






2
Sumrio

1 Introduo ao Java 4

1.1 Histrico da Linguagem 4
1.2 Caractersticas da Linguagem 4
1.3 Plataformas J ava 5
1.4 J ava 2 System Development Kit 5
1.5 A Mquina Virtual J ava 5
1.6 Garbage Collection 6
1.7 Produtos e Terminologias da Tecnologia J ava 7

2 Estrutura bsica de um programa 8

2.1 Princpios Bsicos da Linguagem 8
2.2 Membros de uma Classe 8
2.3 O mtodo Main 9
2.4 Modificadores de Acesso 9
2.5 Conveno de Nomes 9
2.6 Compilao e Execuo de Programas 10
2.7 Passagem de Parmetro na Linha de Comando 10

3 Variveis e Operadores 13

3.1 Nome de Variveis 13
3.2 Tipo de Dados 14
3.3 Escopo de Variveis 17
3.4 Converses Entre Tipos Primitivos de Dados 17
3.5 Operadores 18
3.6 Constantes 20

4 Controle de Fluxo 22

4.1 Comando if else 22
4.2 Comando switch 23
4.3 Comando while 23
4.4 Comando do - while 24
4.5 Comando for 24
4.6 Comando break 24
4.7 Comando continue 25

5 Mtodos 28

5.1 Modificadores de Acesso 28
5.2 Nome de Mtodos 28
5.3 Argumentos 28
5.4 Retornando Valor a Partir de um Mtodo 29
5.5 Passando Parmetros para um Mtodo 29







3
6 Classes e Objetos em Java 32

6.1 Encapsulamento 35
6.2 Criando Objetos e Acessando Dados Encapsulados 36
6.3 Construtores 37
6.4 O Ponteiro this 39

7 Mais Sobre Classes e Objetos 43

7.1 Pacotes 43
7.2 Atributos e Mtodos de Classe 44
7.3 Destrutores e o Mtodo finalize() 45

8 Herana e Polimorfismo 48

8.1 Herana 48
8.2 Polimorfismo 49
8.3 - Criao de um objeto de uma subclasse e o ponteiro super 52
8.4 Mtodos e Classes final 53

9 Estruturando o Cdigo com Classes Abstratas e Interfaces 56

9.1 Classes Abstratas 56
9.2 Interfaces 57

10 Usando Strings e Arrays 62

10.1 Strings 62
10.1.1 Operaes em Strings 63
10.1.2 Convertendo primitivos para Strings e vice-versa 64
10.1.3 A classe StringBuffer 64
10.2 Arrays 65
10.2.1 Arrays de Primitivos 65
10.2.2 Arrays de Referncias 66
10.2.3 Arrays como Objetos 66
10.2.4 Arrays e Excees 67
10.2.5 Arrays Multidimencionais 67

11 Tratamento de Excees 72

11.1 Classes de Excees 72
11.2 Tratando de Excees 73
11.2.1 Capturando Excees 73
11.2.2 Deixando uma exceo passar atravs do mtodo 75
11.2.3 Capturando uma exceo e disparando outra diferente 76





4
1 Introduo ao Java

A linguagem J ava foi desenvolvida pela Sun Microsystems em 1995. Apesar de
relativamente nova, a linguagem obteve uma espetacular aceitao por programadores
do mundo inteiro, tendo se difundido como nunca antes ocorreu com uma linguagem de
programao. Um fator que colaborou com isso, o fato da linguagem possuir
vantagens agregadas tais como: orientao a objetos, independncia de plataforma,
multitarefa, robusta, segura e distribuda. Com o advento da Internet, que tornou ainda
mais necessrio a comunicao entre plataformas heterogneas, estes fatores fizeram
com que o J ava fosse a tecnologia perfeita para este novo cenrio.

1.1 - Histrico da Linguagem

No incio da dcada de 90, um pequeno grupo de projeto da Sun pretendia criar uma
nova gerao de computadores portteis inteligentes, que pudessem se comunica entre si
de diversas formas. Para isso, decidiu-se criar uma plataforma de desenvolvimento onde
o software pudesse ser executado em diversos tipos de equipamentos. Para o
desenvolvimento desta plataforma foi escolhida a linguagem de programao C++.

A linguagem C++no permitia realizar com facilidade tudo o que o grupo pretendia.
Neste ponto, J ames Gosling, coordenador do projeto, decidiu criar uma nova linguagem
de programao que pudesse atend-los em suas necessidades.

A criao dos chips inteligentes foi abandonada devido ao alto custo de produo.
Posteriormente, a exploso da Internet no mundo todo fez surgir a necessidade de uma
tecnologia onde computadores de diferentes plataformas pudessem conversar. Surge
da, baseada na linguagem criada para o projeto de Gosling, a linguagem J ava.

1.2 Caractersticas da Linguagem

Orientada a Objetos : Paradigma atual mais utilizado na construo de softwares.
Dentre suas vantagens, podemos citar reaproveitamento de cdigo e aumento da
manutenibilidade dos sistemas assim desenvolvidos.
Simples e Robusta : J ava representa em muitos aspectos um aperfeioamento da
linguagem C++. Ela possui certas caractersticas que permitem a criao de
programas de forma mas rpida, pois tiram do programador a possibilidade de
cometer erros que so comuns de ocorrer em C++. Algumas dessas caractersticas
so o tratamento obrigatrio de excees e o gerenciamento automtico de memria.
Gerenciamento Automtico de Memria : Em J ava no existe ponteiros, isto , no
permitido ao programador acessar explicitamente uma posio de memria. J ava
automaticamente gerencia o processo de alocao e liberao de memria, ficando o
programador livre desta atividade. O mecanismo responsvel pela liberao de
memria que no est mais sendo utilizada conhecido como Garbage Collector.
Independncia de Plataforma : Um dos elementos chave da linguagem J ava a
independncia de plataforma. Um programa J ava escrito em uma plataforma pode
ser utilizado em uma outra distinta da original. Este aspecto da linguagem
geralmente referenciado como write once, run anywhere. Isto conseguido
atravs da utilizao da Java Virtual Machine (J VM) a qual roda numa plataforma
especfica e interpreta um programa J ava para cdigo de mquina especfico da
plataforma em questo. Como os programas em J ava executam sob o controle da
J VM, eles podem rodar em qualquer plataforma que possua uma disponvel.



5
Multi-threading : Um programa J ava pode conter mltiplas threads para realizar
vrias tarefas em paralelo.

1.3 Plataformas JAVA

A tecnologia J ava est organizada em trs plataformas com objetivos especficos:

Java 2 Standard Edition (J2SE): ferramentas e APIs (Application Program
Interface) essenciais para qualquer aplicao J ava (inclusive para as outras
plataformas). suficiente a utilizarmos se quisermos desenvolver aplicaes
desktop com ou sem interface grfica.
Java 2 Enterprise Edition (J2EE): ferramentas e APIs para o desenvolvimento de
aplicaes distribudas. Engloba tecnologias tais como RMI, EJ B, CORBA, J MS,
etc.
Java 2 Micro Edition (J2ME): ferramentas e APIs para o desenvolvimento de
aplicaes para aparelhos portteis (palms, celulares, eletrodomsticos).

Neste curso, ser suficiente para ns utilizarmos apenas a plataforma J 2SE, j que nosso
objetivo principal aprender a linguagem J ava.

1.4 Java 2 System Development Kit (J2SDK)

O J 2SDK corresponde ao produto disponibilizado pela SUN que implementa a
plataforma J 2SE, provendo o ambiente bsico necessrio para o desenvolvimento de
aplicaes. Ele pode ser obtido no site da SUN no endereo http://java.sun.com.

O J 2SDK consiste de:

J RE (J ava Runtime Environment): ambiente para execuo de aplicaes
Ferramentas para desenvolvimento: compilador, debugger, gerador de
documentao, empacotador J AR, etc
Conjunto de APIs e cdigo fonte das classes


1.5 A Mquina Virtual Java

O J RE um conjunto de programas que possibilita executar aplicaes J ava. O corao
do J RE a Mquina Virtual J ava ou Java Virtual Machine (J VM). a J VM que
possibilita uma das caractersticas mais impressionantes da linguagem J ava, a
portabilidade do cdigo. Vamos compreender um pouco como isso funciona

No processo de compilao, ao invs do programa ser compilado para cdigo de
mquina da plataforma que vai ser executado, o programa compilado para
bytecode
O bytecode genrico, isto , no especfico para nenhum sistema operacional em
particular
Quando um programa J ava executado, o arquivo bytecode interpretado pelo
interpretador da tecnologia java, que denominado Java Virtual Machine. Existe
uma J VM diferente para cada plataforma onde a tecnologia J ava pode ser executada
e dever existir uma instalada no computador no qual ser executado um programa
J ava. Os browsers, por exemplo, incorporam uma J VM para a execuo de applets.




6
MeuPrograma.java

=>Cdigo fonte


Compilao =>javac

MeuPrograma.class
=>Bytecode



Execuo =>java









Figura 1- Esquema de compilao e execuo de um programa em Java.

1.6 Garbage Collection

No C e C++(e em outras linguagens) o programa desenvolvido responsvel pela
alocao e desalocao da memria, o que um dos principais pontos causadores de
erros nestes programas. Em J ava, quando um objeto criado (e quase tudo em J ava
um objeto), a memria necessria alocada automaticamente para ele, pois no h
forma de se manipular a memria diretamente. Podem existir inmeras variveis no
programa referenciando um mesmo objeto e, durante o ciclo de execuo do programa,
o J ava verifica se um objeto ainda est sendo referenciado por alguma varivel e, caso
no esteja, o J ava libera automaticamente esta rea que no esta sendo utilizada. Ou
seja, quando no resta mais nenhuma referncia para um objeto, ele marcado para ser
coletado pelo garbage colletor ou coletor de lixo, que libera a memria ocupada por
ele.

O coletor de lixo executado de tempos em tempos num processo de baixa prioridade.
Quando a J VM no est realizando nenhum processamento, ela executa o coletor de lixo
que vasculha a memria em busca de algum objeto criado e no referenciado.

Quando uma grande quantidade de objetos ou objetos muito grandes no so mais
necessrios e no se quer esperar at que o coletor de lixo seja executado para liberar
essa memria, pode-se chama-lo explicitamente no programa da seguinte forma :

System.gc();





_____
_____
_____
_____
_____
_____
JVM
DOS
JVM
SCO
JVM
Win
JVM
Linux
JVM



7
1.7 Produtos e Terminologias da Tecnologia Java

Produto Descrio
J ava Virtual Machine (J VM) Interpreta arquivos .class (bytecode) para
instrues especficas de plataforma.
J ava Runtime Environment (J RE) Somente o J VM no suficiente para uma
aplicao J ava ser executada. O J RE consiste
do J VM mais ncleo de classes da
plataforma J ava e arquivos de suporte. O
J RE o que deve estar instalado para a
execuo de uma aplicao J ava.
Application Program Interface (API) Biblioteca de classes e interfaces que
auxiliam no desenvolvimento das aplicaes.
J ava Developer`s Kit (J DK) Corresponde ao nome da tecnologia J ava at
Novembro de 1999. J DK 1.1 foi a ltima
verso. composto por : J VM, J RE,
compilador, ferramentas e APIs.
J ava 2 Platform, J 2SE (Standard Edition ) o nome da tecnologia a partir de
Novembro de 1999. Corresponde ao J DK 1.2
na antiga terminologia. composto por :
J VM, J RE, compilador, ferramentas e APIs.
J avadoc Corresponde a documentao das APIs. A
ltima verso pode ser encontrada em
http://java.sun.com/j2se/1.4.2/docs/api/. A
ferramenta J avadoc auxilia na criao da
documentao das classes.






8
2 Estrutura bsica de um programa

O desenvolvimento de aplicaes J ava sempre feito atravs de classes. A definio de
uma classe J ava deve respeitar a seguinte sintaxe :

<modificador de acesso>class <nome da classe>
{
<Declarao das Variveis de Instncia (Atributos)>
<Declarao de Mtodos>
public static void main( String args[] )
{
//corpo principal do programa
}
}

Exemplo 1 :
Modificador de Acesso
public class Exemplo1 Nome da Classe
{
Varivel de Instncia
String mensagem =Meu primeiro programa em J ava!;

public void Imprime_Msg()
{
//Mostra um texto na tela Definio de Mtodos
System.out.println(mensagem);
}

public static void main (String [] args)
{
Imprime_Msg(); Corpo do Programa
}
}

2.1 Princpios Bsicos da Linguagem

J ava case-sensitive
As classes, mtodos ou blocos de cdigo sempre estaro delimitados por um abrir (
{ ) e fechar ( } ) de chaves.
Um comando deve sempre ser finalizado por um ponto e vrgula ( ; )
Dois tipos de comentrio : //Comentrio de uma linha e /* Comentrio de Vrias */
Nomes de variveis, classes e mtodos devem sempre comear por letras, $ ou _

2.2 Membros de uma Classe

As variveis de instncia formam os atributos de um objeto e, juntamente com os
mtodos, so os elementos bsicos para a formao de uma classe. Eles so
denominados membros da classe.
Os atributos so espaos em memria reservados para armazenar informaes durante a
execuo da classe. Eles consistuem o estado interno de um objeto. Os atributos so
inicializados no incio da execuo da classe e ficam disponveis para utilizao por



9
todos os seus mtodos. Os mtodos por sua vez definem as operaes que podem ser
realizadas pela classe. Mais sobre atributos ser visto no captulo Variveis e
Operadores e os mtodos sero vistos em maiores detalhes no captulo Mtodos.

2.3 O Mtodo Main

Uma aplicao em J ava caracterizada por possuir o mtodo main(). A declarao do
mtodo deve ser : public static void main( String[] args ).

O mtodo main um mtodo especial pois representa o ponto de entrada para a
execuo de um programa em J ava. Quando um programa executado, o interpretador
chamar primeiramente o mtodo main da classe. ele quem controla o fluxo de
execuo do programa e executa qualquer outro mtodo necessrio para a
funcionalidade da aplicao.

Nem toda classe ter um mtodo main. Uma classe que no possui um mtodo main no
pode ser executada pois no representa um programa em J ava. Ela ser sim, utilizada
como classe utilitria para a construo de outras classes ou mesmo de um programa.

2.4 Modificadores de Acesso

A declarao de uma classe geralmente comea com o modificador de acesso public, o
que significa que pode ser acessada por qualquer outra classe. Se for omitido, a classe
ser visvel apenas por outras classes do mesmo pacote que a contm.

2.5 Conveno de Nomes

Nome de Arquivos :
O cdigo fonte de programas J ava armazenado em arquivos com extenso
.java.
Um arquivo fonte poder armazenar a definio de mais de uma classe, mas
uma boa prtica armazenar apenas uma classe por arquivo fonte.
Use o nome da classe principal do arquivo como sendo o nome do arquivo.
Quando compilamos um arquivo fonte, ser gerado um arquivo com extenso
.class para cada classe definida e com o mesmo nome da classe. O arquivo .class
contm o bytecode gerado com a compilao.
Exemplos : Cliente.java , ItemEstoque.java
Nome de Classes : Utilize substantivos ou frases substantivas descritivas para nome
de classes. Deixe maiscula a primeira letra de cada substantivo que compe o
nome, por exemplo : MyFirstClassName
Nome de Mtodos : Use verbos para nome de mtodos. Faa a primeira letra do
nome minscula com cada letra inicial interna maiscula. Por exemplo :
getUserName()
Nome de Variveis : Escolha nomes que indiquem o uso pretendido da varivel.
Utilize a primeira letra do nome minscula e a inicial das outras palavras que
formam o nome maiscula. Exemplos : customerName, customerCreditLimit






10
2.6 Compilao e Execuo de Programas

Para compilarmos e executarmos um programa J ava necessrio que a mquina possua
o J 2SE instalado.

Para compilarmos um programa na linha de comando, fazemos:

prompt>javac Exemplo1.java
- Sada do Compilador
prompt>

Se no ocorrer nenhum erro de compilao aps a execuo do comando, ser gerado o
arquivo Exemplo1.class. Para o executarmos fazemos :

prompt>java Exemplo1 Perceba que omiti-se a extenso .class
Meu primeiro programa em J ava!
prompt>

Isto ir chamar a J VM que carregar o arquivo Exemplo1.class e tentar chamar seu
mtodo main (). Se o Exemplo1.class chama mtodos em outras classes, a J VM
carregar estas outras classes somente quando for necessrio.

2.7 - Passagem de Parmetros na Linha de Comando

Aplicaes J ava permitem que se passe parmetros atravs da linha de comando. Os
parmetros so separados por espaos em branco. Para passar um parmetro que contm
ele prprio espaos em branco deve-se coloc-lo entre aspas duplas.

Os parmetros so passados para as aplicaes atravs do vetor de strings do mtodo
main. Atravs do mtodo length pode-se verificar o nmero de parmetros passados. O
acesso feito indicando-se a posio no array, sempre iniciando em 0.

Exemplo 2 :

class ParametroLinhaComando
{
public static void main( String [] args )
{
System.out.println(Meu nome : +args[0] +e tenho +args[1] +"
anos." );
System.out.println("Tamanho do segundo parametro : " + args[1].length() +
" Nmero de parametros : " +args.length);
}
}
A seguinte chamada a este programa

prompt>java ParametroLinhaComando Maria 18

gerar a seguinte sada :

prompt> Meu nome Maria e tenho 18 anos. Tamanho do segundo
parametro : 2 Nmero de parametros : 2



11
Exerccios :

1 Siga os passos abaixo para criar e executar sua primeira aplicao J ava. Ela possui
alguns erros do jeito que est. Tente descobrir e corrigi-los antes de compilar. Caso no
consiga, compile e tente descobrir os erros a partir da sada apresentada.

a) Abrir um editor de textos e escrever o programa

class PrimeiraApp
{
public void main( String args )
{
System.out.println(Primeira aplicao.)
}
}

b) Salvar o arquivo dando a ele o mesmo nome da classe e com a extenso .java.

c) Compilar o arquivo

prompt>javac PrimeiraApp.java

Se a compilao foi com sucesso, ela gerou um arquivo PrimeiraApp.class, que o
arquivo a ser executado.

d) Execute o programa utilizando o interpretador java

prompt>java PrimeiraApp

2 Examine o cdigo abaixo e responda as questes que seguem.

public class HelloWorld {
private int age;
private String telephone;
private String address;
public static void main (String[] args){
showMessage(Hello World!);
}
static void showMessage(String msg) {
int messageNumber =0;
int messagePriority =;
messageNumber =messageNumber +1;
System.out.println(msg + +messageNumber);
}
}



12
a) Qual o nome da classe ?
b) Quais os nomes dos mtodos ?
c) Quais os nomes dos atributos ?
d ) Quais os nomes das variveis do mtodo ?

3 Diga o que est de errado no cdigo abaixo :

class mais_erros
{
int 1_Idade;
int segundaIdade;

public void somaIdades (){
System.out.println(A soma das idades : +(1_Idade +SegundaIdade) );

public static void main (String[] args)
{
// Esta chamada de metodo ira imprimir a soma das idades na tela.
SomaIdades;
}
}



13
3 Variveis e Operadores

Uma varivel um nome simblico para uma poro de memria na qual um valor
pode ser armazenado. Toda varivel tem as seguintes caractersticas :

Deve ser declarada antes de ser utilizada;
Possui um tipo, um identificador e um escopo;
Podem ser locais, quando declaradas dentro de mtodos, ou atributos, quando
declaradas no corpo da classe;
Podem ser inicializadas;

Como J ava uma linguagem fortemente tipada, todas as variveis devem ser
declaradas antes de serem usadas. O tipo de uma varivel determina o tipo de
informao que pode ser armazenada nela. Variveis em J ava podem ser declaradas
como atributos, no corpo da classe, ou podem ser declaradas localmente em qualquer
parte da implementao de um mtodo. Variveis tambm possuem um escopo, o qual
determina onde no programa ela estar visvel e poder ser acessada.

A declarao de variveis no J ava segue a seguinte sintaxe :



tipo identificador [= valor] [, identificador [= valor]];




3.1 Nome de Variveis

O nome de uma varivel deve comear com uma letra (a-z/A-Z), um underscore ( _ ),
ou um sinal de dlar ( $ ). Os caracteres subsequentes podem incluir os dgitos de 0 a 9.
Como no existe restrio quanto ao tamanho dos nomes das variveis, recomendado
que se escolha nomes significativos e que representem a real inteno de uso para a
varivel ou constante. Resumindo :

Conveno : Escolha nomes que indiquem o uso pretendido da varivel. Utilize a
primeira letra do nome minscula e a inicial das outras palavras que formam o nome
maiscula. Exemplos : customerName, customerCreditLimit

Exemplos de nomes para variveis :

Legais Ilegais





Palavras-Chaves

Toda linguagem tem um grupo de palavras que o compilador reserva para seu prprio
uso. Essas palavras-chaves no podem ser usadas como identificadores em seus
programas. Em J ava, as palavras reservadas so :
String msg =Exemplos de
declarao de variveis ;
int umInteiro, UmInteiro;
float umFloat =0.5;
char caracter =i;
boolean flag =false;
umInteiro =90;
a item_Cost
itemCost _itemCost
item$Cost itemCost2
item#Cost item-Cost
item*Cost sem%
2itemCost



14

abstract do implements package throw
boolena double import private throws
break else *inner protected transient
byte extends instanceof public try
case final int *rest *var
*cast finally interface return void
*catch float long short volatile
char for native static while
class *future new super
*const generic null switch
continue *goto operator synchronized
default if *outer this

*os itens marcados com asterisco so para implementaes futuras da
linguagem.

3.2 Tipos de Dados

Uma varivel em J ava pode ser de um dos quatro tipos de dados : classes, interfaces,
arrays e tipos primitivos. No momento da compilao, o compilador classifica cada
varivel como uma referncia ou um valor primitivo. Uma referncia um ponteiro
para algum objeto. As classes, interfaces e os arrays so armazenados como referncias.
Os tipos primitivos so diretamente armazenados e seu tamanho fixo. O tamanho e as
caractersticas de cada tipo primitivo so consistentes entre as plataformas, no h
variaes dependentes de mquina como em C e C++, um benefcio da portabilidade do
J ava.

Tipos Primitivos de Dados

J ava possui 8 tipos primitivos onde 6 so tipos numricos, um tipo char para caracteres
e um tipo booleano.

Categoria Tipo Tamanho
Inteiro byte 8 bits
Inteiro short 16 bits
Inteiro int 32 bits
Inteiro long 64 bits
Ponto Flutuante float 32 bits
Ponto Flutuante double 64 bits
Caracter char 16 bits
Lgico boolean true / false

Inteiro

Os tipos de dados dessa categoria armazenam valores numricos inteiros, isto ,
nmeros sem casas decimais. O J ava possui 4 tipos primitivos desta categoria e o que
diferencia um do outro a sua capacidade de armazenamento.






15
Tipo Tamanho Variao
byte 8 bits -128 a +127
short 16 bits -32.768 a +32.767
int 32 bits -2.147.483.648 a +2.147.483.647
long 64 bits 9.223.372.036.854.775.808 a
9.223.372.036.854.775.807

Por default, literais
1
inteiros so de 32 bits (int) e podem ser especificados como
decimais, octais e hexadecimais. Para definir um literal como um nmero decimal, basta
atribuir um nmero decimal qualquer, como octal deve-se acrescentar um 0 no incio
do nmero e como hexadecimal um 0x ou 0X. Os octais contm os dgitos de 0-7 e os
hexadecimais os caracteres 0-9 e A-F em maisculo ou minsculo. possvel tambm
definir literais inteiros do tipo long, ou seja, com 64 bits. Para isso, basta acrescentar
um L no final do nmero. O efeito disso que, se a varivel foi definida como int, o
compilador passa a interpret-la como long.

Exemplos de literais do tipo Inteiro :
Decimal 0 1998 -23456
Octal 02 077 0123
Hexadecimal 0x0 0x2a 0X1FF
Long 365L 077L 0x1ffL

Ponto Flutuante

Os tipos de dados de ponto flutuante armazenam nmeros que possuem uma parte
decimal, isto , representam nmeros reias. Em J ava so dois os tipos dessa categoria :
float e double. O tipo float permite representar valores reais com preciso simples (32
bits) enquanto o tipo double permite representar com preciso dupla (64 bits).

Deve ser utilizado o ponto como separador de casas decimais. Quando necessrio, os
nmeros podem ser escritos em notao exponencial, usando o caracter e ou E. Por
exemplo : 4.2 * 10
6
pode ser representado por 4.2e6.

A representao de um literal com ponto flutuante , por default, considerada do tipo
double. Para representar um literal do tipo float com preciso simples (32 bits) devemos
incluir a letra F ou f no final do nmero.

Alguns exemplos de literais com ponto flutuante so : 1.0 , 4.7 , .47 , 1.22e19 (1.22 *
10
19
) , 4.6E-9 (4.6 * 10
-9
) , 6.2f , 6.21F

Caracter

O nico tipo dessa categoria o tipo char. Uma varivel do tipo char permite armazenar
apenas um caracter. Caso seja necessrio armazenar palavras ou textos dever ser
utilizado o tipo String, que no um tipo primitivo. necessrio utilizar aspas simples
para atribuir um literal para uma varivel do tipo char, por exemplo : char letra =a;


1
Enquanto variveis armazenam valores, os literais so os prprios valores. Literais podem ser usados em
qualquer parte de um programa J ava.



16
J ava utiliza o padro UNICODE para armazenar as variveis do tipo char. Nesse
padro, cada caracter ocupa 16 bits, podendo representar at 32.768 caracteres
diferentes.

Os literais dessa categoria podem representar caracteres imprimveis ou no. Abaixo
segue uma relao de alguns deles :

a-z Uma letra de a - z \r Retorno de carro
A-Z Uma letra de A- Z \b Retrocesso do cursor
\n Nova linha \u006F Valores Unicode
\ Aspas duplas \t Tabulao
\ Aspas simples

Lgico

Essa categoria tambm possui apenas um tipo de dado que o tipo boolean. Uma
varivel do tipo boolean pode armazenar apenas dois valores lgicos : true ou false. O
J ava no associa valores numricos para true e false como ocorre em outras linguagens
de programao.

Tipos de Dados Armazenados por Referncia

Os tipos podem ser primitivos ou de referncia. Os primitivos representam valores
numricos, caracteres individuais e valores booleanos. Os tipos de referncia so
representados por Classes, Interfaces e Arrays e podem ser definidos pelo usurio. A
principal diferena entre os tipos primitivos e de referncia a memria que deve ser
alocada, em tempo de execuo, para uma varivel de referncia, pois o ambiente de
execuo no sabe quanta memria ser necessria.

Na lista de tipos primitivos no encontramos um para tratar de strings de caracteres, isto
porque em J ava strings so manipuladas atravs de uma classe especfica para isso, a
classe String. Veremos mais sobre ela posteriormente.

Todo programa em J ava possui dois tipos de memria : principal (stack) e auxiliar
(heap). Uma varivel do tipo primitivo armazena o seu contedo diretamente na
memria principal. J uma varivel do tipo referncia armazena o seu contedo na
memria auxiliar e armazena na memria principal apenas o endereo onde foi
armazenado o contedo da varivel. Abaixo segue uma representao grfica desse
esquema :
Memria Stack Memria Heap

(Tipo Primitivo)Var1


(Tipo Referncia) Var2








valor
endereo
valor(es)



17
3.3 Escopo de Variveis

O escopo de uma varivel o bloco de cdigo dentro do qual ela acessvel e
determina quando a varivel criada e destruda. O bloco determinado por { e }.

De maneira geral, uma varivel em J ava pode ser um atributo, quando declarada na
classe, ou uma varivel local a um mtodo, quando declarada dentro deste. Um atributo
pode ser acessado por qualquer mtodo de uma classe e s so destrudos quando todo o
objeto for. Uma varivel local pode ser acessada apenas dentro do mtodo onde ela foi
definida.

Mais especificamente, o escopo de uma varivel est diretamente relacionada ao bloco
onde ela est contida. Uma varivel ser visvel apenas dentro do bloco imediatamente
superior a ela. O exemplo abaixo ilustra essa regra :

void metodo ()
{ Incio do bloco de x
int x;

{ Incio do bloco de y
int y;
x =10; OK ! A varivel x est sendo acessada dentro de seu
bloco !
} Fim do bloco de y

y =20; ERRO ! A varivel y est sendo acessada fora de seu bloco !

} Fim do bloco dex

3.4 - Converses Entre Tipos Primitivos de Dados

A converso entre tipos primitivos de dados uma prtica bastante comum e necessria,
porm, deve-se ter cuidado ao efetu-la para no perder informaes e obter um
resultado no esperado.

J ava automaticamente converte um valor de um tipo numrico para outro tipo de maior
capacidade de armazenamento. Por exemplo, se tentarmos atribuir um byte para um
short, o compilador automaticamente converte o byte em short antes de realizar a
atribuio. O esquema abaixo simboliza as converses automticas :





O contrrio no verdadeiro. Para efetuarmos uma converso de um tipo maior para
outro de menor capacidade necessrio usar um mecanismo chamado type cast, caso
contrrio um erro ser lanado. Isso feito colocando-se o tipo pretendido para
converso entre parnteses em frente da expresso ou varivel. Quando fazemos isso,
foramos o compilador a realizar a converso. importante estar ciente que isto pode
resultar em perda de dados e em resultados imprevisveis. Exemplo :

byte b1 =127, b2 =127, b3;
byte
short
int
long



18
b3 =b1+b2; Erro, pois b1 +b2 resulta em 254
b3 =(byte) (b1 +b2); Est correto, mas ir ocorrer perda de informao!

A tabela abaixo apresenta um resumo das possibilidades de cast, apontando os casos
quando isso poder causar perda de dados.

Tipo Destino Tipo
Original byte short int long float double char boolean
byte C X
Short C, P C X
int C, P C, P C, P X
long C, P C, P C, P C, P C C, P X
float C, P C, P C, P C, P C, P X
double C, P C, P C, P C, P C, P C, P X
char C, P C C C C C X
boolean X X X X X X X

C Utilizar cast explcito P Perda de magnitude ou preciso X J ava no permite converso

3.5 Operadores

Operadores so caracteres especiais usados para instruir o compilador a executar uma
determinada operao em um operando.

Operador de Atribuio

Operador Nome Exemplo
= Atribuio int var1 =0, var2 =0;
var2 =var1 +10;
var1 =var2 =50;

Operadores Aritmticos

Operador Nome Exemplo Resultado
+ Adio 23+29 52
- Subtrao 29-23 6
* Multiplicao 0.5 * salario
/ Diviso 100/50 2
% Mdulo (resto da
diviso)
20%3 2

Nas operaes envolvendo byte, short ou char , estes valores so promovidos
para int antes da operao, e o resultado ser tambm um int. Exemplo :

byte b1 =1, b2 =2 , b3;
b3 =b1 +b2 Erro pois o resultado um int!
b1 =100; b2 =100;
b3 =b1 +b2; Erro pois o resultado um int!
b3 =(byte) (b1 +b2); Com o cast no apresentar erro, porm ocorrer
perda de informao. Ao invs de ter 200 em b3,
como ele um byte o valor ser 56 !



19
Se a operao envolve um long em um dos argumentos do operador, ento o
argumento do outro lado promovido para long e o resultado tambm ser um
long.

Operadores Relacionais

Operador Nome Exemplo Resultado
== Igual x ==10
!= Diferente 3 !=2 true
< Menor 10 <10 false
> Maior 10 >6 true
>= Maior ou igual 3 >=3 true
<= Menor ou igual 7 <=6 false

Operadores Lgicos

Operador Nome Exemplo Resultado
&& AND (0 <2) && ( 10 >5) true
|| OR ( 10 >11 ) || (10 <12 ) true
! NOT !( 1==4 ) true
^ XOR ( 1!=0) ^( 2<3 ) false

Atribuio Composta

Operador Nome Exemplo (x = 10;) Resultado
+= mais igual x += 10; 20
-= menos igual x -=10; 10
*= vezes igual x *=10; 100
%= mdulo igual x %=10; 0
/= dividido igual x /=10; 0

Incremento e Decremento

Operador ++incrementa de um. Ex : int var1 =4; var1++; //var1 =5
Operador -- decrementa de um Ex : int var1 =4; var1--; //var1 =3
Este decremento ou incremento pode ser feito antes ou depois da utilizao da
varivel. Colocandose antes, primeiramente ser somado/subtrado 1 da
varivel e depois ela ser utilizada. Ao contrrio, se o operador vier aps a
varivel, primeiramente ela ser utilizada na expresso e o incremento ou
decremento ser feito depois disso. Ex :
int var1 =2, var2;
var2 =var1++; //var2 vale 2
var2 =++var1; //var2 vale 3

Precedncia de Operadores

A precedncia refere-se a ordem na qual os operadores so executados. Operadores de
mesma precedncia so executados de acordo com sua associatividade. Por exemplo,
considere a seguinte linha de cdigo :




20
int j =3 * 10 % 7;

Os operadores * e % possuem a mesma precedncia e associatividade da esquerda para
direita. Assim, o * executado primeiro, produzindo o resultado 2. Se fosse colocado
um parnteses para modificar a precedncia desta forma int j =3 * (10 % 7), o
resultado final seria completamente diferente (9).

A tabela baixo mostra os operadores J ava em ordem de precedncia, onde a linha 1 tem
a mais alta precedncia. Com exceo dos operadores unrios, condicionais e o
operador de atribuio, os quais so associativos da direita para esquerda, todos os
outros operadores com a mesma precedncia so executados da esquerda para direita.

Precedncia Operador Comentrios Associatividade
1 ++ -- ! Operadores Unrios R
2 * / % Multi., Divi., Resto L
3 + - Add, Sub. L
4 << >> Shift L
5 < > <= >= Relacionais L
6 == != Igualdade L
7 & Bit/Loginal AND L
8 ^ XOR (ou exclusivo) L
9 | Bit/Logical OR L
10 && AND L
11 || OR L
12 ?: Condicional R
13 = op= Atribuio R

R =Direita L =Esquerda

3.6 Constantes

Uma constante pode tanto ser definida como um atributo de classe como uma varivel
local. Uma constante uma vez que foi declarada e atribudo um valor para a mesma, no
permitido que outra atribuio seja efetuada, ocasionando um erro de compilao caso
isso ocorra. A atribuio do valor inicial pode ser feita no momento da declarao, ou
posteriormente em outra parte do programa.

Para declarar uma varivel do tipo constante, devemos utilizar o modificador final dessa
forma :

final <tipo> <identificador> [= valor];

Declare constantes com nomes descritivos, escritos com todas as letras em maisculo.
Separe nomes internos com underscores ( _ ). Exemplos :

final double MIN_WIDTH = 100.0;
final long MAX_NUMBER_OF_TIMES;








21
Exerccios :

1 Encontre os erros nas declaraes de variveis no cdigo abaixo e os corrija.

1. byte sizeof =200;
2. short $mom =43;
3. short hello mom;
4. double old =0.1
5. double new =78;
6. boolean consequence_2 =true;
7. char maine =New England;

2 Crie um programa seguindo as orientaes abaixo. Faa tudo que pede dentro do
mtodo main.

a) Declare duas variveis para armazenar os valores de dois itens de venda. Os valores
dos dois itens devem ser 2.95 e 3.50. Pense em nomes significativos para as
variveis e tambm considere qual deve ser seu tipo.
b) Use o System.out.println() para mostrar o contedo de suas variveis. Execute o
programa e veja a sada. Apresente uma mensagem significativa como O Item 1
custa 2.95 e ... (Dica : utilize o operador +para concatenar o texto com o valor da
varivel).
c) Declare uma outra varivel para armazenar o custo total dos itens. Utilize o operador
de adio para realizar o clculo e imprima o resultado.
d) Crie uma constante para armazenar a taxa de 8.25 % que deve ser cobrada sobre o
valor total. Armazene o clculo numa varivel chamada taxaCalculada e imprima o
resultado.
e) Adicione ao valor de cada item o valor da taxa calculado. Use a menor linha de
cdigo possvel para fazer isso. Some novamente os dois valores e atribua o
resultado a uma varivel chamada novoCusto.
f) Crie uma varivel booleana chamada muitoCaro. Escreva uma assertiva lgica para
setar esta varivel para true se novoCusto for maior que 10 e para false caso
contrrio. Imprima o valor obtido em muitoCaro. (No utilize if para escrever a
assertiva.)

3 Declare uma varivel chamada Long do tipo long e a inicialize com 100. Agora
declare duas variveis do tipo int, int1 e int 2, e inicialize int1 com 200. Agora faa int2
receber int1 mais Long e explique os resultados. Arrume o cdigo para que no ocorra o
erro anterior.




22
4 Controle de Fluxo

A maioria dos programas tomam decises que afetam seu fluxo. Os comandos que
tomam essas decises so chamados de comandos de controle.

4.1 Comando if else

Sintaxe :

if ( boolean_expr )
comando1;
[else
comando2;]

Exemplo :

if ( fim ==true )
System.out.println(Trmino!);
else
System.out.println(Continuando...);

Para mais de um comando ser executado depois da declarao, utiliza-se o conceito de
blocos, delimitados por { }.

Exemplo:

if ( fim ==false ) && (cont >0){
cont ++;
System.out.println(Continuando...);
}
else {
cont =0;
System.out.println(Trmino!);
}

recomendado sempre usar blocos de comandos para facilitar a leitura e compreenso
do cdigo.

possvel tambm criar comandos if aninhados.

Exemplo :

if ( fim ==false) && (cont <0){
cont++;
}
else if (fim ==false) && (cont >0){
cont--;
}
else {
cont =0;
System.out.println(Trmino!!);
}
Expresso booleana formada pelos operadores
lgicos e relacionais. Se a expresso boolena
for verdadeira (true), executa comando1, caso
seja falsa (false), executa comando2.



23
4.2 Comando Switch

Utilizamos o comando switch para avaliar uma expresso contra vrios resultados
possveis. Aceita somente um char, byte, short ou int como sua expresso de
comparao. O valor procurado nas declaraes case que vem depois da declarao
switch e o cdigo adequado executado.

Sintaxe :

switch ( expresso ) {

case constant1 :
comando1;
break;
case constant2 :
comando2;
break;
...

[default :
comando_default;]
}

Exemplos :

switch ( cmd ){

case 0: System.out.println(Item do menu 1);
menu =++cmd;
break;
case 1: System.out.println(Item do menu 2);
menu =++cmd;
break;
case 2: System.out.println(Item do menu 3);
menu =++cmd;
break;
default: System.out.println(Comando invalido!);
}

4.3 Comando while

Implementa um loop para executar um bloco de comandos sucessivas vezes. A
expresso de comparao avaliada antes que o lao seja executado.

Sintaxe :

while ( boolean_expr ) {

comandos;

}

Deve resultar
em char, byte,
short ou int.
Quando encontra u ma opo vlida, os comandos
so executados at um break ser encontrado, o qual
transfere o controle para o comando seguinte ao
comando switch. Ou seja, se um break no
especificado ao trmino de um case, todas as
diretivas dos cases subsequentes sero executadas at
que um break seja encontrado ou o comando switch
termine.
Deve ser um
literal ou uma
constante !
Exemplo :
while ( i !=0 ){
salario =salario * 0.5;
i--;
}
Enquanto a expresso
for verdadeira o lao
ser executado



24
4.4 Comando do - while

Utilizado quando se quer que o corpo do lao seja necessariamente executado pelo
menos uma vez A expresso de comparao avaliada depois que o lao for executado.

Sintaxe:

do {
comandos;

} while ( boolean_expr );



4.5 Comando for

Comumente, um loop for possui uma parte inicial com a inicializao das variveis,
seguida por uma expresso de comparao e depois a parte final com o incremento ou
decremento das variveis do lao.

Sintaxe :

for ( inicializao; condio; iterao ) {
comandos;
}

Pode-se declarar variveis na inicializao do for.



O nico elemento realmente imprescindvel a condio. possvel construir laos
for sem a inicializao e/ou o incremento.






A inicializao e incremento podem ser feitos com mais de uma varivel. Neste caso
devem estar separados por vrgula.




4.6 Comando break

O break utilizado para transferir o controle para o final de uma construo de lao
(for, do-while, while) ou de um switch. O lao vai encerrar independentemente de seu
valor de comparao e o comando aps ele ser executado. Exemplo :



Exemplo:
do {
salario =salario * 0.5;
i--;

}while ( i !=0 );
Exemplo:
for (i =0; i <20; i ++){
salario =salario * 0.5;
}
for (int i = 0 ; i < 10 ; i++)
comando;
int 1 = 2;
for ( ; i<10 ; ){
comandos;
i++;
}
for ( i = 0, j = 10 ; i < 8 && j > 2 ; i ++, j-- )
comando;



25
int i =0;
while (true) {
System.out.println(i);
i++;
if ( i >10 ) break;
}
...

4.7 Comando continue

Quando o comando continue encontrado (somente dentro de um lao), ele pra a
execuo naquele ponto e a transfere de volta para o incio do lao para dar incio a uma
nova iterao.

Exemplo :

for (int i =-10; i<10; i++)
{
if ( i ==0 )
continue;
System.out.println(1/i); //No deve ser executado o clculo 1/0 !!
}

Abandona a iterao corrente e
salta para a prxima iterao do
lao.



26
Exerccios :

1 Identifique e corrija os erros dos cdigos abaixo :



















2 Determine o nmero de dias num ms. Voc deve usar um comando switch para
setar um inteiro com o nmero de dias no ms especificado. Por enquanto adicione todo
o cdigo no mtodo main().

a) Declare trs inteiros, um para manipular os dias (1-31), outro os meses (1-
12) e um terceiro para manipular o ano. Inicialize estas variveis com um dia
da sua escolha.
b) Imprima a data no formato dd/mm/yyyy.
c) Declare uma varivel para armazenar o nmero de dias que contm o ms
escolhido. Ento, usando o comando switch, determine o valor para esta
varivel. So 30 dias em Abril, Setembro, J unho e Novembro e 31 nos
restantes exceto para Fevereiro que tem 28 (ignore o ano bissexto).
Experimente executar o programa com diferentes valores para o ms. O que
acontece se ele for executado com um ms invlido como 13 ? Para 27 de
J aneiro de 2000 a sada deve ser algo como

27/1/2000
31 dias no ms

3 Use um lao for para mostrar datas.

a) Usando um lao for, estenda seu programa de forma que ele imprima todas
as datas entre a que voc especificou at o final daquele ms. Para 27/1/2000
a sada deve ser

27/1/2000
28/1/2000
29/1/2000
30/1/2000
31/1/2000
int x =3, y =5; 1
if (x >=0)
if (y <0)
System.out.println(y menor que x);
else
System.out.println(x negativo);
int x =7; 2
if (x =0)
System.out.println(x zero);
int x =15, y =24; 3
if ( x %2 ==0 && y%2 ==0) ;
System.out.println(x e y so pares);



27
b) Teste o programa para verificar se ele est funcionando corretamente com
vrias datas diferentes.
c) Agora o modifique para que ele imprima no mximo 10 datas. Por exemplo,
se a data for 19/1/2000 o programa deve imprimir apenas as datas 19/1/2000
at 28/1/2000. J se a data for 30/1/2000, dever ser impresso apenas
30/1/2000 e 31/1/2000.
d) Compile seu programa, corrija os erros se ocorrer algum, e teste com vrias
datas para ter certeza que est funcionando corretamente.

4 Determine se o ano especificado um ano bissexto.

a) Crie uma expresso booleana para testar se o ano bissexto. Um ano
bissexto se :

ele divisvel por 4, e
ele no divisvel por 100, ou divisvel por 400

b) Modifique o comando switch da questo 2 para tratar de anos bissexto.
Lembre-se que o ano Fevereiro tem 29 dias em anos bissextos e 28 nos
outros.
c) Compile e teste seu programa. A tabela abaixo apresenta alguns anos que so
e outros que no so bissextos para voc poder testar seu programa :

Anos Bissextos Anos no Bissextos
1996 1997
1984 2001
2000 1900
1964 1967

5 Considere que a data que voc escolheu a data de emprstimo de uma mercadoria
e que necessrio saber qual a data de devoluo da mesma. A data de devoluo a
data atual mais 3 dias.

a) Declare trs variveis para controlarem o dia , ms e ano da data de
devoluo e uma outra com a quantidade de dias de emprstimo (inicializada
com 3).
b) Crie o cdigo para calcular a adio do tempo de emprstimo com a data
escolhida. A sada deve se assemelhar a algo como :

Data do Emprstimo : 27/2/2001
Nmero de Dias : 3
Data da Devoluo : 2/3/2001

Preste ateno na sada acima. A soma de trs dias na data de emprstimo resultou na
passagem de um ms para outro. Alm disso, como o ano 2001 no bissexto e o ms
de emprstimo foi fevereiro, ao somar-se 3 dias os dias que se passaram foram : 28/2
1/2 2/3 . Voc deve estar atento tambm para :

Se o emprstimo passar de um ms para outro o ms deve ser incrementado
Se o emprstimo passar de um ano para outro o ano dever ser incrementado




28
5 Mtodos

Quando definimos um objeto num programa orientado a objetos, implementamos todo o
comportamento desse objeto em um ou mais mtodos. Um mtodo em J ava
equivalente a uma funo, subrotina ou procedimento em outras linguagens de
programao.

No existe em J ava o conceito de mtodos globais. Todos os mtodos devem sempre
ser definidos dentro de uma classe.

A sintaxe para construo de um mtodo a seguinte :

[modificador] tipo_retorno identificador ([argumentos]) {

//Corpo do mtodo

}

5.1 Modificadores de Acesso

J ava controla o acesso a atributos e mtodos atravs do uso dos modificadores de
acesso. So eles :

public : o menos restritivo de todos. Atributos e mtodos declarados como public
em uma classe podem ser acessados pelos mtodos da prpria classe, por classes
derivadas desta e por qualquer outra classe em qualquer outro pacote (veremos mais
sobre pacotes e classes derivadas posteriormente).
protected : Atributos e mtodos definidos como protected so acessveis pelos
mtodos da prpria classe e pelas classes derivadas.
private : o mais restritivo. Atributos e mtodos declarados como private s podem
ser acessados pelos mtodos da prpria classe.

Quando nenhum modificador definido (acesso do tipo package), os atributos e
mtodos podem ser acessados pelos mtodos da prpria classe, pelas classes derivadas e
por qualquer outra classe dentro do mesmo pacote.

importante destacar que esse controle no se aplica s variveis locais aos mtodos.

5.2 Nome de Mtodos

O nome de um mtodo deve comear com uma letra (a-z/A-Z), um underscore ( _ ), ou
um sinal de dlar ( $ ). Os caracteres subsequentes podem incluir os dgitos de 0 a 9.

Conveno : Use verbos para nome de mtodos. Faa a primeira letra do nome
minscula com cada letra inicial interna maiscula. Por exemplo : getUserName(),
getMaxPrice().

5.3 Argumentos

Um mtodo pode ter zero ou mais argumentos (ou parmetros).



29
Caso no tenha argumentos, necessrio informar os parnteses vazios tanto na
definio como na chamada do mtodo.
O nome do mtodo acrescido de seus parmetros denominado assinatura do
mtodo.
Cada argumento deve ser declarado como define-se uma varivel, especificando o
seu tipo e nome.
Caso seja mais de um argumento, cada declarao deve estar separada por vrgula.

Exemplos :













5.4 Retornando Valor a Partir de um Mtodo

possvel associar um valor de retorno a um mtodo. Para isso, preciso definir, na
frente do nome do mtodo, o tipo do valor a ser retornado. O tipo pode ser um primitivo
ou ento uma classe ou interface. Caso o mtodo no retorne valor algum, obrigatria
a utilizao do tipo void na assinatura do mtodo.

Exemplos :






O comando return utilizado para passar o valor requerido de volta para quem chamou
o mtodo e obrigatrio quando o tipo de retorno no void. Ele deve receber um
nico valor ou uma expresso que deve ser compatvel com o tipo de retorno
especificado para o mtodo. Quando o comando encontrado, o mtodo termina sua
execuo imediatamente, ignorando todas as instrues subsequentes. Um comando
return sem valor de retorno retorna o tipo void, mas no obrigatria sua utilizao
nestes casos.

5.5 Passando Parmetros para um Mtodo

Passando um Primitivo : Quando um valor primitivo passado na chamada de um
mtodo, uma cpia deste valor criada e atribuda para o argumento do mtodo
responsvel por receb-la. Se o mtodo mudar este valor, apenas o valor do
argumento local ao mtodo afetado. Quando o mtodo terminar sua execuo, o
public void setAge(int newAge)
{
age =newAge;
}
public void displayAge()
{
System.out.println(Age is : +age);
}
public void setUser(int newAge, String newName)
{
age =newAge;
name =newName;
}
public int getAge () {
return age;
}
public String getName () {
return name;
}



30
valor original da varivel utilizada para passar o valor primitivo na chamada do
mtodo permanecer inalterado.

int num =10;

incrementa (num); Imprimir 11

System.out.println(num : +num); Imprimir 10

Passando a Referncia de um Objeto : Quando o tipo passado para o mtodo no for
um primitivo mas sim um objeto, esse comportamento muda. Quando passamos um
objeto, uma referncia ao objeto original passada ao invs de uma cpia do objeto.
A referncia contm o endereo de memria onde est contido o objeto original e
qualquer modificao feita pelo mtodo no argumento que recebeu esta referncia
afetar tambm o objeto original.

StringBuffer texto =new StringBuffer("Texto inicial!");

System.out.println("O valor de texto : " +texto);
concatMsg(texto);
System.out.println("O valor de texto : " +texto);

















public void incrementa (int num) {
num++;
System.out.println(num : +num);
}
public void concatMsg (StringBuffer msg){

msg.append(" Esta frase foi acrescentada ao objeto dentro do mtodo!");
}
Texto inicial!
Texto inicial! Esta frase foi
acrescentada ao objeto dentro do
mtodo!
StringBuffer



31
Exerccios :

1) Digite e execute o cdigo abaixo, onde um objeto da classe String passado como
parmetro para um mtodo. Ocorreu algo de inesperado? Procure explicar o que.

public class testeMetodos{

public testeMetodos() {
}

public void concatMsg (String msg){

System.out.println("O valor de texto : " +msg.concat("Esta frase foi
acrescentada ao objeto dentro do mtodo!"));
}

public static void main(String[] args) {

testeMetodos testeMetodos1 =new testeMetodos ();

String texto =new String("Texto inicial!");
System.out.println("O valor de texto : " +texto);
testeMetodos1.concatMsg(texto);
System.out.println("O valor de texto : " +texto);

}
}







32
6 Classes e Objetos em Java

A orientao a objeto a tcnica de desenvolvimento e modelagem de sistemas que
facilita a construo de programas complexos a partir de conceitos que nos permitem
modelar o mundo real to prximo quanto possvel da viso que temos desse mundo.
Enquanto o desenvolvimento estruturado baseia suas abstraes para compreenso de
um problema nos procedimentos necessrios para sua soluo, a orientao a objetos
nos permite model-lo num nvel maior de abstrao, atravs da identificao natural
que fazemos das entidades que o compe, caracterizando-as a partir de certas
propriedades que definem seus principais aspectos estruturais e comportamentais.

Objetos so um conjunto de dados mais um conjunto de procedimentos que
representam a estrutura e o comportamento inerentes s entidades, concretas ou
abstratas, do mundo real.

Entidades concretas so aquelas que representam objetos concretos tais como um carro
ou um avio. Possuem uma coleo de atributos (material, caractersticas mecnicas,
custos, mtodos construtivos) e uma coleo de mtodos prprios que manipulam e
fornecem respostas a partir dos valores desses atributos (reaes, deslocamentos, custo
total). Alm destas, entidades no to concretas, como a representao de elementos
geomtricas num plano, por exemplo, so tratadas como objetos. Nesse caso, a estrutura
composta por atributos que constituem variveis como o nmero de lados e valores
dos ngulos internos e o comportamento ditado por mtodos que informam a rea ou
algum outro valor que servir de contribuio para a soluo de um problema
matemtico. Na Programao Orientada a Objeto (POO), nada impede que a essncia de
um objeto seja o processamento ao invs da estruturao ou vice-versa. Na verdade,
objetos podem ser, em princpio, o modelo de qualquer coisa, desde um processamento
puro at um dado puro, sendo todos, sob a tica da POO, igualmente considerados
objetos.

O paradigma da orientao a objetos prev a definio de objetos como principal
artifcio na modelagem de uma aplicao. Sendo assim, a primeira atividade a ser
executada na implementao de uma aplicao orientada a objetos a identificao dos
objetos que a compe e suas propriedades. Essa identificao sempre depende do
propsito, porque o propsito que permite determinar quais informaes sero
representadas e que operaes sero executadas pelos objetos. Em outras palavras, a
identificao de quais atributos e mtodos ter um objeto depende sempre do contexto
da aplicao, de como pretendemos usar o objeto. S tendo isso em mente podemos
levantar os atributos e mtodos relevantes ao objeto e suprimir aqueles irrelevantes para
o sistema em questo.

A classe a construo de linguagem mais comumente utilizada para implementar um
objeto em linguagens de programao orientada a objeto. Objetos com a mesma
estrutura e o mesmo comportamento pertencem a mesma classe de objetos. O conjunto
de dados de um objeto chamamos atributos e o conjunto de procedimentos de mtodos
do objeto. Uma classe, portanto, uma descrio dos atributos e dos mtodos de
determinado tipo de objeto. Em termos de programao, definir classes significa
formalizar um novo tipo de dado e todas as operaes associadas a esse tipo,
enquanto declarar objetos significa criar variveis do tipo definido.

Uma instncia um objeto gerado por uma classe. A classe apenas a representao de
um objeto enquanto a instncia de uma classe o objeto propriamente dito, com tempo



33
e espao de existncia. O contedo de um objeto, ou seu estado interno, definido por
suas variveis de instncia (atributos), sendo que dois objetos diferentes da mesma
classe podem possuir valores diferentes para seus atributos e conseqentemente
apresentarem estados internos diferentes.

Exemplo:

public class Ponto
{
double x;
double y;

void girar (int grau, Ponto ponto) {

//Cdigo para girar esse ponto em torno de outro
}
}
Ponto P1;


Estudo de Caso

Vamos analisar o problema abaixo extrado da computao grfica:

Desenhar um crculo na tela do computador. Deve ser possvel
configurar a cor que o crculo estar preenchido
bem como seu dimetro.

Dado o problema e seus requisitos, devemos proceder com a modelagem do mesmo,
isto , analisar suas caractersticas para decidir qual a melhor forma de representar a
soluo numa abordagem orientada a objetos. Vamos supor que no esteja disponvel
uma rotina que execute o que se pede. A nica coisa que sabemos como imprimir na
tela do computador uma linha dado seus pontos de origem e destino. Sendo assim,
baseado no que sabemos fazer, teremos que analisar o problema at conseguirmos
decomp-lo em estruturas mais primitivas que, quando combinadas, iro produzir uma
soluo. Os passos de raciocnio poderiam ser estes:

Deve ser possvel configurar o dimetro do crculo e o dimetro mede duas vezes o
raio.
O raio pode ser representado por uma linha cujo ponto inicial o centro do crculo e
o ponto final sua extremidade.
Uma linha formada por dois pontos, cada um com suas coordenadas (x,y) e possui
uma cor.
Uma cor definida por seus componentes RGB (Red, Green, Blue).
Bem, se sabemos pintar uma linha na tela, podemos definir o raio do crculo e ir
pintando uma linha do lado da outra, mantendo as coordenadas do centro constantes
e calculando as coordenadas da extremidade de forma que represente um grau de
distncia da linha anterior at completar 360.

De acordo com a descrio acima, podemos identificar 4 entidades com caractersticas
prprias e que so candidatas a tornarem-se objetos da nossa aplicao:

cor ponto linha circulo
Os atributos ou variveis de instncia
formam o estado interno de um objeto.
Eles definem os dados que um objeto deve
possuir.
Os mtodos representam as operaes
que um objeto pode executar. Estas
operaes podem, dentre outras coisas,
alterar o estado interno do objeto.
Aqui, estamos definindo uma varivel do tipo
Ponto. Dizemos que P1 uma instncia da
classe Ponto, isto , corresponde a um objeto
desta classe.



34
Em J ava, os dados e os mtodos pertinentes a cada uma dessas entidades poderiam ser
modelados nas seguintes classes:

public class Cor
{
double Red;
double Green;
double Blue;
}
public class Ponto
{
double x;
double y;
void girar (int grau, Ponto p) {

//Cdigo para girar o ponto em torno de outro ponto p a quantidade definida em
//grau
}
}
public class Linha
{
Ponto a;
Ponto b;
Cor color;
void imprimeLinha() {

//Cdigo para imprimir essa linha na tela
}

}
public class Crculo
{
final int GRAU =360;
Linha raio;
Cor cor;

void criaCrculo () {

raio.imprimeLinha();
for (int i =0 ; i <GRAU ; i++)
{
//gira o ponto b do raio (extremidade) i graus em relao ao ponto a (centro)
raio.b.girar(i, raio.a);
//imprime a linha resultante
raio.imprimeLinha();

}//fim for
}//fim criaCirculo
}//fim Circulo


Compoenentes
RGB da cor
Coordenadas do
ponto Mtodo que implementa o
comportamento do ponto de
saber girar em torno de
outro.
Uma classe pode (deve) ser construda a partir de
outras. A este relacionamento d-se o nome de
agregao. Neste caso, a classe Linha utiliza as
classes Ponto e Cor para compor seus atributos.
Ela tambm possui um mtodo que implementa
a operao de impresso da linha.
A classe Crculo a abstrao de mais alto nvel
desse problema. Na verdade, criamos todas as outras
classes para conseguirmos no final gerar um crculo
na tela. O fato de quebrarmos um grande objeto
(problema) em um nmero de objetos de mais baixo
nvel, consiste numa abordagem eficaz para
compreendermos problemas complexos e possibilita
freqentemente a reutilizao destes objetos na
soluo de outros problemas.
Este mtodo utiliza a Linha que
representa o raio do crculo e gera um
crculo da mesma cor da linha. A
funcionalidade do mtodo
basicamente executada por chamadas a
mtodos de outras classes,
simplificando sua implementao.



35
A classe Crculo foi composta basicamente pela agregao de outras classes que
implementam funcionalidades mais especficas. Essa abordagem bottom-up no
tratamento de um problema, onde pequenos mdulos so agrupados para gerarem outros
maiores e com funcionalidades mais complexas, facilita a implementao, aumenta a
legibilidade do cdigo e melhora em muito a manutenibilidade da aplicao.

6.1 Encapsulamento

Diferente da abordagem estruturada, onde dados e procedimentos so definidos de
forma separada na cdigo, na programao orientada a objeto os dados e procedimentos
que manipulam estes dados so definidos numa unidade nica, o objeto. Isso possibilita
uma melhor modularidade do cdigo, porm, a idia principal poder utilizar os objetos
sem ter que se conhecer sua implementao interna, que deve ficar escondida do usurio
do objeto que ir interagir com este apenas atravs de sua interface.

propriedade de se implementar dados e procedimentos correlacionados em uma
mesma entidade e de se proteger sua estrutura interna escondendo-a de observadores
externos d-se o nome de encapsulamento.

O objetivo do encapsulamento separar o usurio do objeto do programador do objeto e
seus principais benefcios so:

possibilidade de alterar a implementao de um mtodo ou a estrutura de dados
escondidos de um objeto sem afetar as aplicaes que dele se utilizam;
criao de programas mais modulares e organizados, o que possibilita um melhor
reaproveitamento do cdigo e melhor mantenabilidade da aplicao.

Via de regra, as variveis de instncia declaradas em uma definio de classe, bem
como os mtodos que executam operaes internas sobre estas variveis, se
houverem, devem ser escondidos na definio da classe. Isso feito geralmente
atravs de construes nas linguagens de programao conhecidas como modificadores
de acesso, como por exemplo o public, protected e private do J ava. Quando definimos
uma classe, recomendado (para alguns uma regra sagrada) que declaremos pblicos
apenas os mtodos da sua interface. na interface (ou protocolo) da classe que
definimos quais mensagens podemos enviar s instncias de uma classe, ou seja, quais
so as operaes que podemos solicitar que os objetos realizem. Por exemplo, na classe
Ponto acima, deveramos ter feito seus atributos protegidos e apenas o mtodo pblico:

public class Ponto
{
private double x;
private double y;

public void girar (int grau, Ponto p) {
//Cdigo para girar o ponto em
//torno de outro ponto p a quantidade
// definida em grau }
public void setX (double k) { x =k; }
public void setY (double k) { y =k; }
public double getX () { return x; }
public double getY () { return y; }
}
Os mtodos pblicos
consistuem a interface da
classe.
comum em programao orientada
a objeto definir mtodos gets e sets
que provm acesso aos dados
protegidos da classe.



36
6.2 Criando Objetos e Acessando Dados Encapsulados

Criamos objetos em J ava de forma muito similar a criao de variveis de tipos
primitivos. Se uma aplicao quisesse usar a classe Crculo, poderia declarar uma
varivel deste tipo da seguinte forma:

Crculo crculo; Como J ava case-sensitive pode-se declarar desta forma.

Esta sentena cria uma varivel crculo do tipo Crculo.

Entretanto, isso no suficiente para acessarmos os mtodos e atributos pblicos da
classe. A sentena acima somente declara uma varivel mas no cria um objeto da
classe especificada. Em J ava, objetos so criados usando o operador new da seguinte
forma:

Crculo crculo;
crculo =new Crculo();

O operador new cria uma instncia da classe e retorna a referncia do novo objeto.
Como vimos, todos os objetos em J ava so tratados atravs da referncia ao endereo de
memria onde o objeto est armazenado. O operador new realiza trs tarefas:

1. Aloca memria para o novo objeto
2. Chama um mtodo especial de inicializao da classe chamado construtor
3. Retorna a referncia para o novo objeto

importante compreender o que ocorre na declarao da varivel e na inicializao da
varivel. Quando fazemos

Crculo crculo;

reservado uma poro da memria principal do J ava (stack) para armazenar o
endereo na memria auxiliar (heap) onde o objeto ser armazenado. Como apenas com
a declarao da varivel o objeto ainda no existe, o contedo inicial dela ser o valor
nulo (null), indicando que ela ainda no se refere a nenhum objeto. Apenas aps a
inicializao

crculo =new Crculo();

que uma varivel de um tipo no primitivo estar valendo algo e atravs dela ser
possvel acessar os dados e operaes do objeto em questo.

Uma vez um objeto tendo sido criado, seus mtodos e atributos pblicos podem ser
acessados utilizando o identificador do objeto (varivel que armazena sua referncia)
atravs do operador ponto:

<identificador>.<atributo>
<identificador>.<mtodo>

A aplicao que criou o objeto Crculo acima pode solicitar ao objeto que ele se desenhe
fazendo :
crculo.criaCrculo();
null
raio;
cor;
O null um valor vlido em J ava e
permite comparaes como:

if (crculo == null)



37
6.3 Construtores

O construtor de uma classe um mtodo especial com as seguintes caractersticas:

o primeiro mtodo executado por um objeto
Deve ter o mesmo nome da classe
No pode ter um tipo de retorno
utilizado quando um objeto instanciado atravs do operador new
Na maioria das vezes declarado como public

obrigatrio uma classe conter ao menos um construtor. Se uma classe for definida
sem a presena de um, o compilador J ava ir criar automaticamente um construtor
default da seguinte forma:



Crculo() { }



Na classe Crculo no definimos nenhum mtodo construtor, mas mesmo assim
podemos criar a varivel crculo chamando o construtor default da classe.

Como os construtores so os primeiros mtodos executados por um objeto eles
geralmente so utilizados para inicializar variveis de instncia da classe, porm, nada
impede que executem qualquer operao que se queira.

Vamos alterar nossas classes acima e definir construtores para elas:

public class Cor
{
! Cor(double vermelho, double verde, double azul) {
Red =vermelho;
Grenn =verde;
Blue =azul;
}
double Red;
double Green;
double Blue;
}












O construtor default criado pelo
compilador no executa comando algum e
no possui nenhum parmetro.
Construtores no devem ter tipo de retorno.
Construtores devem ter o mesmo nome da classe.
public class Ponto
{
private double x;
private double y;
! Ponto(double p1,double p2){x =p1; y =p2;}
public void girar (int grau, Ponto p) {
//Cdigo para girar o ponto em
//torno de outro ponto p a quantidade
// definida em grau }
public void setX (double k) { x =k; }
public void setY (double k) { y =k; }
public double getX () { return x; }
public double getY () { return y; }
}
public class Linha
{
Ponto a;
Ponto b;
Cor color;
void imprimeLinha() { ... }
! Linha(Ponto ori, Ponto dest, Cor c)
{
a =ori; b =dest; color =c;
}

}



38
public class Crculo
{
final int GRAU =360;
Linha raio;
Cor cor;

! Crculo() {}

! Crculo(Ponto centro, Ponto extremidade, Cor c) {

raio =new Linha(centro, extremidade, c);
cor =c;
}

! Crculo (double x1, double y1, double x2, double y2, Cor c)
{
raio =new Linha(new Ponto(x1, y1), new Ponto(x2, y2), c);
cor =c ;
}

void criaCrculo () {

raio.imprimeLinha();
for (int i =0 ; i <GRAU ; i++)
{
//gira o ponto b do raio (extremidade) i graus em relao ao ponto a (centro)
raio.b.girar(i, raio.a);
//imprime a linha resultante
raio.imprimeLinha();

}//fim for
}//fim criaCirculo
}//fim Circulo

Dado os construtores definidos, vamos analisar as possibilidades de implementao para
se construir um crculo:

Usando o construtor Crculo(): Se quisermos criar um crculo usando o construtor
default, teremos que criar antes uma linha e uma cor e ento atribuirmos seus
valores manualmente para o crculo.









Usando o construtor Crculo(Ponto, Ponto, Cor):


Quando definimos algum construtor para a classe,
temos que implementar manualmente o construtor
default caso queiramos us-lo.
Uma classe pode ter
mais de um construtor.
Crculo crculo =new Crculo();
Cor c =new Cor (1.0, 2.0, 1.0);
Ponto p1 =new Ponto(0,0);
Ponto p2 =new Ponto(2,0);
Linha l =new Linha (p1, p2, c);
crculo.raio =l;
crculo.cor =c;
crculo.criaCrculo();
Cor c =new Cor (1.0, 2.0, 1.0);
Ponto p1 =new Ponto(0,0);
Ponto p2 =new Ponto(2,0);
Crculo crculo =new Crculo(p1,p2,c)
crculo.criaCrculo();



39
Usando o construtor Crculo(double x1, double y1, double x2, double y2, Cor c):






Definir mais de um construtor para a mesma classe fornece maior flexibilidade para sua
utilizao.

6.4 O Ponteiro this

Todos os mtodos de instncia recebem um argumento implcito chamado this, que
pode ser usado dentro do mtodo para se referir ao objeto ao qual aquele mtodo
pertence. Mas para que iramos querer um ponteiro para o prprio objeto se dentro de
um mtodo possvel acessar qualquer outro mtodo ou atributo da classe?

Existem duas situaes onde devemos usar uma referncia explcita ao this:

Quando o nome de uma varivel de instncia escondido por um argumento de um
mtodo. Por exemplo, se tivssemos criado o construtor

Crculo(Linha r)
como

Crculo (Linha raio) {
raio =raio;
cor =raio.color ;
}

a atribuio raio =raio no ia causar o efeito desejado pois onde raio aparece dentro
do mtodo est se referindo ao argumento e no a varivel de instncia. Para este
cdigo funcionar apropriadamente teramos que usar o ponteiro this da seguinte
forma:

Crculo (Linha raio) {
this.raio =raio;
cor =raio.color ;
}

Quando preciso passar uma referncia ao objeto corrente como argumento a um
outro mtodo. Vamos supor a existncia de uma classe chamada Transforma capaz
de realizar transformaes geomtricas num crculo qualquer. Vamos supor tambm
que a classe Crculo possua um mtodo chamado Duplica() para duplicar seu
tamanho e que este mtodo utiliza um objeto da classe Transforma. O cdigo de
Duplica() :
Duplica() {
Transforma t =new Transforma();
t.duplicar(this);
}
Cor c =new Cor (1.0, 2.0, 1.0);
Crculo crculo =new Crculo(0, 0, 2, 0, c);
crculo.criaCrculo();
Passa o prprio objeto como parmetro.



40
Exerccios :

1) Para iniciar a prtica deste captulo, voc deve modelar o problema descrito abaixo,
que descreve o negcio da ACME Vdeo Locadora. Sero apresentadas inmeras
informaes que ajudaro voc a determinar as classes, mtodos, atributos e
associaes que compem o negcio. Fique livre para escolher o formato que
pretende usar para comunicar o que voc encontrou.

A ACME vdeo locadora est no negcio de aluguel de vdeos e estamos interessados
neste momento em automatizar o processo de retirada das fitas. Este processo consiste
do cliente, aps ter escolhido as fitas que deseja, lev-las at o balco de retirada. O
funcionrio responsvel ir solicitar o nmero do carto de associado do cliente e depois
cadastrar os IDs dos itens que este escolheu.

Nossos clientes devem se cadastrar como associados antes de poderem efetuar qualquer
locao. Ns armazenamos informaes como nome, endereo e telefone e cada cliente
possui um ID nico que utilizar para efetuar as locaes.

Quando uma locao efetivada, damos um nmero nico para ela que ser utilizado
posteriormente para mantermos o controle da mesma. A efetivao de uma locao
possui informaes como: data de incio, o cliente que solicitou e uma lista dos itens
alugados.

Para cada item alugado controlamos a data que deve ser devolvido e a data que
realmente foi devolvido. A data de devoluo dependente de quantos dias um item
pode permanecer emprestado, sendo assim, cada item pode ter uma data diferente.

Os itens para emprstimo so atualmente apenas fitas de vdeo. Mas pretendemos alugar
em breve jogos e DVDs. Cada item para emprstimo possui as seguintes informaes:
preo do aluguel, o nmero de dias que pode permanecer emprestado, o ttulo do filme,
uma breve descrio (sinopse) e uma categoria (ao, aventura, etc).

a) Identifique as classes que compem o negcio da ACME Locadora. Escreva uma
breve descrio sobre ela para ter certeza de sua relevncia para o negcio.
b) Identifique os atributos de cada uma das novas classes. Lembre-se que um atributo
pode ser outra classe.
c) Defina alguns comportamentos para cada uma das classes.

2) A partir da anlise do exerccio anterior, provavelmente (:-)) voc vai ter chegado
nas seguintes classes, atributos e mtodos:












[0][0]
ItemAlugado
dataDevolucao
dataDevolvida
item
getPreco()
calcDataDevolucao
;;;
Item
Id
titulo
descricao
categoria
preco
numeroDias
setPreco
getPreco
...
Aluguel
numeroAluguel
dataInicio
cliente
AddItem()
...
Cliente
Id
nome
endereco
telefone
getNome()
...



41

Agora vamos iniciar a implementao da aplicao ACME Vdeo Locadora. Voc ir
criar um projeto e adicionar as classes identificadas. Estas classes formam a base para a
aplicao que ser desenvolvida no restante deste curso.

a) Abra o projeto chamado ACMEVideo que deve conter um mtodo main.

b) Crie a classe Cliente de forma que ela no contenha um mtodo main(), seja pblica
e contenha um construtor default. Adicione ento os atributos privados da classe:

int id
String nome
String endereco
String telefone

Adicione tambm mtodos pblicos para setar e pegar cada um dos atributos
privados. Utilize um padro de nome como setId, setNome, getId, getNome, etc:

void setId(int id){ this.id = id;}

No mtodo main() do projeto crie dois clientes e estipule valores para seus atributos
utilizando os mtodos pblicos da classe.

At este momento no h uma forma de apresentar o contedo de um objeto cliente.
Para remediar esta deficincia adicione classe Cliente o mtodo toString(), que
retorna uma String contendo o id, nome do cliente, endereo e telefone. Voc pode
usar o operador +para concatenar Strings. Chame este mtodo e imprima a String
de retorno usando System.out.println(...).

public String toString(){

return (atributo1 + + atributo2 ...);

}

c) Crie a classe Item como pblica, sem construtor e sem mtodo main(). Defina seus
atributos privados e mtodos para setar (setId) e ler (getId) os atributos.

int getId(){ return id;}

Os atributos desta classe so:

int id
String titulo
String descricao
String categoria
double preco
int numeroDias

Crie no mtodo main do projeto ACMEVideo alguns Itens para testar os mtodos.




42
Adicione classe um mtodo toString() que apresenta as variveis titulo, descrio
e categoria.

d) Vamos agora adicionar um outro construtor na classe Cliente. Este deve inicializar
os atributos nome, endereo e telefone do objeto.

Modifique o mtodo main() da aplicao ACMEVideo para usar o novo construtor.
Compile e teste o programa imprimindo o contedo dos objetos Cliente criados para
ter certeza que o construtor os inicializou corretamente.

e) Adicione um construtor default que no faz nada para a classe Item e tambm um
que inicialize os atributos titulo, descricao, categoria, preo e numeroDias.

Modifique novamente o mtodo main() para usar este novo construtor e teste a
aplicao como feito com a classe Cliente.




43
7 Mais Sobre Classes e Objetos

7.1 Pacotes

Um pacote uma coleo de classes que esto logicamente relacionadas. Um pacote
consiste de todas as classes J ava contidas num diretrio. Por exemplo, as classes da
aplicao ACME Vdeo que estamos desenvolvendo em nossos exerccios localizam-se
no diretrio do projeto chamado ACMEVideo e consequentemente fazem parte do
pacote ACMEVideo. O nome do pacote deve ter o mesmo nome do diretrio onde as
classes esto armazenadas e a declarao do pacote a qual uma classe pertence dever
ser feita no incio do arquivo fonte da classe da seguinte forma:

package ACMEVideo;

Como sabemos, J ava tem uma vasta biblioteca
2
de classes que podem ser utilizadas para
ajudar-nos no desenvolvimento de nossos programas. Para termos acesso a uma
biblioteca J ava em nossa aplicao devemos utilizar o comando import da seguinte
forma:

import java.util.Vector;

se quisermos utilizar apenas a classe Vector do pacote util, ou

import java.util.*;

se quisermos deixar todas as classes do pacote java.util disponveis para nossa
aplicao. O comando import deve ser especificado antes da definio de todas as
classes. O caminho java.util corresponde ao diretrio onde as classes do pacote util
foram armazenadas, colocando-se o ponto (.) para referenciar a passagem de um
diretrio para outro.

importante ter em mente que, diferentemente do C, acrescentar pacotes num programa
J ava no implica em as classes contidas neles serem carregadas dentro do programa.
Isto apenas instrui ao compilador e J VM onde procurar pelas classes que sero
necessrias para a execuo. Resumindo, inserir comandos import no degrada a
performance da aplicao.

Alm de possibilitar uma melhor organizao, os pacotes servem para o J ava
desempenhar dois controles importantes:

1. Controle de nomes de classes: Dentro de um pacote no pode haver duas classes
com o mesmo nome, porm, em pacotes diferentes, isto totalmente possvel. Se
assim no fosse, teramos que nos certificar sempre que as classes que estamos
desenvolvendo no possuem o mesmo nome de nenhuma classe em algum pacote
que estejamos utilizando. Por exemplo, possvel definirmos uma classe chamada
Vector pertencente ao pacote ACMEVideo. Se uma terceira classe X quiser utilizar
a classe Vector do pacote util e a classe Vector do pacote ACMEVideo dever

2
Pacotes so distribudos em arquivos com extenso .J AR e consistem nas APIs do
J ava.




44
especificar o nome completo dos pacotes na declarao das variveis da seguinte
forma:

class X {

java.util.Vector atributo1;
ACMEVideo.Vector atributo2;

...
}

2. Controle de acesso: Vamos recapitular os mecanismos de controle de acesso a
mtodos e atributos vistos no Captulo 5:

public: o menos restritivo de todos. Atributos e mtodos declarados como
public em uma classe podem ser acessados pelos mtodos da prpria classe, por
classes derivadas desta e por qualquer outra classe em qualquer outro pacote
(veremos mais classes derivadas posteriormente).
protected: Atributos e mtodos definidos como protected so acessveis pelos
mtodos da prpria classe e pelas classes derivadas.
private: o mais restritivo. Atributos e mtodos declarados como private s
podem ser acessados pelos mtodos da prpria classe.

Quando nenhum modificador definido (acesso do tipo package), os atributos e
mtodos podem ser acessados pelos mtodos da prpria classe, pelas classes
derivadas e por qualquer outra classe dentro do mesmo pacote.

Alm disso, existem os modificadores de acesso a classes. A declarao de uma
classe geralmente comea com o modificador de acesso public, o que significa que
pode ser acessada por qualquer outra classe. Se for omitido, a classe ser visvel
apenas por outras classes do mesmo pacote que a contm.

7.2 Atributos e Mtodos de Classe

Variveis de classe so declaradas de forma semelhante s variveis de instncia, com a
diferena de que devemos acrescentar a palavra reservada static:

static tipo identificador [= valor];

Uma varivel de classe compartilhada por todas as instncias desta classe. Por
exemplo, considerem a classe X e o trecho de cdigo que utiliza X:











class X {

public static int a =10;
...
}
X var1 =new X();
X var2 =new X();

System.out.println(var1.a); //imprime 10
var1.a =20;
System.out.println(var2.a); //imprime 20



45
Quando var1 modifica a varivel de classe a, o novo valor visvel a todos os objetos
desta classe, pois a representa a mesma posio de memria acessada por todos.

Variveis de classe no podem ser inicializadas nos construtores. Se precisarem de
inicializao, isto geralmente feito no momento da declarao da varivel.

Mtodos de classe tambm so declarados com o auxlio do modificador static:

[modificador] static tipo_retorno identificador ([argumentos]) {

//Corpo do mtodo

}

Como um mtodo de classe compartilhado por todas as instncias da classe, ele no se
refere a um objeto em particular e por isso no recebe o ponteiro implcito this. Mtodos
de classe podem acessar somente variveis de classe e outros mtodos estticos.

Uma caracterstica interessante dos mtodos estticos, bem como dos atributos, que
eles podem ser acessados mesmo sem a existncia de uma instncia da classe.










No exemplo acima, o mtodo e atributo esttico da classe X foram acessados
diretamente referenciando-se a classe, sem a necessidade de criarmos uma instncia da
mesma .

Nas bibliotecas do J ava encontramos inmeros casos de atributos e mtodos estticos.
Nosso conhecido mtodo main(), por exemplo, um mtodo esttico, que chamado
pela J VM quando uma aplicao executada. A classe Math prove mtodos de classe
que executam vrias funes matemticas, como funes trigonomtricas e logaritmos.
Um exemplo o mtodo Math.sqrt() que calcula a raiz quadrada de um nmero no
negativo. A classe System prove variveis de classe para representar o estado do sistema
inteiro. System.out uma varivel de classe que faz referncia ao objeto PrintStream,
que representa o fluxo padro de sada. O mtodo println() um mtodo de instncia da
classe PrintStream.

7.3 Destrutores e o mtodo finalize()

Em linguagens como C, uma classe pode ter um destrutor, utilizado normalmente para
liberar recursos requisitados pelo objeto, como memria alocada, arquivos abertos, etc.
J ava gerencia a memria automaticamente, ento um objeto no precisa liberar qualquer
memria alocada. Consequentemente, J ava no suporta destrutores. Ao invs disso, para
permitir a um objeto liberar outros recursos (diferentes de memria), tal como arquivos
abertos, J ava possibilita a implementao de um mtodo finalize().
class X {

public static int a =10;

static void setA(int x){ a =x; }

}
. . .

X.setA(20);
System.out.println(X.a);

. . .



46
O mtodo finalize() chamado automaticamente quando um objeto coletado, portanto
no possvel saber quando este ser chamado. Ele no possui tipo de retorno e no
assume nenhum parmetro.



47
Exerccios :

1) Dada a classe abaixo, assinale as expresses que so corretas.











2) Nesta lio iremos melhorar as classes da lio passada com os recursos que
aprendemos aqui. A classe Cliente possui dois construtores: um sem argumento e outro
que recebe o nome, endereo e telefone de um cliente como parmetro.

a) Crie uma varivel esttica e privada na classe Cliente do tipo inteiro e chamada
proximoId. Esta deve ser inicializada com zero.
b) Modifique o construtor default para que este incremente o valor desta varivel e
atribua o resultado para o atributo id do novo objeto.
c) Modifique o outro construtor para que ele chame o construtor default e desta forma
tambm inicialize o atributo id.

Obs: Em J ava, para chamarmos um mtodo construtor dentro de outro mtodo
qualquer, no podemos chamar o mtodo pelo seu nome mas sim utilizando a
sintaxe abaixo:

this (<lista de argumentos>);

d) Recompile e execute novamente a aplicao. Observe que agora o valor de id no
mais zero.
e) Qual a vantagem de se usar um atributo de classe para fazer o controle do id dos
objetos?

3) Faa as mesmas modificaes para a classe Item, porm com a varivel esttica
proximoId iniciando em 1000.



public class Filme {

private static float preco =3.50f;
private String taxa;

public static void setPreco(float novoPreco)
{
preco =novoPreco;
}
public float getPreco() {
return preco; }
Filme.setPreco(3.98f);
Filme mov1 =new Filme();
mov1.setPreco(3.98f);
float a =Filme.getPreco();
float b =mov1.getPreco();



48
8 Herana e Polimorfismo

Nas sees anteriores aprendemos sobre classes, objetos e encapsulamento, conceitos
fundamentais do paradigma da orientao a objeto. Nesta seo, abordaremos dois
outros conceitos importantes e relacionados entre si: herana e polimorfismo.

8.1 Herana

A herana a principal caracterstica de distino entre um sistema de programao
orientado a objeto e outros sistemas de programao. As classes so inseridas em uma
hierarquia de especializaes de tal forma que uma classe mais especializada herda
todas as propriedades da classe mais geral a qual subordinada na hierarquia. A classe
mais geral denominada superclasse e a classe mais especializada subclasse.

O principal benefcio da herana a reutilizao de cdigo. A herana permite ao
programador criar uma nova classe programando somente as diferenas existentes na
subclasse em relao superclasse. Isto se adequa bem a forma como compreendemos o
mundo real, no qual conseguimos identificar naturalmente estas relaes.

A fim de exemplificarmos este conceito, vamos considerar que queiramos modelar os
seres vivos pluricelulares existentes no planeta. Podemos ento comear com a classe
SerVivo abaixo:



Ela modela as caractersticas que todo ser vivo deve possuir, como a capacidade de
reproduzir-se ou a necessidade de alimentar-se. Sendo assim, a classe SerVivo define
atributos e mtodos tais como:

Atributos: Alimentos, Idade
Mtodos: Nascer, Alimentar, Respirar, Crescer, Reproduzir, Morrer

Os seres vivos por sua vez classificam-se em Animais e Vegetais, os quais possuem
caractersticas prprias que os distingue:






Analisando o problema em questo (o de modelar os seres vivos), ns naturalmente
identificamos classes que so especializaes de classes mais genricas e o conceito de
herana da orientao a objeto nos permite implementar tal situao.

Os animais e vegetais antes de tudo so seres vivos e cada subclasse herda
automaticamente os atributos e mtodos (respeitando as regras dos modificadores de
acesso) da superclasse, neste caso, a classe SerVivo. Alm disso, as subclasses podem
prover atributos e mtodos adicionais para representar suas prprias caractersticas. Por
exemplo, a classe Animal poderia definir os seguintes mtodos e atributos:

Atributos: Forma de Locomoo, Habitat, Tempo Mdio de Vida
Mtodos: Locomover
SerVivo
SerVivo
Animal Vegetal



49

A herana na programao obtida especificando-se qual superclasse a subclasse
estende. Em J ava isto feito utilizando-se a palavra chave extends:

public class SerVivo {
//Definio da classe SerVivo
}
public class Animal extends SerVivo {
//Atributos e mtodos adicionais que distinguem um Animal de um SerVivo
//qualquer
}

Em J ava, todas as classes, tanto as existentes nas APIs como as definidas pelos
programadores, automaticamente derivam de uma superclasse padro, a classe Object.
Se uma classe no especifica explicitamente uma superclasse, como o caso da classe
SerVivo, ento podemos considerar que esta deriva diretamente de Object, como se ela
tivesse sido definida como:

public class SerVivo extends Object { ... }

Alm disso, J ava permite apenas herana simples, isto , uma classe pode estender
apenas de uma nica outra classe.

Resumindo, a classe SerVivo define os atributos e mtodos que so comuns a qualquer
tipo de ser vivo. A subclasse Animal herda estes mtodos e atributos, j que Animal
um SerVivo , e tem que especificar apenas seus atributos e mtodos especficos.









8.2 Polimorfismo

O termo Polimorfismo origina-se do grego e quer dizer "o que possui vrias formas".
Em programao est relacionado possibilidade de se usar o mesmo nome para
mtodos diferentes e capacidade que o programa tem em discernir, dentre os mtodos
homnimos, aquele que deve ser executado. De maneira geral o polimorfismo permite a
criao de programas mais claros, pois elimina a necessidade de darmos nomes
diferentes para mtodos que conceitualmente fazem a mesma coisa, e tambm
programas mais flexveis, pois facilita em muito a extenso dos mesmos.

O polimorfismo pode ser de duas formas, esttico ou dinmico:

Polimorfismo Esttico: Ocorre quando na definio de uma classe criamos
mtodos com o mesmo nome porm com argumentos diferentes. Dizemos neste
caso que o mtodo est sobrecarregado (overloading). A deciso de qual mtodo
chamar tomada em tempo de compilao, baseada nos argumentos que foram
passados.
SerVivo
Alimentos, Idade

Nascer, Alimentar, Respirar,
Crescer, Reproduzir, Morrer

Animal
Habitat,
Locomoo, TMV


Locomover




50

Como exemplo de polimorfismo esttico, podemos relembrar dos vrios
construtores que criamos para a classe Crculo no Captulo 6:

Crculo() {}

Crculo(Ponto centro, Ponto extremidade, Cor c) {
raio =new Linha(centro, extremidade, c);
cor =c;
}

Crculo (double x1, double y1, double x2, double y2, Cor c)
{
raio =new Linha(new Ponto(x1, y1), new Ponto(x2, y2), c);
cor =c ;
}

Todos estes mtodos construtores possuem o mesmo nome mas devem ser diferidos
entre si pelos parmetros que recebem.

Quando num programa fazemos

Crculo circulo =new Crculo(linha);

o compilador consegue decidir em tempo de compilao qual mtodo chamar, neste
caso, o mtodo Crculo que recebe uma linha como parmetro.

Polimorfismo Dinmico: Esta associado com o conceito de herana e ocorre
quando uma subclasse redefine um mtodo existente na superclasse. Dizemos neste
caso que o mtodo foi sobreescrito (overriding) na subclasse. A deciso de qual
mtodo executar tomada somente em tempo de execuo, como veremos mais
adiante.

O polimorfismo dinmico ocorre quando uma subclasse redefine um mtodo de sua
superclasse a fim de prover ao mtodo um comportamento mais adequado s suas
caractersticas. Vamos rever a classe animal conforme a definimos acima

class Animal extends SerVivo{

String formaLocomoo;
String habitat;
int tempoMdioVida;

public void locomover() { ... }

}

Como nem todo ser ser vivo nasce, cresce, alimenta-se, respira, se reproduz e morre
da mesma maneira, razovel que queiramos redefinir todos estes mtodos na
classe animal





51
class Animal extends SerVivo{

String formaLocomoo;
String habitat;
int tempoMdioVida;

public void locomover() { ... }
public void nascer() { ... }
public void crescer() { ... }
public void alimentar() { ... }
public void respirar() { ... }
public Animal reproduzir() { ... }
public morrer() { ... }

}

Os mtodos na subclasse devem ser definidos com a mesma assinatura do
mtodo na superclasse, isto , com o mesmo nome, tipo de retorno e argumentos.

Bem, mas a vantagem do polimorfismo dinmico no apenas a de permitir maior
flexibilidade na modelagem das classes de objetos. Para entendermos o que h de
mais fantstico nele, temos que nos atentar para o seguinte:

. . .

SerVivo x; Declara uma varivel x do tipo SerVivo
Animal y =new Animal(); Declara e inicializa uma varivel y do tipo Animal
x =y;

. . .



Tendo isto em mente, poderamos definir um mtodo da seguinte forma

void analisaSerVivo (SerVivo ser) {
//Este mtodo faz a anlise clnica de qualquer SerVivo e para isso precisa pedir
//ao animal que respire

ser.respirar();
. . .
}

e num determinado momento cham-lo desta maneira
. . .
Animal animal =new Animal();
analisaSerVivo(animal);
. . .

Neste caso fica a questo, se o mtodo tem um argumento declarado como SerVivo
e recebe como parmetro um objeto Animal, quando tiver que executar o mtodo
extremamente comum e til em OO atribuirmos a uma
varivel de um tipo base um objeto de um tipo derivado
direta ou indiretamente deste tipo base.



52
respirar() qual mtodo ser efetivamente chamado, o mtodo respirar definido em
SerVivo ou o mtodo respirar definido em Animal?

O mtodo executado ser o mais apropriado, isto , aquele pertencente ao
objeto que foi passado varivel, neste caso, o mtodo respirar existente em
Animal.

Isto o polimorfismo dinmico, que recebe este nome porque o compilador no
consegue nestes casos decidir em tempo de compilao qual mtodo chamar, j que
uma varivel de um tipo base pode receber qualquer tipo derivado. Esta deciso
feita apenas em tempo de execuo, quando a o J ava poder saber qual objeto a
varivel est de fato referenciando.

Se o polimorfismo dinmico no existisse, seria necessrio um mtodo
analisaSerVivo para cada ser vivo existente, e sempre que um ser vivo novo fosse
acrescentado o cdigo teria que ser modificado. Da forma como aqui est, o mtodo
continuar funcionando para qualquer ser vivo existente no projeto.

8.3 Criao de um objeto de uma subclasse e o ponteiro super

Objetos so sempre construdos da classe mais alta na hierarquia em direo mais
baixa, isto , da classe Object at a classe que est sendo instanciada com o operador
new. Isto garante que uma subclasse pode sempre contar com a construo apropriada
de sua superclasse.

Por padro, os construtores default das superclasses (aqueles sem argumentos) o que
so chamados quando a superclasse criada. Se quisermos mudar este comportamento
devemos usar o ponteiro super.

O ponteiro super uma referncia para a superclasse e est disponvel implicitamente
em qualquer classe que possua um ancestral. Como vimos, os mtodos na superclasse
podem ser sobreescritos na subclasse atravs da criao de mtodos na subclasse com a
mesma assinatura do mtodo da superclasse. Com o super possvel acessar um mtodo
especfico da superclasse quando este foi sobreescrito pela subclasse. Por exemplo,
vamos recordar a classe Animal definida acima que implementava sua prpria verso de
todos os mtodos de sua superclasse, isto , SerVivo:

class Animal extends SerVivo{

String formaLocomoo;
String habitat;
int tempoMdioVida;

public void locomover() { ... }
public void nascer() { ... }
public void crescer() { ... }
public void alimentar() { ... }
public void respirar() { ... }
public Animal reproduzir() { ... }
public morrer() { ... }
}



53
Vamos supor que num determinado momento quisssemos acessar o mtodo alimentar-
se tal qual como este foi implementado na superclasse. Para isto devemos usar o
ponteiro super da seguinte maneira:

. . .
super.alimentar();
. . .

Bem, mas como afinal de contas podemos mudar o comportamento padro de quando
uma subclasse instanciada os construtores default serem executados?

Um dos usos mais comuns da referncia super chamar um construtor de uma
superclasse. Para isso, este deve ser acrescentado na primeira linha do construtor da
subclasse. Por exemplo, se a classe SerVivo tiver um construtor que receba a idade do
ser vivo como parmetro






e queremos que este construtor seja chamado quando a classe Animal for instanciada ao
invs do construtor padro SerVivo(), fazemos






8.4 Mtodos e Classes final

Vimos no Captulo 3 que para criar variveis que so constantes devemos usar o
comando final. Vamos agora ver duas novas utilizaes para ele:

Mtodos final: Mtodos definidos como final no podem ser sobreescritos.
Geralmente isto feito com o intuito de garantir segurana, prevenindo que mtodos
vitais, tais como aqueles que fazem autenticao de usurios, sejam redefinidos.
Exemplo:

public final boolean checkPassword(String p) {

. . .
}

Classes final: Uma classe declarada como final no poder ser estendida por outra
classe. Esta uma forte deciso no projeto e significa que a classe auto-suficiente
para dispor de todos os seus requisitos atuais e futuros. Classes definidas como final
podem ajudar o compilador a produzir cdigos mais otimizados. Como uma classe
final no pode ser estendida, quando o compilador encontra uma chamada a algum
mtodo desta classe ele no gerar o cdigo necessrio para execuo do
polimorfismo dinmico, o qual acarreta um overhead durante a execuo, mas sim
far um acoplamento esttico com o mtodo em questo.
Acessa o mtodo alimentar-se de SerVivo.
SerVivo(int idade){

this.idade =idade;
}
Animal (int idade){
super(idade);
. . .
}



54
Exerccios:

Nesta lio voc vai adicionar duas novas classes que derivam de Item. A ACME Vdeo
Locadora decidiu expandir seus negcios e comear a alugar jogos alm dos vdeos.
Como jogos possuem alguns atributos diferentes dos filmes, voc decidiu criar
subclasses para cada um destes tipos de itens. Cada item possui seus prprios mtodos e
redefinem o mtodo toString() da classe Item. Abaixo segue o diagrama UML que
mostra o relacionamento entre Item, Filme e J ogos. A seta a notao UML para
herana.
























Abra o projeto ACME Video da lio 8.

1) Defina uma nova classe Filme.

a) Defina a classe Filme que estende a classe Item. A nova classe deve incluir os
atributos e mtodos definidos no diagrama acima.
b) Adicione um construtor que aceite a seguinte lista de atributos como argumentos:
titulo, decricao, preco, numeroDias, categoria, diretor e duracao.
c) Inclua uma chamada ao construtor da superclasse Item usando a seguinte sintaxe

super(titulo, descricao, categoria , preco, numeroDias)

na primeira linha deste construtor.

d) Rescreva o mtodo toString() de forma que este retorne uma string com os valores
concatenados de id, titulo, diretor e preco da seguinte maneira:

1001 (filme) A Vida Bela (Leonardo Benine) R$ 6,00

Item
int id
String titulo
String descricao
double preco
int numeroDias
String categoria

toString()
getId()
setId()
. . .
Filme
String diretor
int duracao

toString()
setDiretor()
getDiretor()
setDuracao()
getDuracao()
Jogo
int memoria
String tipo

toString()
setMemoria()
getMemoria()
setTipo()
getTipo()



55
O texto deve mostrar (filme) para indicar que este item um filme.

2) Defina uma nova classe J ogo

a) Defina a classe J ogo que estende a classe Item. A nova classe deve incluir os
atributos e mtodos definidos no diagrama acima.
b) Acrescente um construtor que aceite como argumentos a seguinte lista de atributos:
titulo, descricao, categoria, preco, numeroDias, memoria, tipo
c) Adicione uma chamada ao construtor da superclasse Item usando a seguinte sintaxe

super(titulo, descricao, categoria, preco , numeroDias)

na primeira linha deste construtor.

d) Rescreva o mtodo toString() de forma que este retorne uma string com os valores
concatenados de id, titulo, tipo e preco da seguinte maneira

1011 (jogo) Lifelike racing (Play Station) - R$ 5,00

O texto deve mostrar (jogo) para indicar que este item um jogo.

3) Teste a aplicao. No mtodo main() do projeto, declare duas variveis do tipo Item
chamadas filme e jogo respectivamente. Inicialize-as chamando os construtores
recm criados da seguinte maneira:

Item filme =new Filme(...);
Item jogo =new J ogo(...);

Chame o mtodo toString() dos dois objetos. Perceba como a atuao do
polimorfismo dinmico ir garantir a correta execuo do mtodo apropriado da
subclasse.
















56
9 Estruturando o Cdigo com Classes Abstratas e Interfaces

Quando a hierarquia de classes em um programa orientado a objetos torna-se complexa,
as classes mais acima (raiz e proximidades) costumam ser bastante gerais. Passa a ser
interessante ento, poder definir prottipos de classes que sero usadas para guiar a
criao de outras classes. Elas implementam ou apenas definem comportamentos que
so genricos o suficiente para serem comuns a vrias outras classes.

9.1 Classes Abstratas

Uma maneira de criar este prottipo definindo classes abstratas. Uma classe abstrata
uma classe que no pode ser instanciada. Vejamos nossa hierarquia de classes para
modelar seres vivos:






A classe SerVivo pode ser declarada como abstrata pois no possui detalhes o suficiente
para representar sozinha um objeto completo. O usurio no poder criar objetos da
classe SerVivo pois esta apenas uma classe parcial e existe apenas para ser estendida
por subclasses mais especializadas, tal como Animal e Vegetal.















Utilizamos a palavra reservada abstract para definir uma classe abstrata. Se tentarmos
instanciar uma classe abstrata receberemos um erro de compilao. Uma classe abstrata
pode conter:

Mtodos e atributos como em classes convencionais. As classes derivadas de uma
classe abstrata herdam da mesma forma os mtodos e atributos. Estes mtodos
podem ser sobrescritos nas subclasses mas isto no obrigatrio.
Mtodos abstratos, que obrigatoriamente devem ser sobrescritos pelas subclasses.

Mtodos abstratos podem existir apenas em classes abstratas. Como uma classe abstrata
est num nvel muito alto de abstrao, muito freqentemente no possui detalhes o
suficiente para implementar determinados comportamentos que sero comuns a todas as
suas subclasses. Ao invs disso, elas apenas definem quais sero estes comportamentos
obrigatrios atravs da criao de mtodos abstratos.
SerVivo
Animal Vegetal
public abstract class SerVivo {

String Alimentos;
int Idade;
public void locomover() { ... }
public void nascer() { ... }
public void crescer() { ... }
public void alimentar() { ... }
public void respirar() { ... }
public SerVivo reproduzir() { ... }
public morrer() { ... }

}



57
Um mtodo abstrato obrigatoriamente deve ser implementado em qualquer uma das
subclasses que estendem a superclasse abstrata. A classe SerVivo por exemplo define
uma srie de mtodos que ela por si s no capaz de prever qual ser o
comportamento para todas as subclasses mas que ao mesmo tempo so comportamentos
comuns a todos os seres vivos. Sendo assim, estes mtodos devem ser declarados como
abstratos da seguinte forma:

public abstract class SerVivo {

String Alimentos;
int Idade;
public abstract void locomover();
public abstract void nascer();
public abstract void crescer();
public abstract void alimentar();
public abstract void respirar();
public abstract SerVivo reproduzir();
public abstract void morrer();

}

Para definir um mtodo abstrato devemos prover apenas a assinatura do mtodo, isto ,
seu nome, argumentos e tipo de retorno. A implementao deste ficar a cargo de cada
subclasse concreta, que poder dar a sua verso para ele.

A utilizao de classes e mtodos abstratos uma forma muito comum para criarmos e
utilizarmos bibliotecas orientadas a objetos: acoplamos nossas classes definindo
heranas e implementamos os mtodos abstratos, os quais garantem que estas classes
tero garantidamente um prottipo bsico.

9.2 Interfaces

Uma interface semelhante a uma classe abstrata exceto pelo fato desta no poder ter
qualquer mtodo concreto ou varivel de instncia. Uma interface representa uma
coleo de declaraes de mtodos abstratos e possivelmente constantes.

Qualquer classe que implementa uma interface deve obrigatoriamente implementar
todos os mtodos especificados pela interface. Assim, interfaces fornecem a idia de um
contrato que qualquer subclasse deve obedecer. Outra caracterstica importante que
uma classe pode derivar de apenas uma nica outra classe (herana simples), mas pode
implementar um nmero indeterminado de interfaces. Por exemplo, a classe Animal
poderia ser definida da seguinte forma:

class Animal extends SerVivo implements Sortable, Listable {

. . .

}

Como mostrado anteriormente, Animal herda de SerVivo seus dados e comportamentos
e como SerVivo possui mtodos abstratos, estes devem ser implementados em Animal.
Todos os diferentes tipos
de seres vivos executam
estas operaes de
diferentes maneiras.
Uma classe pode
implementar mais
de uma interface.



58
Alm disso, como fizemos Animal implementar as interfaces Sortable e Listable, este
deve implementar tambm todos os mtodos especificados nestas interfaces.

Uma interface descreve um aspecto de comportamento que muitas classes diferentes
podem requerer. O nome de uma interface freqentemente um adjetivo como Sortable
(ordenvel) ou Steerable (algo que pode ser pilotado). A interface Steerable pode incluir
mtodos tais como turnRight(), turnLeft(), turnAround(), etc. Qualquer classe que
precisar demonstrar o comportamento de poder ser dirigida pode implementar a
interface Steerable.

No pilotvel Pilotvel

importante notar que classes que implementam a mesma interface podem no ter
absolutamente nada a ver umas com as outras (o que no ocorre quando classes
implementam herana em relao mesma superclasse), a no ser o fato de
apresentarem comportamentos semelhantes, porm, que podem estar implementados de
formas completamente diferentes. Por exemplo, os principais pacotes J ava incluem
inmeras interfaces padro, tais como runnable, clonable, dentre outras. Estas interfaces
so implementadas por todos os tipos de classes que no tm nada em comum, exceto o
fato de precisarem ser clonveis ou executveis.

Para definir uma interface devemos usar a palavra reservada interface. Todos os
mtodos especificados so implicitamente pblicos e abstratos e qualquer varivel
implicitamente public static final, ou seja, so constantes. A interface Steerable por
exemplo, poderia ser definida da seguinte maneira








o que equivale a seguinte definio se no suprimirmos o public, static, final e abstract

public interface Steerable{

public static final int MAXTURN =45;
public abstract void turnLeft (int deg);
public abstract void turnRight (int deg);
}

public interface Steerable{

int MAXTURN =45;
void turnLeft (int deg);
void turnRight (int deg);
}



59
Uma interface pode ser definida de qualquer uma das maneiras mas mais comum
encontrarmos da primeira forma.

Para implementarmos uma interface usamos a palavra reservada implements. Como
exemplo, vamos considerar a classe Iate abaixo:







Neste exemplo, uma classe Iate que deriva da classe Barco tem a caracterstica de
precisar ser pilotada e, sendo assim, implementa a interface Steerable. A classe Iate
deve portanto, implementar todos os mtodos da interface, neste caso turnLeft(int deg) e
turnRight(int deg).

Um exemplo real - Ordenao

A ordenao um exemplo clssico do uso de uma interface. Ordenar uma lista de
objetos um processo bem definido que no precisa ser escrito repetidas vezes e muitas
classes diferentes podem requerer serem ordenveis. Assim, uma rotina de ordenao
precisa possuir a habilidade de ordenar qualquer objeto seguindo as caractersticas
particulares de cada um. A abordagem tradicional de programao poderia propor a
rescrever a rotina de ordenao para cada tipo diferente de objeto que precisasse ser
ordenado. Usando a programao orientada a objetos de forma adequada pode-se
eliminar esta necessidade e toda dificuldade de manuteno que ela acarreta.

Vamos supor que queiramos que seja possvel ordenar um conjunto de objetos da
classe Animal por ordem de idade.

O que devemos fazer, correr atrs de um algoritmo de ordenao e implementar um
mtodo que seja capaz de ordenar um vetor de animais? Graas a orientao a objetos e
ao J ava a resposta no! J ava possui a classe java.util.Arrays que possui um mtodo
esttico sort(Object[]) que realiza a ordenao de um array qualquer. Bem, mas como
este mtodo consegue a faanha de ordenar um array de objetos arbitrrios? Se ele no
conhece o objeto, como vai saber como comparar um objeto do vetor com outro de
forma a determinar a ordem relativa entre eles?

a que entra a necessidade de uma interface. A interface Comparable especifica
mtodos requeridos para fazer a ordenao funcionar em cada tipo de objeto que precisa
ser ordenado. Cada classe implementa a interface baseada em suas necessidades
especficas de ordenao e apenas ela precisa saber como seus objetos devem ser
comparados. Implementar a ordenao de maneira OO prov um modelo muito bem
adequado para reutilizao de cdigo. O cdigo da ordenao completamente isolado
dos objetos que usam a ordenao.

Voltando ao exemplo, as classes e interfaces a serem utilizadas para ordenar um
conjunto de Animais so:



public class Iate extends Barco implements
Steerable {

public void turnLeft (int deg){ ... }
public void turnRight (int deg) { ... }
}



60
Criadas pelos especialistas em ordenao



Criadas pelos especialistas em modelar seres vivos




A interface Comparable declara um nico mtodo: compareTo(Object). Este mtodo
deve ser implementado por qualquer classe que precisa utilizar os mtodos da classe
Arrays.
A classe Arrays contm o mtodo esttico sort(Object[]) para ordenar um array de
objetos. A maioria dos algoritmos de ordenao funcionam atravs da comparao
de pares de objetos. O mtodo sort(Object[]) faz esta comparao chamando o
mtodo compareTo(Object) do objeto no array.
A classe Animal implementa a interface Comparable. Ela contm um mtodo
compareTo(Object) que compara o animal corrente com o animal passado como
argumento do mtodo.
MyApplication simboliza qualquer aplicao que precisa ordenar uma lista de
animais.

Esquema de Execuo













Interface Sortable














public interface Comparable public class Arrays
public class Animal
implements Comparable
public class
MyApplication
MyApplication
Sort
Animal
1 MyApplication passa um array de
animais para Arrays.sort(Object[] o)
2 sort(Object[] o) pede ao animal
para este comparar a si mesmo
com outro animal
4 sort(Object[] o) retorna a lista
ordenada
3 O animal retorna o
resultado da comparao
public interface Comparable {
//compareTo(Object): Compara este objeto
//com o outro passado como argumento
// Retorno:
// 0 se este objeto for igual a obj2
// um valor <0 se este objeto for <obj2
// um valor >0 se este objeto for >obj2
int compareTo (Object obj2);
}



61


A classe Arrays















Note que o mtodo sort no sabe nada sobre o tipo de objeto que ele est ordenando. Ele
sabe apenas que estes so objetos que implementam a interface Comparable e, sendo
assim, ele pode contar com a existncia do mtodo compareTo nestes objetos.

Podemos considerar uma interface como um contrato entre o objeto que usa a interface
e o objeto que a implementa:

A classe Animal (a implementadora) concorda em implementar um mtodo
chamado compareTo(Object), com parmetros e valor de retorno que seguem o
especificado pela interface.
A classe Arrays (usurio) concorda em ordenar uma lista de objetos na ordem
correta fazendo valer-se do mtodo compareTo.

A classe Animal












O mtodo compareTo(Object) pode comparar os dois objetos de qualquer maneira que
quisermos, contanto que ele retorne um inteiro para indicar a ordem relativa entre eles.

Por fim, a classe MyApplication para ordenar um array de Animais, pode simplesmente
chamar Arrays.sort(Object[] ) passando o array de objetos a ser ordenado.



public class Arrays{
public static void sort (Object[] items){
for (int i =1; i <items.length; i++){
for (int j =0; j <items.length 1; j++){
if (items[j].compareTo(items[j+1]) >0){
Comparable tempitem =items[j+1];
items[j+1] =items[j];
items[j] =tempitem;
} } } } }
Quando o mtodo sort precisa comparar dois itens
do array ele chama o mtodo compareTo de um dos
itens e passa o outro como argumento.
public class Animal extends SerVivo
implements Comparable{

public int compareTo(Object animal2){
int idade1 =this.idade;
int idade2 =((Animal)animal2).idade;
if (idade1<idade2) return (-1);
if (idade1>idade2) return (1);
if (idade1=idade2) return (0);
}
Foi necessrio fazer um cast
pois o tipo do argumento
Object.
Uma interface tambm
define um tipo.



62

10 Usando Strings e Arrays

Ao trmino deste captulo voc estar apto a:

Criar strings em J ava
Realizando Operaes em Strings
Converter primitivos para Strings e vice-versa
Manipular strings usando a classe StringBuffer
Criar arrays de elementos

10.1 Strings

Como em muitas linguagens de programao, strings so usadas extensivamente em
programas J ava o que fez com que a API do J ava disponibiliza-se a classe String para
ajudar na manipulao deste tipo de dado. Ela faz parte do pacote java.lang, o qual
automaticamente importado em todas as classes java.

A classe String representa uma string imutvel. Isto significa que, uma vez criado criado
um objeto desta classe, voc no poder alter-lo. Se voc quer modificar o contedo de
uma String, voc deve pode usar a classe StringBuffer, a qual foi desenvolvida para este
propsito.

Existem vrias maneiras de se criar uma String:

Atribuindo uma constante string a uma varivel


Concatenando outras strings


Usando o construtor



J ava utiliza o operador +para concatenao de strings. O mtodo concat() na classe
String uma outra forma de fazer isso. O cdigo seguinte produz strings equivalentes:

String nome =San Wong;
String nome =Sam +Wong;
String nome =Sam .concat(Wong);

possvel tambm concatenar qualquer tipo primitivo com uma string, pois este
implicitamente convertido para uma.

int idade =25;
System.out.println(Idade = +idade);




String categoria =Ao;
String nome =primeiroNome + +ultimoNome;
String nome =new String(J oe Smith);



63
10.1.1 Operaes em strings

A classe String disponibiliza inmeros mtodos para realizarmos operaes sobre ela.
Todas as operaes no modificam a string original. Alguns delas so:

Retornando o tamanho da string: int length()

len = 7

Encontrando um caracter numa posio especfica: char charAt(int index)

c = o


O ndice comea em 0 (zero).

Retornando uma substring: String substring (int beginIndex, int endIndex)

sub = me


Este mtodo retorna a substring que inicia em beginIndex e que termina em
endIndex-1.

Convertendo para upper e lowercase



Eliminando espaos em branco: String trim()

semEspaco = XXX


Retira os espaos das extremidades.

Encontrando o ndice de uma substring

i = 3


i = 6


String indexOf (String) retorna o ndice de uma string especificada.
String lastIndexOf (String) retorna a ltima ocorrncia da string especificada.







String categoria =Comedia ;
int len =categoria.length();
String categoria =Comedia ;
char c =categoria.charAt(1);
String categoria =Comedia ;
String sub =categoria.substring(2,4)
String toUpperCase()
String toLowerCase()
String comEspaco = XXX ;
String semEspaco =comEspaco.trim();
String str =XXXYXXY;
int i =str.indexOf (Y);
String str =XXXYXXY;
int i =str.lastIndexOf(Y);



64
Comparando Strings : boolean equals() e boolean equalsIgnoreCase()








Os mtodos retornam true se a string especificada contm exatamente o mesmo
texto.

10.1.2 Convertendo primitivos para Strings e vice-versa

A classe String possui um mtodo esttico chamado valueOf() que retorna uma
representao em string de um tipo primitivo. Existe uma verso do mtodo para cada
tipo primitivo.




O mtodo System.out.println() tambm possui uma verso par cada tipo primitivo.
Desta forma, possvel fazer

int count =10;
System.out.println(count);

sem a necessidade de antes concatenar count com uma string (o que faria com que ele
fosse automaticamente convertido para uma string).

possvel tambm converter uma string para um tipo primitivo atravs das classes de
wrapper
3
. Para cada tipo primitivo J ava prov uma classe de wrapper correspondente, a
qual permite que um tipo primitivo seja tratado como um objeto. Cada classe de
wrapper disponibiliza um mtodo esttico para converter uma String para o tipo
primitivo correspondente. Exemplo :





10.1.3 A classe StringBuffer

A classe StringBuffer representa strings que podem ser modificadas em tempo de
execuo. Assim, se voc pretende fazer modificaes numa string (acrescentar
caracteres, remover caracteres, etc), voc deve usar esta classe. Por exemplo, quando
fazemos

String texto =Tinha uma pedra;
texto =texto +no meio do caminho;
texto =texto +, no meio do caminho tinha uma pedra.


3
A traduo de wrapper invlucro, envoltrio.
String passwd =connection.getPassword();
if (passwd.equals(fgHPUw)) ....
Neste caso fazer a comparao
levando em conta o case
importante.
String categoria =Comedia;
if (categoria.equalsIgnoreCase(Drama))
Neste caso fazer a comparao
levando em conta o case no
importante.
String sete =String.valueOf(7);
String umPontoZero =String.valueOf(1.0f);
int valor = Integer.parseInt(10);
float valor = Float.parseFloat(10.00);
Cada vez que uma atribuio feita, uma
nova varivel criada na memria com o
novo texto e a varivel anterior descartada.



65
Esta abordagem para modificar o texto de uma String no a mais eficiente, tendo em
vista que novas variveis so criadas em cada atribuio. O ideal utilizar a classe
StringBuffer e seu mtodo append:

StringBuffer texto =new StringBuffer(Tinha uma pedra);
texto.append( no meio do caminho);
texto.append(, no meio do caminho tinha uma pedra.);

10.2 Arrays

Um array til quando queremos agrupar objetos do mesmo tipo. Possui as seguintes
caractersticas:

Todos os elementos devem ser do mesmo tipo
Cada elemento pode armazenar um nico item
Os itens podem ser primitivos ou referncias a objetos
O tamanho do array fixado quando de sua criao

10.2.1 Arrays de Primitivos

Para criar um array de primitivos fazemos:

1 Declaramos o array:



Exemplo: int[] powers;



2 Criamos efetivamente o array:



Um array deve ser criado com o uso do operador new e seu tamanho deve ser fixado
dentro dos colchetes. O tamanho deve ser um inteiro mas no precisa ser uma constante,
pode ser tambm uma expresso que retorna um inteiro.

Quando um array de primitivos criado, seus elementos so inicializados
automaticamente com valores padro da seguinte forma:

char : \u0000 (Valor Unicode para 0000)
byte, short, int e long : 0
boolean : false
float e double: 0.0

3 Inicializando os elementos do array. Duas formas:

Atribuindo valores para cada elemento do array:

Exemplo: powers[0] =1;

type[] arrayName;
or
type arrayName[];
powers aponta para null at que seja
inicializado com o perador new.
int[] powers;
powers = new int[4];
arrayName[index] = value;
O ndice de um array inicia em 0.
Cada elemento
inicializado com o valor 0.



66


Usando inicializadores:


Exemplo: int [] primes ={2,3,5,7};





10.2.2 Arrays de Referncias

Os passos para criar um array de referncias de objetos so os mesmos do array de
primitivos, com uma exceo: no existe uma inicializao default para os elementos.

1 Declarao:

String[] categorias;

2 Criao:

categorias =new String[3];

3 Inicializao. Duas formas:

Atribuindo valores para cada elemento






Atravs de inicializadores






10.2.3 Arrays como objetos

Quando criamos um array tanto de primitivos como de referncias usamos o operador
new, o qual nos retorna o endereo da primeira posio do array. Quando passamos um
array como argumento para um mtodo este passado por referncia, sendo assim, se o
mtodo alterar o contedo do array, estas mudanas dar-se-o no array original e no
numa cpia.





type[] arrayName = {value list};
No h a necessidade de usar o
operador new nem de definir o
tamanho do .
categorias aponta para null.
Os elementos no recebem uma
inicializao default. Cada item aponta
inicialmente para null.
String[] arr =new String[4];
for (int i =0; i <arr.length; i++){
arr[i] =new String();
}
String[] categoias ={

Ao, Comdia, Drama };
Todo array tem o atributo length que
contm o nmero de elementos do
array.



67
10.2.4 Arrays e Excees

Um dos motivos de dizermos que J ava uma linguagem robusta e segura devido a
forma de como ela trata de acessos ilegais em arrays. Iremos estudar excees com mais
detalhes no prximo captulo, porm vamos aproveitar para dar uma olhada em duas
excees relacionadas a arrays.

A primeira trata-se da ArrayIndexOutOfBoundsException, que ocorre quando
tenta-se acessar uma posio invlida do array:




A segunda, NullPointerException, ocorre quando tenta-se acessar um elemento que
ainda no foi inicializado









10.2.5 Arrays multidimencionais

J ava suporta arrays multidimencionais, isto , arrays de arrays.



Exemplo :
int [] [] aux =new int [4][2];
aux [0][0] =1;
aux [0][1] =7;




Representao em Memria de um Array


String[] list =new String[4];
System.out.println(list[5]);
Filme[] listaFilmes =new Filme[3];
String diretor =listaFilmes[0].getDirector();
Erro! Posio 5 invlida!
Erro! Tentando acessar um
mtodo da classe Filme sendo
que o vetor ainda no foi
inicializado com objetos deste
tipo!
type[ ][ ] arrayName = new type[n1][n2];
aux[0]
aux[1]
aux[2]
aux[3]
1 7
0 0
0 0
0 0
aux [0][1]
aux[0][0]



68
Exerccios:

Abra a lio 10 e selecione o projeto ACMEVideo. Vamos realizar vrias modificaes
na classe a fim de por em prtica o que aprendemos nesta lio.

1) Faa as seguintes modificaes na classe ACMEVideo.

a) Defina um atributo array private static de objetos Cliente chamado clientes com
capacidade para armazenar seis objetos Cliente. Para economizar tempo, o cdigo
para criar um array de itens j foi adicionado para voc.
b) Adicione uma varivel de instncia booleana, privada e esttica chamada
clientesConstruidos que serve para controlar se o array de clientes j foi inicializado.
Inicialize esta varivel com false.
c) Crie um mtodo publico e esttico chamado constroiClientes(). Este mtodo contem
o cdigo necessrio para inicializar as seis posies do array de clientes (lembre-se
que o construtor de cliente espera receber um nome, endereo e telefone. Haja
imaginao!!). Uma inicializao deve parecer-se com isso:

clientes[0] =new Cliente(XXXX, YYYY, ZZZZ);

d) Sete a varivel clientesConstruidos para true no interior deste mtodo.
e) Adicione agora um mtodo pblico e esttico que recebe o ID de um cliente como
argumento, busca no array clientes por um cliente que tenha este ID e, caso
encontre-o, retorna o objeto correspondente. O mtodo pode usar um lao for para
fazer a busca no array (voc pode usar a propriedade array.length para saber o final
do array) e deve se chamar buscaClientePorId(). Se um cliente no for encontrado o
mtodo deve retornar null. Adicione uma condio no mtodo para verificar, antes
de iniciar a busca, se existem clientes cadastrados (atravs da varivel
clientesConstruidos). Caso ainda no, faa o mtodo inicializar o array chamando o
mtodo constroiClientes. O cdigo ir se assemelhar a isto:

if (!clientesConstruidos) { constroiClientes(); }
//o lao do for deve entrar aqui

Nessa altura do campeonato, j temos em nosso projeto de locadora quatro classes : a
classe Cliente que manipula os clientes da loja, a classe Item que manipula informaes
gerais sobre os itens que podem ser alugados, a classe Filme e a classe Jogo que so
tipos especficos de itens alugveis. Para concluir o diagrama apresentado no captulo 6,
faltam as classes ItemAlugado e Aluguel.

2) Vamos definir agora a classe ItemAlugado, a qual controla as informaes de um
item quando este alugado para um cliente.

a) Crie a classe ItemAlugado e inclua as seguintes variveis privadas (no esquea dos
mtodos getXXs e setXXs ):

Item item
String dataDevoluo
String dataDevolvida

Faa um import no pacote java.util.*




69
b) Adicione um mtodo getPreco(). Como preo no um atributo de ItemAlugado,
voc deve chamar o mtodo getPrice do Item. Este aoenas um mtodo de
convenincia para sabermos a partir de ItemAlugado qual o preo de aluguel do item. O
cdigo deve assemelhar-se a isso:
public double getPreco(){
return item.getPreco();
}


c) Crie um construtor para classe que aceite o ID de um Item (int) como parmetro. O
construtor deve usar este valor para chamar o mtodo
ACMEVideo.buscaItemPorId() (que j foi construdo para voc como um mtodo
da classe ACMEVideo), o qual retorna um objeto do tipo Item, e inicializar seu
atributo item. O construtor tambm deve inicializar a varivel dataDevolucao com o
valor retornado pelo mtodo calcDataDevolucao();

3) Neste momento voc est pronto para criar a ltima classe necessria para concluir a
aplicao. A classe Aluguel representa uma locao efetivada. Deve controlar por
exemplo qual cliente realizou a locao, os itens locados e a data que o emprstimo
foi feito.

a) Crie uma nova classe Aluguel e inclua um import no pacote java.util.*.
b) Adicione as seguintes variveis privadas:

ItemAlugado[] itens;
Cliente cliente;
int numeroAluguel;
Date dataAluguel;
int itemCount;

c) Adicione as seguintes variveis privadas e estticas:

static int proximoId =500;
final static int MAXITENS =10;

d) Crie um construtor que inicialize as trs variveis. Ele deve gerar o prximo nmero
de aluguel baseado na varivel esttica proximoId (lembra como fizemos no
capitulo 7 quando estudamos variveis estticas). Deve receber o Id de um cliente
como parmetro e utilizar o mtodo ACMEVideo.buscaClientePorId() para
inicializar a varivel cliente. Por fim, deve criar o array itens com o mximo de
MAXITENS posies. Voc mesmo pode fazer este cdigo ou usar o abaixo:

public Aluguel (int clienteId) {

numeroAluguel =++proximoId;
cliente =ACMEVideo1.buscaClientePorId(clienteId);
itens =new ItemAlgugado[MAXITENS];
}

e) Crie um mtodo chamado addItem() para adicionar um item alugado num aluguel.
Use o cdigo abaixo como guia.




70
public void addItem (int itemId) {
ItemAlugado item =new ItemAlugado(itemId);
// Adicione este item no array. Use a varivel itemCount para saber qual a
//posio
...
//Incremente itemCount
}

f) Por fim, voc deve criar o mtodo imprimeRelatorio() que imprime um relatrio
relacionado a um aluguel. O relatrio deve ter o seguinte layout:
Nome do Cliente:
Telefone do Cliente:
Data do Aluguel:
Itens Alugados:
Item 1 : <Titulo><Data Devolucao><Valor>
...
Item n : <Titulo><Data Devolucao><Valor>
Custo Total:
4) Teste a aplicao. No mtodo main do projeto ACMEVideo simule um aluguel da
seguinte forma:

//crie um novo aluguel para o cliente 3
Aluguel aluguel =new Aluguel(3);
//adicione alguns itens locados
aluguel.addItem(1001);
aluguel.addItem(1002);
aluguel.addItem(1005);
//Imprima o relaorio
aluguel.imprimeRelatorio();

Voc pode testar tambm para outras entradas. Clientes vlidos variam de 1-6 e Itens
vlidos de 1001-1011.















71
11 Tratamento de Excees

Uma exceo um evento que ocorre durante a execuo de um programa e que desfaz
o fluxo normal de instrues. Por exemplo, tentar acessar um elemento fora dos limites
de um array, tentar dividir um nmero por zero, so exemplos de excees. Um erro em
J ava uma condio anormal irrecupervel. Por exemplo, uma condio de erro ocorre
se existe algum erro interno na J VM ou se a J VM fica sem memria. A diferena entre
um erro e uma exceo que uma exceo pode ser capturada e o programa pode seguir
em frente a partir dali, j quando um erro ocorre o programa necessariamente ir
terminar.

Quando uma exceo ocorre no interior de um mtodo J ava, o mtodo cria um objeto do
tipo Exception e o retorna para o sistema. Este processo chamado de disparar uma
exceo. O objeto Exception contm informaes sobre a exceo, incluindo seu tipo e
o estado do programa quando a exceo ocorreu. Quando uma exceo disparada, o
sistema busca em seqncia na pilha todos os mtodos para tentar encontrar um capaz
de tratar este tipo de exceo. Na terminologia J ava o mtodo captura a exceo. Se o
sistema no encontra nenhum mtodo apto a capturar a exceo, o programa inteiro
termina.

11.1 Classes de Excees

Todos os erros e excees em J ava derivam da classe Throwlable, resultando na
hierarquia abaixo:












Erros: Erros so extenses da classe Error. Se um erro gerado, ele normalmente
indica um problema que ser fatal para o programa.

Excees no verificveis: Este tipo de exceo deriva da classe RuntimeException.
Podemos escolher o que fazer com uma exceo que ocorre em tempo de execuo
(como dividir um nmero por zero ou acessar um elemento invlido de um array);
podemos tentar captur-la e trat-la ou ento a ignorarmos. Se optarmos pela
segunda opo, a J VM ir terminar o programa e imprimir o nome da exceo e a
pilha de mensagens.

Exceo verificveis: Excees deste tipo so extenses da classe Exception. Elas
devem obrigatoriamente ser capturadas em algum lugar da aplicao, sob pena de
ocorrer erro de compilao caso isso no seja feito.



Throwable
Error Exception
RuntimeException Erros
irrecuperveis
Excees
verificveis
Excees no verificveis
(em tempo de excuo)



72

11.2 Tratando de Excees

Quando chamamos um mtodo que pode retornar uma exceo (tanto verificvel quanto
no), temos trs alternativas:

1. Capturar a exceo e trat-la
2. Deixar a exceo passar pelo mtodo; em algum outro lugar ela deve ser capturada.
3. Capturar a exceo e disparar uma exceo diferente. A nova exceo deve ser
capturada em algum lugar.

11.2.1 Capturando Excees

Se um bloco de cdigo chama um ou mais mtodos que podem disparar excees,
coloque o cdigo dentro de um bloco try, com um ou mais blocos catch imediatamente
posterior a este. Cada bloco catch trata de uma exceo particular. Pode-se
opcionalmente incluir um bloco finally aps todos os blocos catch, o qual sempre
executado mesmo que nenhuma exceo ocorra.
















Para saber se um mtodo de alguma API J ava dispara uma exceo, consulte o
J avaDoc.

Exemplo 1 Capturando uma nica exceo:














try {

//cdigo que pode causar uma exceo
}
catch (exception1) {
//tratamento da exceo 1
}
catch (exception2) {
//tratamento da exceo 2
}
...
finally {
//qualquer processamento final
}
int num;
String s =getNumFromForm();
try{
//Pode disparar NumberFormatException
num =Integer.parseInt(s);
}
catch (NumberFormatException e) {
//trata a exceo
}



73
Exemplo 2 Capturando Mltiplas Excees:














Um bloco catch ir capturar a exceo especificada bem como qualquer uma de suas
subclasses. Por exemplo, a classe MalformedURLException estende IOException,
sendo assim, poderamos substituir os dois blocos catch acima por

catch (IOException e) {

System.err.println(Operao falhou: +e);

}

Isso til quando iremos dar o mesmo tratamento para qualquer uma das excees de
uma mesma hierarquia.

Caso queiramos realmente tratar de forma diferente excees de uma mesma hierarquia,
devemos nos atentar para a ordem em que estas sero especificadas no blocos catch.
Ocorrer um erro de compilao caso especifiquemos primeiro a superclasse e
depois a subclasse da exceo.














Por fim, vamos ver um exemplo de como pode ser usado o bloco finally. Este bloco
til quando queremos liberar recursos alocados num bloco try assim que este terminar.




try {
//pode disparar MalformedURLException
URL u =new URL(str);
//pode disparar IOException
URLConnection c =u.openConnection();
}
catch (MalformedURLException e) {
System.out.println(Impossvel abrir URL: +e);
}
catch (IOException e) {
System.out.println(No foi possvel conectar: +e);
}
try {
//pode disparar MalformedURLException
URL u =new URL(str);
//pode disparar IOException
URLConnection c =u.openConnection();
}
catch (IOException e) {
System.out.println(No foi possvel conectar: +e);
}
catch (MalformedURLException e) {
System.out.println(Impossvel abrir URL: +e);
}
Definir o bloco catch da
superclasse primeiro que o
da subclasse gerar erro de
compilao!



74
















O exemplo acima conta quantos caracteres h num arquivo. O arquivo depois fechado
mesmo que a operao de leitura tenha resultado uma exceo.

Um bloco finally executado independente de como o bloco try terminou:

Terminou normalmente, isto , chegou at o colchete final
Terminou devido a um return ou break
Terminou com o disparo de uma exceo

11.2.2 Deixando uma exceo passar atravs do mtodo

Quando uma exceo ocorre mas no temos condio de trat-la naquele local, podemos
pass-la adiante para que num mtodo mais acima ela possa ser tratada adequadamente.

Para liberarmos um mtodo de tratar uma determinada exceo devemos usar o
comando throws na declarao do mesmo.






Exemplo:








O mtodo que chamou changeURL pode optar por tratar a exceo ou tambm pass-la
adiante. Porm, se em nenhum momento algum mtodo trat-la, o programa terminar
em erro.


FileInputStream f =null;
try{
f =new FileInputStream(filePath);
while (f.read() !=-1)
charcount++;
}
catch(IOException e) {
System.out.println(Erro ao acessar arquivo +e);
}
finally {
//Este bloco sempre executado
f.close();
}
public int myMethod() throws exception1 {

//cdigo que pode gerar a exception1
}
public URL changeURL(URL oldURL)
throws MalformedURLException {

return new URL(http://www.xxx.com);

}
Esta linha pode gerar uma exceo
de MalformedURLException.
Porm, o mtodo changeURL
resolveu no trat-la e pass-la
adiante.



75
11.2.3 Capturando uma exceo e disparando outra diferente

Uma outra alternativa para tratar uma exceo captur-la e disparar uma exceo
diferente, possivelmente uma criada por ns mesmos.





























catch (exception1 e) {
throw new exception2(...);
}
public String getValue(int index) throws
IndexOutOfBoundsException{

if (index ==null || index >=values.length) {

throw new IndexOutOfBoundsException();
}
. . .
}
O mtodo deve indicar que no
vai tratar da exceo que ele
mesmo est disparando.
A exceo pode ser uma
padro do sistema.
void ReadUserFile throws UserFileException {
try {
//cdigo para abrir e ler o arquivo

}
catch (IOException e) {
throw new UserFileException(e.toString());
}
}
Usamos new para
criar uma nova
exceo.
A exceo disparada
pode ser uma criada pelo
usurio.



76
Exerccios:

Na prtica do Captulo 10 supomos que os mtodos buscaClientePorId e
buscaItemPorId sempre recebem IDs vlidos para fazer a busca no array de Clientes e
Itens respectivamente. Porm, possvel que estes mtodos recebam IDs invlidos, isto
, IDs que no estejam cadastrados nos arrays correspondentes.

Iremos fazer a ltima melhoria em nossa aplicao ACME Vdeo para tratar estes
possveis erros. Abra o projeto relacionado lio 11.

1) Defina no arquivo que contm a classe ACMEVideo duas novas excees, uma para
emitir uma mensagem de erro caso um Cliente seja invlido e outra quando um Item
for invlido. As classes derivam de Exception e devem se chamar
ClienteNaoEncontrado e ItemNaoEncontrado:

class ClienteNaoEncontrado extends Exception {
public ClienteNaoEncontrado (String message) {
super(message);
}
}

2) Modifique o mtodo buscaClientePorId() para que este emite a exceo apropriada
se o Id for invlido:

a) Adicione o throws ClienteNaoEncontrado a especificao do mtodo
b) Logo antes do return, verifique se o que ir ser retornado um objeto Cliente ou se
null. Se for null, dispare uma exceo de ClienteNaoEncontrado. O cdigo ser algo
como:

if (cliente ==null) {
throw new ClienteNaoEncontrado (\n\t O ID informado no vlido! +
\n\t Verifique se voc entrou com o ID correto.);
}

3) Edite agora o construtor da classe Aluguel, que quem faz uso do mtodo
buscaClientePorId, a fim de capturar a nova exceo. Se o construtor receber uma
exceo de ClienteNaoEncontrado, o processo de locao no deve continuar.

a) Adicione um bloco try em torno da chamada do mtodo buscaClientePorId().
Adicione um bloco catch para tratar da nova exceo:

catch (ClienteNaoEncontrado e) {

System.out.println(e);
System.exit(0);
}

b) Modifique o exemplo no mtodo main que simula uma locao passando um Id de
cliente invlido, tal como 999.
c) Salve, compile e execute sua aplicao





77
4) Altere o mtodo buscaItemPorId() para disparar a exceo apropriada se o id
recebido for invlido.

a) Acrescente o throw definio de buscaItemPorId() relacionado exceo
ItemNaoEncontrado.
b) Antes de retornar o item verifique se este nulo e, caso afirmativo, crie a nova
exceo ItemNaoEncontrado tal como foi feito com o cliente.

5) Edite agora o construtor da classe ItemAlugado, que quem faz uso do mtodo
buscaItemPorId, a fim de capturar a nova exceo. Se o construtor receber uma
exceo de ItemNaoEncontrado, o processo de locao no deve continuar.

b) Adicione um bloco try em torno da chamada do mtodo buscaItemPorId(). Adicione
um bloco catch para tratar da nova exceo:

catch (ItemNaoEncontrado e) {

System.out.println(e);
System.exit(0);
}

d) Modifique o exemplo no mtodo main que simula uma locao passando um Id de
item invlido, tal como 999, ao mtodo addItem..
e) Salve, compile e execute sua aplicao

Você também pode gostar