Você está na página 1de 134

1

A Tecnologia Java.
A tecnologia Java refere-se a ambas: a linguagem de programao e a plataforma.
A Linguagem de Programao Java.
A linguagem de programao Java uma linguagem de alto nvel que pode ser caracterizada por
todas os seguintes caractersticas:
Simples;
Orientada a Objetos;
Distribuda;
!ultit"read;
Din#mica;
Ar$uitetura %eutra;
Port&vel;
Alta Per'ormance;
(obusta;
Segura.
Na linguagem de programao Java, todos os cdigos-fonte so primeiramente escritos em um
arquivo de texto com a extenso .java. Esses arquivos-fonte so compilados nos arquivos .class pelo
compilador javac. O arquivo .class no contm cdigo que nativo para seu processador; ele em seu
lugar contm bytecodes a linguagem de mquina da Java )irtual !ac"ine *Java )!+. A ferramenta
lanador java (java launcher) ento roda sua aplicao com a instncia da Java )irtual !ac"ine.
Como a Java )! disponvel em diferentes sistemas operacionais, os mesmos arquivo
.class so capazes de rodar em Microsoft Windows, Solaris Operating System (Solaris OS), Linux, ou
Mac OS. Algumas mquinas virtuais, como a JavaHotSpot virtual machine, permitem marchas adicionais
de tempo de execuo para dar a suas aplicaes uma performance melhorada. Ela inclui vrios servios
como a procura por gargalos de performance e recompilao (para o cdigo nativo) freqentemente usada
em sees do cdigo.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
2
A Plata'orma Java.
A plataforma o ambiente de hardware ou software no qual os programas rodam. Ns
mencionamos algumas das plataformas mais populares como o Microsoft Windows, Linux, Solaris OS, e
Mac Os. Muitas plataformas podem ser descritas em uma combinao do sistema operacional e hardware
subjacente. A plataforma Java difere de muitas outras plataformas nas quais a plataforma de software s
roda em determinadas plataformas de hardware.
A plataforma Java tem dois componentes:
A Java )irtual !ac"ine *!&$uina )irtual Java+;
A Java Application Programming ,nter'ace *AP,+;
A AP, uma grande coleo de componentes de software prontos para fornecer muitas
capacidades convenientes. Ela agrupada em bilbiotecas de classes e interfaces; essas bibliotecas so
conhecidas como packages (pacotes).
Como uma plataforma independente de desenvolvimento, a plataforma Java pode ser um pouco
mais lenta que o cdigo nativo. No entanto, avanos no compilador e a tecnologia virtual machine esto
trazendo performance para o cdigo fonte sem ameaar a portabilidade.
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
3
O $ue a tecnologia Java pode 'a-er.
A linguagem de programao de alto nvel Java uma plataforma poderosa de software. Qualquer
implementao completa da plataforma Java d a voc as seguintes caractersticas:
/erramentas de Desenvolvimento: As ferramentas de desenvolvimento fornecem qualquer coisa
que voc precisar para compilao, monitoramento, debbuging e documentao de suas
aplicaes. Como um novo desenvolvedor, as ferramentas principais que voc estar usando so o
compilador javac, o lanador java, e a ferramenta de documentao javadoc.
Application Programming ,nter'ace *AP,+: A AP fornece o ncleo da funcionalidade da linguagem
de programao Java. Ela oferece um vasto conjunto de classes convenientes para uso em suas
aplicaes. Ela vai desde qualquer coisa sobre objeto bsicos, at networking e segurana,
gerao XML e acesso a banco de dados, e mais. O ncleo AP muito extenso; para conseguir
uma viso geral do que ela contm, consute a Java SE evelopment !it " #J!
$M
"%
documentation.
Tecnologias de Desenvolvimento: O software JD0 fornece mecanismos padro como o software
Java 1eb Start e Java Plug2,n para organizar suas aplicaes para os usurios finais.
3ser ,nter'ace Tool4its: Os kits de ferramentas S5ing e Java 6D tornam possvel criar sofisticadas
&'(s #&raphical 'ser (nterfaces%.
,ntegration Libraries: Bibliotecas de integrao como a Java (L, )*(, J+,
$M
)*(, Java -aming
and irectory (nterface
$M
#.J/-//(0% )*(, Java 1M(, e Java 1emote Method (nvocation over
(nternet (nter231+ *rotocol $echnology #Java 1M(2((3* $echnology% habilitam acesso a banco
de dados e manipulao de objetos remotos.
//=================================================================================
7omo a Tecnologia Java pode ajudar voc8.
,niciar rapidamente: Apesar da linguagem de programao Java ser uma poderosa linguagem de
programao orientada a objetos, ela fcil de aprender, especialmente para programadores que
tm familiaridade com C ou C++.
9screva menos c:digos: Comparaes de medidas de programas (contagem de classes,
contagem de mtodos, etc) sugerem que um programa escrito em linguagem de programao Java
pode ser quatro vezes menor que o mesmo programa escrito em C++.
9screva c:digos mel"ores: A linguagem de programao Java encoraja boas prticas de
programo, e automaticamente limpa o lixo de memria para ajudar voc a evitar vazamento de
memria.
Desenvolva programas mais rapidamente: A linguagem de programao Java mais simples que
C++, e dessa maneira, seu tempo de desenvolvimento diminui pela metade quando escrevendo
nele. Seus programas tambm requerem menos linhas de cdigo.
9vita depend8ncias de plata'ormas: Voc pode manter seus programas portveis evitando o uso
de bibliotecas escritas em outras plataformas.
9screva uma ve-; rode em $ual$uer lugar: Pelo motivo de as aplicaes escritas em linguagem
de programao Java serem compiladas em uma mquina virtual independente de bytecodes, eles
podem rodar consistentemente em qualquer plataforma Java.
Distribuio 'acilitada de so't5are: Com Java 1ev Start so't5are, usurios estaro habilitados a
usar suas aplicaes com um simples clique do mouse. Uma verso automtica checa no incio
para assegurar que os usurios tm sempre a ltima verso de seu software. Se uma update est
disponvel, o Java 1eb Start automaticamente atualizar seu software.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
4
A Aplicao <=ello 1orld>?.
Este captulo fornece instrues detalhadas para compilar e rodar uma simples aplicao "Hello
World!. A primeira seo fornece informaes para iniciar o %et@eans ,D9, um ambiente integrado de
desenvolvimento que simplifica grandemente o processso de desenvolvimento de software. A ,D9
%et@eans roda em todas as plataformas j citadas. O restante do captulo fornece instrues especficas da
plataforma para conseguir iniciar sem um ambiente integrado de desenvolvimento.
<=ello 1orld>? para a ,D9 %et@eans.
J o momento para voc escrever sua primeira aplicao. Estas instrues detalhadas so para
usurios da ,D9 %et@eans. A ,D9 %et@eans roda na plataforma Java, que voc pode usar em qualquer
sistema operacional desde que tenha o JD0 A disponvel.
3m 7"ec4list.
Para escrever seu primeiro programa, voc precisar:
B. O Java S9 Development 0it A *JD0 A+
Para Microsoft Windows, Solaris OS, e Linux: http://java.sun.com/javase/6/download.jsp
Para Mac OS X: http://connect.apple.com
6. A ,D9 %et@eans
Para todas as plataformas: http://www.netbeans.info/downloads/index.php
7riando sua primeira aplicao.
Sua primeira aplicao, HelloWorldApp, simplesmente mostrar a saudao "Hello World!. Para
criar esse programa, voc precisar:
7riar um projeto ,D9: Quando voc cria um projeto DE, voc cria um ambiente no qual voc pode
construir e rodar suas aplicaes. Usando projetos DE elimina configuraes problemticas
normalmente associadas com o desenvolvimento em linha de comando. Voc pode construir ou
rodar suas aplicaes escolhendo um simples item de menu dentro da DE.
Adicionar c:digo ao ar$uivo 'onte gerado: Um arquivo fonte contm cdigo, escrito em
linguagem de programao Java, que voc e outros programadores podem entender. Como parte
da criao de um projeto DE, um esqueleto de arquivo fonte ser automaticamente gerado. Voc
ento modificar o arquivo fonte adicionando a mensagem "Hello World!.
7ompilar o ar$uivo 'onte em um ar$uivo .class: A DE chama o compilador (javac) da
linguagem de programao Java, que pega seu arquivo fonte e traduz esse texto em instrues que
a Java virtual machine pode entender. As instrues escritas contidas dentro do arquivo so
conhecidas como bytecodes.
(odar o programa: A DE chama aplicao Java launcher tool (java), que usa a Java virtual
machine para rodar seu programa.
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
5
7riando um projeto ,D9.
Para criar um projeto DE:
B. ,nicie a ,D9 %et@eans.
No sistema Microsoft Windows, voc pode encontrar o item NetBeans DE no menu niciar.
No Solaris OS e sistemas Linux, voc executa o script iniciador da DE pela navegao do diretrio
bin e teclando ./netbeans.
No sistema Mac OS X, clique no cone da aplicao NetBeans DE.
6. %a ,D9 do %et@eans; escol"a Ar$uivo C %ovo Projeto.
D. %a janela %ovo Projeto; eEpanda a categoria Feral e selecione Aplicao JavaG
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
6
H. %a p&gina de %ome e Locali-ao; 'aa o seguinteG
No campo Nome do Projeto, digite Hello World App.
No campo Criar Projeto Principal, digite helloworldapp.HelloWorldApp.
Certifique-se que o checkbox Definir como Projeto Principal esteja marcado.
I. 7li$ue /inali-ar.
O projeto criado e aberto na DE. Voc pode ser os seguintes componentes:
A janela de projetos, que contm uma viso em rvore dos componentes do projeto, incluindo
arquivos fonte, bibliotecas que seu cdigo depende, e assim por diante.
A janela do 9ditor de 7:digos com o arquivo chamado HelloWorldApp aberto.
A janela %avegador, que voc pode usar para navegar rapidamente entre os elementos dentro da
classe selecionada.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
7
Adicionando o JD0 A para a Plata'orma *se necess&rio+.
Pode ser necessrio adicionar o JDK 6 para a lista da plataformas DE disponvel. Para fazer isso,
escolha /erramentas C Ferenciador da Plata'orma Java, como mostra a figura:
Se voc no v o JDK 6 (que s vezes aparece como 1.6 ou 1.6.0) na lista de plataformas
instaladas, clique "Adicionar Plata'orma, navegue para seu diretrio de instalao do JDK 6, clique
"/inali-ar. Voc ver agora a nova plataforma adicionada:

Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
8
Para escolher esta JDK como padro para todos os seus projetos, voc pode rodar a DE com o
comando --jdkhome em linha de comando, ou introduzindo o path para o JDK na propriedade
netbeans_j2sdkhome de seu arquivo INSTALLATION_DIRECTORY/etc/netbeans.conf.
Para especificar esta JDK somente para o projeto corrente, selecione =ello 1orld App no painel
Projetos, escolha Ar$uivo C Propriedades de <=ello 1orld App, clique em @ibliotecas, ento selecione
JD0 A abaixo do menu Java Plataforma. Voc ver uma tela semelhante seguinte:
Adicionando 7:digo ao Ar$uivo /onte Ferado.
Quando voc cria seu projeto, voc deixa o checkbox 7riar 7lasse Principal selecionado na janela
%ovo Projeto. A DE conseqentemente ter criado um esqueleto da classe para voc. Voc pode adicionar
a mensagem "Hello World! para o esqueleto do cdigo, reescrevendo a linha:
//TODO code application logic here
com a linha:
System.out.println(Hello World!); //Mostra a string
Opcionalmente, voc pode reescrever estas quatro linhas do cdigo gerado:
/**
*
* @autor
*/
com estas linhas:
/**
* Esta classe HelloWorldApp implementa uma aplicao que
* simplesmente mostra a mensagem Hello World na sada padro.
*/
Estas quatro linhas so um comentrio de cdigo e no afetam como o programa vai rodar.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
9
Salve suas mudanas escolhendo Ar$uivo C Salvar.
O arquivo ficar parecido com isto:
/*
* HelloWorldApp.java
*
* Created em September 29, 2007, 3:58 PM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package helloworldapp;
/**
* Esta classe HelloWorldApp implementa uma aplicao que
* simplesmente mostra a mensagem Hello World na sada padro.
*/
public class HelloWorldApp {
/** Creates a new instance of HelloWorldApp */
public HelloWorldApp() {
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
System.out.println(Hello World!); //Mostra a string.
}
}
7ompilando o Ar$uivo /onte em um Ar$uivo .class.
Para compilar seu arquivo fonte, escolha 7onstruir C 7onstruir Projeto Principal no menu principal
da DE.
A janela Sada abre e mostra uma sada parecida com a que voc v na figura:
Se a sada do construtor concluir com a declarao 9J973TADO 7O! S379SSO,
congratulaes! Voc compilou com sucessso seu programa!
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
10
Se a sada do construtor concluir com a declarao /AL=A %A 9J973KLO, voc provavelmente
teve um erro de sintaxe em seu cdigo. Erros so reportados na janela Sada como um texto hyper2linked.
Voc pode dar um duplo-clique no hyper2link para navegar para a fonte de um erro. Voc pode ento
consertar o erro e escolher novamente 7onstruir C 7onstruir Projeto Principal.
Quando voc constri o projeto, o arquivo bytecode HelloWorldApp.class gerado. Voc pode
ver onde o novo arquivo foi gerado abrindo a janela Ar$uivos e expandindo o n Hello World
App/build/classes/helloworldapp como mostra a seguinte figura:
Agora que voc j construiu o projeto, voc pode rodar o programa.
(odando o Programa.
No menu da DE, escolha 9Eecutar C 9Eecutar Projeto Principal.
A prxima figura mostra o que voc ver agora:
O programa mostra "Hello World! na janela Sada (juntamente com outras sadas do script
construtor).
Congratulaes! Seu programa funciona!
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
11
7ontinuando o tutorial com a ,D9 %et@eans.
Nas prximas pginas do tutorial, ser explicado o cdigo em uma aplicao simples. Depois disso,
as lies vo aprofundar-se nas caractersticas centrais da linguagem e fornecer muitos outros exemplos.
Apesar de o restante do tutorial no dar instrues especficas a respeito do uso da DE NetBeans, voc
pode facilmente usar a DE para escrever e rodar os cdigos de exemplo. A seguir esto algumas dicas no
uso da DE e explicaes de alguns comportamentos da DE que voc provavelmente ver:
Uma vez que voc tenha criado um projeto em um DE, voc pode adicionar arquivos para o projeto
usando a janela %ovo Ar$uivo. Escolha Ar$uivo C %ovo Ar$uivo, e ento selecione um modelo na
janela, como um modelo de Ar$uivo )a-io Java.
Voc pode compilar e rodar um arquivo individual usando os comandos 7ompilar Ar$uivo (/M) e
9Eecutar Ar$uivo (S"i't2/A) da DE. Se voc usa o comando 9Eecutar Projeto Principal; a DE
executar o arquivo que a DE associa como a classe principal do projeto principal. No entanto, se
voc criar uma classe adicional em seu projeto HelloWorldApp e ento tentar executar este
arquivo com o comando 9Eecutar Projeto Principal; a DE vai rodar o arquivo HelloWorldApp
em seu lugar.
Voc pode querer criar um projeto separado na DE para exemplificar aplicaes que incluem mais
de um arquivo fonte.
Se voc estiver teclando na DE, um box de complementao de cdigo aparecer periodicamente.
Voc pode simplemente ignorar o box de complementao de cdigo e continuar digitando, ou voc
pode selecionar uma das expresses sugeridas. Se voc preferir no ter o box de complementao
de cdigo aparecendo automaticamente, voc pode desativar essa caracterstica. Escolha
/erramentas C OpNes, clique na aba 9ditor, e limpe o checkbox Janela Pop23p de Auto2
7ompletar Autom&tica.
Se voc tentar renomear o n de um arquivo fonte na janela Projetos, a DE abre para voc a
caixa de dilogo (enomear para conduzir voc nas opes de renomeamento da classe e
atualizao do cdigo ao qual essa classe se refere. Clique Pr:Eimo para mostrar a janela
(e'atorar, que contm uma rvore com as mudanas a serem feitas. Ento clique em (e'atorar
para aplicar as alteraes. Esta seqncia de cliques mostra-se desnecessria se voc tiver
somente uma classe simples em seu projeto, mas muito til quando suas mudanas afetam outras
partes de seu cdigo em projetos grandes.
Para mais informaes e um guia completo da DE NetBeans, veja o -et+eans (E ocs and
Support page ou explore a documentao disponvel no menu Help da DE.
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
12
<=ello 1orld>? para !icroso't 1indo5s.
As seguintes instrues so para usurios do Windows XP Professional, Windows XP Home,
Windows Server 2003, Windows 2000 Professional e Windows Vista.
3m 7"ec4list.
Para escrever seu primeiro programa voc precisar:
B. O Java S9 Development 0it A *JD0 A+
Voc pode fazer o download em http://java.sun.com/javase/downloads/index.jsp . As
instrues para instalao esto em http://java.sun.com/javase/6/webnotes/install/index.html
6. 3m editor de teEtos.
Neste exemplo, pode poder usar o %otepad, um simples editor de textos includo nas
plataformas Windows. Voc pode adaptar facilmente estas instrues se voc usa uma
editor de textos diferente.
7riando sua Primeira Aplicao.
Sua primeira aplicao, HelloWorldApp, simplesmente mostrar a saudao "Hello World!. Para
criar este programa, voc precisar:
7riar um ar$uivo 'onte: Um arquivo fonte contm um cdigo, escrito em linguagem de
programao Java, que voc e outros programadores podem compreender. Voc pode usar
qualquer editor de textos para criar e editar cdigos fonte.
7ompilar o ar$uivo 'onte em um ar$uivo .class: O compilador da linguagem de programao
Java (javac) pega seu arquivo fonte e traduz este texto em instrues que a Java virtual machine
pode compreender. Estas instrues contidas dentro do arquivo so conhecidas como bytecodes.
(odar o programa: A ferramenta launcher tool (java) usa a Java virtual machine para rodar sua
aplicao.
7riando um Ar$uivo /onte.
Para criar um arquivo fonte, voc tem duas opes:
Voc pode salvar o arquivo HelloWorldApp.java em seu computador e evitar uma grande
quantidade de digitao. Ento, voc pode ir para a linha de comando, para compilar o arquivo fonte
em um arquivo .class, o que ser explicado nas prximas pginas;
Ou, voc pode usar as seguintes instrues:
Primeiro, inicie seu editor. Voc pode iniciar o editor %otepad do menu ,niciar, selecionando
Programas O Acess:rios O %otepad. Em um novo documento, digite o seguinte cdigo:
/**
* A classe HelloWorldApp implementa uma aplicao que
* simplesmente mostra Hello World! na sada padro.
*/
class HelloWorldApp {
public static void main(String[] args) {
System.out.println(Hello World!); //Mostra a string.
}
}

Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
13
Salve o cdigo em um arquivo com o nome HelloWorldApp.java. Para fazer isto no %otepad,
primeiro escolha Ar$uivo O Salvar como no item de menu. Ento, na caixa de dilogo Salvar como:
B. Usando a caixa de dilogo Salvar como, especifique o diretrio onde voc quer salvar seu
arquivo. Neste exemplo, o diretrio java no drive C.
6. No campo %ome do Ar$uivo, digite HelloWorldApp.java, incluindo as aspas duplas.
D. No combo box Salvar com o tipo, escolha Documentos de TeEto *P.tEt+.
H. No combo box 7odi'icao, marque a codificao como A%S,.
Quando voc terminar, a caixa de dilogo mostrar algo como isto:
Agora clique em Salvar, e saia do Notepad.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
14
7ompilando o Ar$uivo /onte em um Ar$uivo .class.
Abra um sheel, ou janela .command0. Voc pode fazer isso do menu ,niciar escolhendo Prompt
de 7omando (Windows XP), ou escolhendo (un... e ento digitando cmd. A janela shell que aparece
semelhante seguinte figura:
O prompt mostra o diretrio corrente. Quando voc abre o prompt, seu diretrio corrente
geralmente seu diretrio home para o Windows XP (como mostra a figura).
Para compilar seu arquivo fonte, mude o diretrio corrente para o diretrio onde seu arquivo est
localizado. Por exemplo, se seu diretrio fonte java no drive C, digite os seguintes comandos no prompt e
pressione 9nter:
cd C:\java
Agora o prompt se mostrar mudado para C:\java>.
%otaG Para mudar para um diretrio em um drive diferente, voc precisa digitar um comando extra:
o nome do drive. Por exemplo, para escolher o diretrio java no drive, voc precisa digitar D: e dar um
9nter, como mostra a figura:
Se voc digitar dir no prompt e ento der um 9nter, voc poder ver seus arquivos fonte, como na
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
15
seguinte figura:
Agora voc est pronto para compilar. No prompt, digite o seguinte comando e pressione 9nter:
javac HelloWordApp.java
O compilador ir gerar um arquivo bytecode, HelloWorldApp.class. No prompt, digite dir
para ver o novo arquivo que foi gerado, como mostra a seguinte figura:
Agora que voc tem um arquivo .class, voc pode Executar seu programa.
9Eecutando o Programa.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
16
No mesmo diretrio, digite o seguinte comando no prompt:
java HelloWorldApp
A prxima figura mostra o que voc poder ver agora:
Congratulaes! Seu programa est funcionando!
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
17
<=ello 1orld>? para Solaris OS e LinuE.

Estas instrues detalhadas so para usurios do Solaris OS e Linux.
3m 7"ec4list.
Para escrever seu primeiro programa voc vai precisar:
B. O Java S9 Development 0it A *JD0 A+
Voc pode fazer o download em http://java.sun.com/javase/downloads/index.jsp (certifique-
se de fazer o download do JD0 e no do J(9. Voc pode consultar as instrues para
instalao em http://java.sun.com/javase/6/webnotes/install/index.html
6. 3m editor de teEtos
Neste exemplo, ns usaremos o Pico, um editor disponvel para muitas plataformas
baseadas em UNX. Voc pode facilmente adaptar estas instrues se voc usa um editor
de textos diferente, como o vi ou emacs.
Esses dois itens so tudo o que voc precisa para escrever sua primeira aplicao.
7riando sua Primeira Aplicao.
Sua primeira aplicao, HelloWorldApp, simplesmente mostrar a saudao "Hello World!. Para
criar este programa, voc precisar:
7riar um ar$uivo 'onte: Um arquivo fonte contm um cdigo, escrito em linguagem de
programao Java, que voc e outros programadores podem compreender. Voc pode usar
qualquer editor de textos para criar e editar cdigos fonte.
7ompilar o ar$uivo 'onte em um ar$uivo .class: O compilador da linguagem de programao
Java (javac) pega seu arquivo fonte e traduz este texto em instrues que a Java 4irtual Machine
pode compreender. Estas instrues contidas dentro do arquivo .class so conhecidas como
bytecodes.
(odar o programa: A ferramenta launcher tool (java) usa a Java 4irtual Machine para rodar sua
aplicao.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
18
7riando o Ar$uivo /onte.
Para criar um arquivo fonte, voc tem duas opes:
Voc pode salvar o arquivo HelloWorldApp.java em seu computador e evitar uma grande
quantidade de digitao. Ento, voc pode ir para a linha de comando, para compilar o arquivo fonte
em um arquivo .class, o que ser explicado nas prximas pginas;
Ou, voc pode usar as seguintes instrues:
Primeiro, abra um shell, ou janela .terminal0:
Quando voc abrir o prompt, seu diretrio corrente geralmente ser seu diretrio home. Voc pode
mudar seu diretrio corrente para seu diretrio corrente a qualquer momento digitando cd no
prompt e pressionando (eturn.
Os arquivos fonte que voc criar devero ser mantidos em um diretrio separado. Voc pode criar
um diretrio usando o comando mkdir. Por exemplo, para criar o diretrio java em seu diretrio home, use
os seguintes comandos:
cd
mkdir java
Para mudar seu diretrio corrente para o novo diretrio, voc precisa digitar:
cd java
Agora voc pode dar incio criao de seu arquivo fonte.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
19
nicie o editor Pico digitando pico no prompt e pressionando (eturn. Se seu sistema responde
com a mensagem pico : command not found, ento o Pico est atualmente desabilitado. Consulte
seu administrador do sistema para mais informaes, ou use outro editor.
Quando voc iniciar o Pico, ele mostrar em buffer novo e em branco. Esta a rea em que voc
digitar seu cdigo.
Digite os seguintes comandos no novo buffer:
/**
*
* A classe HelloWorldApp implementa uma aplicao que
* simplesmente mostra HelloWorld! na sada padro.
*/
class HelloWorldApp {
public static void main(String[] args) {
System.out.println(Hello World!); //Mostra a string.
}
}
Salve o cdigo em um arquivo com o nome de HelloWorldApp.java. No editor Pico, voc faz
isso digitando 7trl2O e ento, abaixo onde voc v o prompt File Name to write:, digitando o diretrio
em que voc quer criar o arquivo, seguido por HelloWorldApp.java. Por exemplo, se voc quer salvar
HelloWorldApp.java no diretrio /home/jdoe/java; ento voc deve digitar
/home/jdoe/java/HelloWorldApp.java e pressionar (eturn.
Voc pode digitar 7trl2J para sair do Pico.
7ompilando o Ar$uivo /onte em um Ar$uivo .class.
Abra sua janela shell. Para compilar seu arquivo fonte, mude seu diretrio corrente para o diretrio
no qual seu arquivo est localizado. Por exemplo, se seu diretrio fonte /home/jdoe/java, digite o
seguinte comando no prompt e pressione (eturn:
cd /home/jdoe/java
Se voc digitar pwd no prompt, voc ver o diretrio corrente, o qual no exemplo foi mudado para
/home/jdoe/java.
Se voc digitar ls no prompt, voc poder ver seus arquivos.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
20
Agora voc est pronto para compilar o arquivo fonte. No prompt, digite o seguinte comando e
pressione (eturn.
javac HelloWorldApp.java
O compilador vai gerar o arquivo bytecode, HelloWorldApp.class. No prompt, digite ls para
ver o novo arquivo que foi gerado como na seguinte figura:
Agora que voc tem um arquivo .class, pode rodar o programa.
9Eecutando o Programa.
No mesmo diretrio, digite no prompt:
java HelloWorldApp
A prxima figura mostra o que voc ver em seguida:
Congratulaes! Seu programa funciona!
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
21
3ma An&lise da Aplicao <=ello 1orld>?.
Agora ns veremos como a aplicao "Hello World! trabralha e analisar o cdigo:
/**
*
* A classe HelloWorldApp implementa uma aplicao que
* simplesmente mostra Hello World! na sada padro.
*/
class HelloWorldApp {
public static void main(String[] args) {
System.out.println(Hello World!); // Mostra a string.
}
}
A aplicao "Hello World! consiste de trs componentes primrios: comentrios de arquivo fonte, a
definio da classe HelloWorldApp, e o mtodo main. A seguinte explicao fornecer a voc uma
compreenso bsica do cdigo, mas o entendimento profundo s vir depois que voc terminar de ler o
resto do tutorial.
7oment&rios de Ar$uivo /onte.
O seguinte texto define os comentrios da aplicao "Hello World!:
/**
*
* A classe HelloWorldApp implementa uma aplicao que
* simplesmente mostra Hello World! na sada padro.
*/
Comentrios so ignorados pelo compilador mas so teis para outros programadores. A linguagem
de programao Java suporta trs tipos de comentrios:
/* text */
O Compilador ignora qualquer coisa de /* at */.
/** documentation */
sto indica um comentrio de documentao (doc comment). O compilador ignora este tipo
de comentrio, assim como ignora comentrios que usam /* e */. A ferramenta javadoc usa comentrios
doc quando prepara automaticamente a gerao de documentao.
// text
O compilador ignora qualquer coisa desde // at o fim da linha.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
22
A De'inio da 7lasse HelloWorldApp.
O seguinte texto inicia o bloco de definio da classe para a aplicao "Hello World!:
class HelloWorldApp {
Como mostrado acima, a forma mais bsica de definio de uma classe :
class name {
. . .
}
A palavra reservada class inicia a definio da classe para uma classe nomeada name, e o cdigo
para cada classe aparece entre a abertura e o fechamento de chaves.
O !Qtodo main.
O seguinte mtodo inicia a definio do mtodo main:
public static void main(String[] args) {
Os modificadores public e static podem ser escritos em outra ordem (public static ou
static public), mas a conveno o uso de public static como mostrado acima. Voc pode dar ao
argumento o nome que quiser, mas muitos programadores escolhem <args? ou ?argv?.
O mtodo main similar funo main em C e C++; ele o ponto de entrada para sua aplicao e
ele subseqentemente invocar todos os outros mtodos requeridos pelo seu programa.
O mtodo main o mecanismo direto no qual o sistema de runtime passa informaes para sua
aplicao. Cada string no array chamado um argumento de linha de comando. Argumentos de linha de
comando permitem aos usurios mudar as operaes da aplicao sem recompil-la. Por exemplo, um
programa de ordenao permite ao usurio especificar que o dado seja ordenado em ordem decrescente
com o argumento de linha de comando:
-descending
A aplicao "Hello World! ignora estes argumentos de linha de comando, mas voc deveria ser
cauteloso com argumentos que existam.
Finalmente, a linha:
System.out.println(Hello World!);
usa a classe System da biblioteca de ncleo para mostrar a mensagem "Hello World! na sada
padro.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
23
Problemas no 7ompilador.
!ensagens de 9rro 7omuns no Sistema !icroso't 1indo5s.
'javac' is not recognized as an internal or external command, operable
program or batch file
Se voc receber esse erro, o Windows no encontrou o compilador (javac).
Aqui est um caminho para dizer ao Windows onde encontrar javac. Supondo que voc instalou o
JD0 em C:\jdk6. No prompt voc deve digitar o seguinte comando e pressionar 9nter:
C:\jdk6\bin\javac HelloWorldApp.java
Se voc escolheu esta opo, voc ter que preceder seus comandos javac e java com
C:\jdk6\bin cada vez que voc compilar ou executar um programa. Para evitar esta digitao extra,
consulte a seo 'pdate the *)$H variable nas instrues de instalao do JD0 A em:
http://java.sun.com/javase/6/webnotes/install/jdk/install-windows.html#Environment .
Class names, 'HelloWorldApp', are only accept if annotation processing is
explicity requested
Se voc receber esse erro, voc esqueceu de incluir o sufixo .java quando compilou o programa.
Relembre, o comando javac HelloWorldApp.java e no javac HelloWorldApp.
!ensagens de 9rros 7omuns nos Sistemas 3%,J.
javac: Command not found
Se voc receber este erro, UNX no conseguiu encontrar o compilador javac.
Este um caminho para dizer ao UNX onde encontrar javac. Supondo que voc instalou o JD0
em /usr/local/jdk6. No prompt voc deve digitar o seguinte comando e pressionar (eturn:
/usr/local/jak6/javac HelloWorldApp.java
%otaG Se voc escolher esta opo, cada vez que voc compilar ou executar um programa, voc
ter que preceder seus comandos javac e java com /usr/local/jak6/. Para evitar essa digitao
extra, voc deveria adicionar esta informao em sua varivel PAT=. Os caminhos para fazer isso variam
dependendo em qual shell voc est executando atualmente.
Class names, 'HelloWorldApp', are only accept if annotation processing is
explicitly requested
Se voc receber este erro, voc esqueceu de incluir o sufixo .java quando compilou seu
programa. Relembre, o comando javac HelloWorldApp.java e no javac HelloWorldApp.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
24
9rros de SintaEe *Todas as Plata'ormas+.
Se voc digitou incorretamente uma parte de um programa, o compilador pode emitir um erro de
sintaxe. A mensagem geralmente mostra o tipo de erro, o nmero da linha onde o erro foi detectado, o
cdigo naquela linha, e a posio do erro dentro do cdigo. Aqui est um erro causado pela omisso do
ponto-e-vrgula ( ; ) no fim da declarao:
testing.java:14: ';' expected.
System.out.println(Input has + count + chars.)
^
1 error
Algumas vezes o compilador no descobre sua inteno e mostra uma mensagem de erro confusa
ou mltiplas mensagens de erro se o erro desenrolar-se por vrias linhas. Por exemplo, o seguinte cdigo
omite um ponto-e-vrgula (;) na linha "count++:
while (System.in.read() != -1)
count++
System.out.println(Imput has + count + chars.);
Quando estiver processando este cdigo, o compilador emite duas mensagens de erro:
testing.java:13: Invalid type expression.
count++
^
testing.java:14: Invalid declaration.
System.out.println(Input has + count + chars.);
^
2 errors
O compilador emite duas mensagens de erro porque depois de processar count++, o estado do
compilador indica que ele est no meio de uma expresso. Sem o ponto-e-vrgula, o compilador no tem
como saber que a declarao est completa.
Se voc ver qualquer erro no compilador, ento seu programa no compilado com sucesso, e o
compilador no cria um arquivo .class. Verifique cuidadosamente o programa, conserte quaisquer erros
que voc detectar, e tente novamente.
9rros de Sem#ntica.
Em adio verificao se seu programa est sintaticamente correto, o compilador checa por
outras incorrees. Por exemplo, o compilador adverte voc cada vez que voc usar uma varivel que no
foi inicializada:
testing.java:13: Variable count may not have been initialized.
count++
^
testing.java:14: Variable count may not have been initialized.
System.out.println(Input has + count + chars.);
^
2 errors
Mais uma vez, seu programa no foi compilado com sucesso, e o compilador no criou o arquivo
.class. Conserte o erro e tente novamente.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
25
Problemas de (untime.
!ensagens de 9rro no Sistema Operacional 1indo5s.
Exception in thread main java.lang.NoClassDefFoundError: HelloWorldApp
Se voc receber esse erro, java no encontrou seu arquivo bytecode, HelloWorldApp.class.
Um dos lugares java provveis para encontrar seu arquivo .class seu diretrio corrente. Ento
se seu arquivo .class est em C:\java, voc poderia mudar seu diretrio corrente para l. Para mudar
seu diretrio, digite o seguinte comando no prompt e pressione 9nter:
cd c:\java
O prompt ser modificado para C:\java>. Se voc digitar dir no prompt, voc poder ver seus
arquivos .java e .class. Agora digite java HelloWorldApp novamente.
Se continuar tendo problemas, voc poderia mudar sua varivel 7LASSPAT=. Para ver se isto
necessrio, tente acessar o classpath com o seguinte comando:
set CLASSPATH=
Agora digite java HelloWorldApp novamente. Se seu programa rodar agora, voc ter que mudar
sua varivel 7LASSPAT=. Para acessar essa varivel, consulte a seo Update the PAT= variable nas
instrues de instalao do JD0 A em http://java.sun.com/javase/6/webnotes/install/jdk/install-
windows.html#Environment .
Exception in thread main java.lang.NoClassDefFoundError:
HelloWorldApp/class
Um engano comum cometido por programadores iniciantes tentar rodar o lanador java no
arquivo .class que foi criado pelo compilador. Por exemplo, voc receber esse erro se tentar executar
seu programa com java HelloWorldApp.class ao invs de java HelloWorldApp. Relembre, o
argumento Q o nome da classe $ue voc8 $uer usar; no o nome do ar$uivo.
Exception in thread main java.lang.NoSuchMethodError: main
A Java virtual mac"ine requer que a classe que voc executa com ela tenha um mtodo main
para que possa iniciar a execuo de sua aplicao.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
26
!ensagens de 9rro em Sistemas 3%,J.
Exception in thread main java.lang.NoClassDefFoundError: HelloWorldApp
Se voc receber este erro, java no pode encontrar seu arquivo bytecode,
HelloWorldApp.class.
Um dos lugares java provveis para encontrar seu arquivo bytecode seu diretrio corrente. Ento,
por exemplo, se seu arquivo bytecode est em /home/jdoe/java, voc poderia mudar seu diretrio
corrente para l. Para mudar seu diretrio, digite o seguinte comando no prompt e pressione (eturn:
cd /home/jdoe/java
Se voc digitar pwd no prompt, voc deveria ver /home/jdoe/java. Se voc digitar ls no
prompt, voc poderia ver seus arquivos .java e .class. Agora entre java HelloWorldApp novamente.
Se voc continuar tendo problemas, voc pode ter que mudar sua varivel de ambiente
7LASSPAT=. Para ver se isso necessrio, tente acessar o 7LASSPAT= com o seguinte comando:
unset CLASSPATH
Agora digite java HelloWorldApp novamente. Se seu programa rodar agora, voc ter que
mudar sua varivel 7LASSPAT= da mesma maneira que a varivel PAT= acima.
Exception in thread main java.lang.NoClassDefError: HelloWorldApp/class
Um engano comum cometido por programadores iniciantes tentar rodar o lanador java no
arquivo .class que foi criado pelo compilador. Por exemplo, voc receber esse erro se tentar executar
seu programa com java HelloWorldApp.class ao invs de java HelloWorldApp. Relembre, o
argumento Q o nome da classe $ue voc8 $uer usar; no o nome do ar$uivo.
Exception in thread main java.lang.NoSuchMethodError: main
A Java virtual mac"ine requer que a classe que voc executa com ela tenha um mtodo main
para que possa iniciar a execuo de sua aplicao.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
27
O $ue Q um objeto.
O conceito de objetos fundamental para compreender a tecnologia de orientao a objeto. Olhe
sua volta agora e voc encontrar muitos exemplos de objetos do mundo real: seu cachorro, sua mesa, sua
televiso, sua bicicleta.
Os objetos do mundo real compartilham duas caractersticas: todos eles tm um estado e um
comportamento. Cachorros tm um estado (nome, cor, raa) e comportamento (forma de latir, encantador,
abanar o rabo). Bicicletas tambm tm estado (marcha corrente, cadncia corrente do pedal, velocidade
corrente) e comportamento (mudana de marcha, mudana de cadncia do pedal, aplicao de marchas).
dentificar o estado e o comportamento dos objetos do mundo real um timo caminho para pensar em
termos de programao orientada a objetos.
Pare um minuto agora para observar os objetos do mundo real que esto sua volta. Para esses
objetos que voc v, faa a si mesmo duas perguntas: "Em que possveis estados esses objetos podem
estar?" e "Quais os possveis comportamentos esses objetos podem apresentar?". Escreva suas
obervaes. Como voc pode ver, os objetos do mundo real variam em complexidade; seu monitor pode ter
dois estados (ligado ou desligado) e dois possveis comportamentos (de frente e virado), mas seu radio
pode ter estados adicionais (de frente, virado, volume atual, estao atual) e comportamento (ligado,
desligado, aumento de volume, procura de estao, estao corrente, msica). Voc vai reparar que alguns
objetos, por sua vez, podem conter outros objetos. Essas observaes do mundo real exprimem em outras
palavras a programao orientada a objetos.
Objetos de so't5are tm conceito similar a objetos do mundo real: eles tambm consistem de
estado e comportamento associado. Um objeto armazena este estado em campos (variveis em algumas
linguagens de programao) e evidencia seu comportamento atravs de mtodos (funes em algumas
linguagens de programao). !Qtodos operam em um estado interno do objeto e servem como o
mecanismo primrio para a comunicao de objeto para objeto. Escondendo o estado interno e requerindo
total interao para ser executado sem interrupo, um mtodo de objeto conhecido como dado
encapsulado - um princpio fundamental da programao orientada a objetos.
Considere uma bicicleta, por exemplo:
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
28
Para atribuio do estado (velocidade corrente, cadncia corrente do pedal, e marcha corrente) e
provendo mtodos para mudanas de estado, permanecem do objeto em controle a forma de como o
mundo exterior autorizado para us-lo. Por exemplo, se a bicicleta s tem seis marchas, um mtodo para
mudar as marchas poderia rejeitar qualquer valor menor que 1 e maior que 6.
Empacotando cdigos em objetos individuais pode-se obter vrios benefcios, incluindo:
B. !odularidadeG o cdigo fonte para um objeto pode ser escrito e feita sua manuteno
independentemente do cdigo fonte de outros objetos. Depois de criado, um objeto pode ser facilmente
distribudo em partes do sistema.
6. 9sconder in'ormaNesG Ao interagir somente com um mtodo do objeto, os detalhes da
implementao interna permanecem escondidos do mundo exterior.
D. 7:digo reutili-&velG Se um objeto realmente existe (mesmo escrito por outro desenvolvedor de
software), voc pode usar aquele objeto em seu programa.
H. Pugabilidade e 'acilidade de debugG Se um objeto em particular torna-se problemtico, voc
pode simplesmente remov-lo de sua aplicao em inserir um objeto diferente para substitu-lo. Esta uma
analogia com consertos de problemas mecnicos do mundo real. Se uma pea quebra, voc troca ela, no
a mquina inteira.
//==============================================================================
O $ue Q uma classe.
No mundo real, voc encontra muitas vezes vrios objetos todos do mesmo tipo. Pode haver
milhares de outras biciletas em existncia, todas com a mesma marca e modelo. Cada bicicleta foi
construda do mesmo conjunto e projeto e por esta razo contm os mesmos componentes. Em termos de
orientao a objetos, ns dizemos que sua bicicleta est em uma inst5ncia da classe de objetos conhecida
como bicicleta. A classe o projeto do qual o objeto individual criado.
A seguinte classe Bicycle uma possvel implementao de bicicleta:
class Bicycle {
int cadence = 0;
int speed = 0;
int gear = 1;
void changeCadence(int newValue) {
cadence = newValue;
}
void changeGear(int newValue) {
gear = newValue;
}
void speedUp(int increment) {
speed = speed + increment;
}
void applyBrakes(int decrement) {
speed = speed - decrement;
}
void printStates() {
System.out.println("cadence:"+cadence+" speed:"+speed+"gear:"+gear);
}
}
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
29
A sintaxe da linguagem de programao Java pode parecer nova para voc, mas o desenho da
classe baseado na discusso prvia do objeto bicicleta. Nos campos cadence, speed, e gear
representam o estado do objeto, e o mQtodo (changeCadence, changeGear, speedUp, etc) define esta
interao com o mundo exterior.
Voc deve observar que a classe Bicycle no contm o mtodo main. sto porque esta no uma
aplicao completa; isto s o projeto para bicicletas que ser usado na aplicao. A responsabilidade de
criao e uso da novo objeto Bicycle pertence a outra classe em nossa aplicao.
Aqui est uma classe BicycleDemo que cria dois objetos Bicycle separados e invoca seus
mtodos:
class BicycleDemo {
public static void main(String[] args) {
// Cria dois objetos Bicycle diferentes
Bicycle bike1 = new Bicycle();
Bicycle bike2 = new Bicycle();
// Invoca os mtodos desses objetos
bike1.changeCadence(50);
bike1.speedUp(10);
bike1.changeGear(2);
bike1.printStates();
bike2.changeCadence(50);
bike2.speedUp(10);
bike2.changeGear(2);
bike2.changeCadence(40);
bike2.speedUp(10);
bike2.changeGear(3);
bike2.printStates();
}
}
A sada deste teste mostra ao final cadncia, velocidade, e marcha para as duas bicicletas:
cadence:50 speed:10 gear:2
cadence:40 speed:20 gear:3
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
30
O $ue Q uma "erana.
Diferentes tipos de objetos podem ter algumas caractersticas em comum com outros. Mountain
bikes, road bikes, e tandem bikes, por exemplo, compartilham todas as caractersticas de bicicletas
(velocidade corrente, cadncia corrente do pedal, marcha corrente). Alm disso, cada um define aspectos
adicionais que fazem delas diferentes: tandem bicycles tm dois assentos e dois guides; road bikes tm
guides abaixados; algumas mountain bikes tm uma corrente adicional, dando a elas uma diferente
proporo de marcha.
Programao orientada a objeto permite classes para herdar estados comumente usados e
comportamentos para outras classes. Uma nova bicicleta pode vir com a superclasse de mountain bike,
road bike, ou tandem bike. Na linguagem de programao Java, cada classe permitida para ter uma
superclasse, e cada superclasse tem o potencial para um nmero ilimitado de subclasses.
A sintaxe para criao de uma subclasse simples. Comeando com a declarao da classe,
usado a palavra reservada extends, seguida pelo nome da classe para herdar de:
class MountainBike extends Bicycle {
// novos campos e mtodos definindo uma mountain bike vo aqui
}
sso pega de MountainBike todos os mesmos campos e mtodos como Bicycle, este cdigo
ainda permite focar exclusivamente na caracterstica que faz dela nica. sto faz com que o cdigo para sua
subclasse seja fcil de escrever. No entanto, voc deve ter cuidado para documentar o estado e o
comportamento que cada superclasse define, desde que o cdigo no aparea no arquivo de cada
subclasse.
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
31
O $ue Q uma ,nter'ace.
Como voc tem aprendido, objetos definem suas interaes com o mundo exterior de acordo com
os mQtodos que eles exibem. !Qtodos configuram a inter'ace do objeto com o mundo exterior; os botes
na frente de sua televiso, por exemplo, so interfaces entre voc e a instalao eltrica no outro lado da
caixa plstica do aparelho. Voc pressiona o boto "Ligar" para lig-lo e deslig-lo.
De uma forma geral, uma interface um grupo de mtodos relacionados com corpos vazios. Um
comportamento de uma bicicleta, se especificado em uma interface, apresenta aparncia como segue:
interface Bicycle {
void changeCadence(int newValue);
void changeGear(int newValue);
void speedUp(int increment);
void applyBrakes(int decrement);
}
Para implementar esta interface, o nome da classe poderia ser ACMEBicycle, por exemplo, e voc
poderia usar a palavra reservada implements na declarao da classe:
class ACMEBicycle implements Bicycle {
// lembrana dessa classe implementada como antes
}
,nter'aces formam um contrato entre a classe e o lado exterior do mundo, e este contrato forado
em tempo de constuo para o compilador. Se sua classe reivindica a implementao de uma interface,
todos os mtodos definidos pela interface aparecero no cdigo fonte antes da classe que suceder a
compilao.
%otaG Para atualmente compilar a classe ACMEBicycle, voc precisaria adicionar a palavra
reservada public antes de implementar os mtodos da interface.
//=================================================================================
O $ue Q um pacote.
Um pacote um espao nomeado que organiza o conjunto de classes e interfaces declaradas.
Conceitualmente voc pode pensar em pacotes como sendo similar a diferentes pastas em seu computador.
Voc mantm pginas HTML em uma pasta, imagens em outra, e scripts ou aplicaes em outras. Pelo
motivo de softwares escritos em Java poderem ser compostos de centenas de milhares de classes
individuais, faz sentido organizar as classes e interfaces em pacotes.
A plataforma Java provida de uma enorme biblioteca de classes (um conjunto de pacotes)
apropriados para uso em suas aplicaes. Esta biblioteca conhecida como a 6)pplication *rogramming
(nterface6, ou 6)*(6. Estes pacotes representam as tarefas mais comumente associadas com o propsito
de programao. Por exemplo, um objeto String contm estado e comportamento para caracteres
strings; um objeto File permite ao programador facilitar a criao, deleo, inspeo, comparao, ou
modificao de um arquivo no sistema de arquivos; um objeto Socket permite a criao e uso de sockets
de rede; vrios objetos &'( controlam botes e checkbo7es e qualquer coisa relacionada a interfaces
grficas. H literalmente milhares de classes para escolher l. sto permite ao programador, focar no design
de uma aplicao em particular, antes que a infraestrutura requeira fazer este trabalho.
A Especificao Java *lataform )*( contm uma lista completa de todos os pacotes, interfaces,
classes, campos, e mtodos suportados pela Java *lataform ", Standard Edition.

Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
32
)ari&veis.
Um objeto armazena seu estado em campos.
int cadence = 0;
int speed = 0;
int gear = 1;
Quais so as regras e convenes para nomear um campo? Alm de int, que outros tipos de
dados existem? Campos so inicializados quando eles so declarados? Os campos so atribudos com
valor default se eles no forem explicitamente inicializados? Na linguagem de programao Java, os termos
"campo e "varivel so ambos usados; sso uma fonte comum de confuso entre novos
desenvolvedores, desde que ambos parecem referir-se s mesmas coisas.
A linguagem de programao Java define os seguintes tipos de variveis:
)ari&veis de ,nst#ncia *campos no2est&ticos+ : Tecnicamente falando, objetos armazenam seus
estados individuais em "campos no estticos, ou seja, campos declarados sem a palavra
reservada static. Campos no-estticos so tambm conhecidos como vari8veis de inst5ncia
porque seus valores so nicos para cada inst5ncia da classe (como cada objeto, em outras
palavras); a currentSpeed de uma bicicleta independente da currentSpeed de outra.
)ari&veis da 7lasse *campos est&ticos+ : Uma vari8vel da classe qualquer campo declarado
com o modificador static; ele diz ao compilador que h exatamente uma cpia da varivel em
existncia, indiferentemente de quantas vezes a classe est sendo instanciada. Um campo
definindo o nmero de marchas para um tipo particular de bicicleta poderia ser marcado como
static desde que conceitualmente o mesmo nmero de marchas ser aplicado para todas as
instncias. O cdigo static int numGears = 6; seria criado como um campo esttico.
Adicionalmente, a palavra reservada final seria adicionada para indicar que o nmero de marchas
nunca mudaria.
)ari&veis Locais : Da mesma forma que um objeto armazena seu estado em campos, um mtodo
muitas vezes armazena seu estado temporrio em vari8veis locais. A sintaxe para a declarao de
uma varivel local similar declarao do campo (por exemplo, int count = 0;). No h
palavras reservadas especiais para designaao de uma varivel como local; esta determinao vem
completa do local em que a varivel declarada que entre a abertura e o fechamento de chaves
do mtodo. Dessa maneira, variveis locais so visveis somente para os mtodos em que eles so
declarados; eles no so acessveis para o resto da classe.
Par#metros : Voc sempre ver exemplos de parmetros, como na classe Bicycle e no mtodo
main da aplicao "Hello World!. Recorde que a marca para o mtodo main public static
void main(String[] args). Aqui, a varivel args o parmetro do mtodo. importante
lembrar que os parmetros so sempre classificados como "variveis e no "campos. sso se
aplica para outros construtores de aceitao de parmetros tambm (como os construtores e
manipuladores de excees).

importante relembrar que este tutorial usa as seguintes diretrizes gerais quando discute campos e
variveis. Se voc est falando a respeito de "campos em geral (excluindo variveis e locais e parmetros),
ns simplesmente dizemos "campos. Se a discusso se aplica a todos os acima, ns dizemos
simplesmente "varivies. Voc tambm ver ocasionalmente o termo "membro usado como fonte. Um tipo
de campos, mtodos e tipos aninhados so coletivamente chamados de membros.
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
33
%omeando )ari&vies.
Todas as linguagens de programao tm seu prprio conjunto de regras e convenes para os
tipos de nomes que voc pode usar, e a linguagem de programao Java no diferente. As regras e
convenes para voc nomear suas variveis podem ser resumidas como segue:
%omes de vari&veis so case2sensitive : O nome da varivel pode ter qualquer identificador
vlido um tamanho ilimitado de sequncia de letras 'nicode e dgitos, comeando com uma letra,
o sinal de dlar ("$), ou um underscore ("_). Por conveno, no entanto, sempre bom comear
os nomes de suas variveis com uma letra, no um "$ ou "_. Adicionalmente, o sinal de dlar, por
conveno, nunca usado em tudo. Voc encontrar algumas situaes onde nomes auto-gerados
contero um sinal de dlar, mas seus nomes de variveis deveriam evitar de us-lo. Uma
conveno similar existe para o caracter underscore; embora seja permitido comear seus nomes
de variveis com "_, esta prtica desencorajada. Espaos em branco no so permitidos.
7aracteres subse$Rentes podem ser letras; dgitos; sinal de d:lar; ou caracterer underscore.
Quando estiver escolhendo um nome para suas variveis, use palavras completas em vez de
abreviaes misteriosas. Dessa forma seu cdigo ser fcil de ler e entender. Em muitos casos isso
tambm far de seus cdigos documentarem a si mesmos; campos nomeados cadence, speed, e
gear, por exemplo, so muito mais intuitivos que verses abreviadas, como um s, c, e g. Tambm
mantenha em mente que o nome que voc escolher no pode ser uma palavra reservada.
Se o nome $ue voc8 escol"er consiste de uma palavra; escreva a palavra toda em letras
minSsculas. Se o nome consiste de mais de uma palavra, coloque a primeira letra da prxima
palavra em letra maiscula. Os nomes gearRatio e currentGear so exemplos desta
conveno. Se suas variveis armazenam um valor constante, como um static final int
NUM_GEARS = 6, a conveno muda levemente, tornando maiscula qualquer letra e separando
palavras subseqentes com um caracter underscore. Por conveno, o caracter underscore nunca
usado em outra parte.
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
34
Tipos de Dados Primitivos.
A linguagem de programao Java fortemente tipada, o que faz com que todas as variveis
precisem ser declaradas antes que elas possam ser usadas. sto envolve a declarao do tipo da varivel e
o nome, como voc pode ver:
int gear = 1;
Fazendo assim informado ao seu programa que o campo nomeado "gear existe, atribui ao dado
o tipo numrico, e o inicializa com um valor "1. Os tipos de dados das variveis determinam os valores que
elas contm, determinando as operaes que podem ser utilizadas nela. Em adio ao int, a linguagem
de programao Java suporta sete outros tipos de dados primitivos. Um tipo primitivo pr-definido pela
linguagem e nomeada por um palavra reservada. Valores primitivos no compartilham estados com outros
valores primitivos. Os oito tipos de dados primitivos que so suportados pela linguagem de programao
Java so:
bTte: O tipo de dado byte um tipo 8-bits designado para indicar inteiros. Ele tem um valor mnimo
de -128 e valor mximo de 127 (inclusive). O tipo de dado byte pode ser proveitoso para
economizar memria em arrays grandes, onde a memria economizada nesse momento importa.
Ele pode ser usado em lugar de int aonde seus limites ajudam a clarear seu cdigo; o fato de que
o alcance da varivel limitado pode servir como uma forma de documentao.
s"ort: O tipo de dado short um tipo 16-bits designado para indicar inteiros. Ele tem um valor
minimo de -32.768 e um valor mximo de 32.767 (inclusive). Como o tipo byte, as mesmas
diretrizes se aplicam: voc pode usar um short para economizar memria em arrays grandes, em
situaes onde a memria economizada nesse momento importa.
int: O tipo de dado int designado para indicar inteiros. Ele tem um valor mnimo de
-2.147.483.648 e um valor mximo de 2.147.483.647 (inclusive). Para valores integrais, este tipo de
dado geralmente escolhido como default a menos que haja uma razo (como mencionado acima)
para escolher alguma coisa diferente. Este tipo de dado provavelmente ser maior que os nmeros
que seu programa usar, mas se voc precisa de um extenso alcance de valores, use long em seu
lugar.
long : O tipo de dado long designado para indicar inteiros. Ele tem um valor mnimo de
-9.223.372.036.854.775.808 e um valor mximo de 9.223.372.036.854.775.807 (inclusive). Use este
tipo de dado quando voc precisa de um alcance de valores mais extenso que os fornecidos pelo
int.
'loat : O tipo de dado float um tipo de ponto flutuante 32-bit EEE 754. Este alcance de valores
est alm do escopo dessa discusso. Assim como recomendado para os tipos byte e short, use
um float (em lugar de double) se voc precisa economizar memria em arrays grandes de
nmeros de ponto flutuante. Este tipo de dado nunca deveria ser usado para valores precisos,
assim como para moedas. Para isso, voc precisa usar a classe java.math.BigDecimal.
double : O tipo de dado double um tipo de dados de dupla preciso 32-bit EEE 754. Este
alcance de valores est fora do escopo dessa discusso. Para valores decimais, este tipo de dado
geralmente a escolha padro. Como mencionado acima, este tipo de dado nunca deve ser usado
para valores precisos, assim como para moedas.
boolean : O tipo de dado boolean tem s dois possveis valores: true e false. Use este tipo de
dado para sinalizar as condies true9false. Este tipo de dado representa um bit de informao,
mas seu "tamanho no precisamente definido.
c"ar : O tipo de dado char um simples caracter 'nicode 16-bit. Ele tem um valor mnimo de
'\u000' (ou 0) e um valor mximo de '\uffff' (ou 65.535 inclusive).
Em adio aos oito tipos primitivos de dados listados acima, a linguagem de programao Java
tambm fornece suporte especial para caracteres strings atravs da classe java.lang.String.
Envolvendo seus caracteres entre aspas duplas voc automaticamente criar um novo objeto String; por
exemplo, String s = This is a string; objetos String so imut8veis, o que significa que
quando criados, seus valores no podem ser mudados. A classe String no tecnicamente um tipo de
dado primitivo, mas considerando o suporte especial dado pela linguagem, voc provavelmente tender a
pensar desta maneira.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
35
)alores De'ault de )ari&veis.
Nem sempre necessrio atribuir um valor quando o campo declarado. Campos que so
declarados mas no so inicializados sero ajustados para um padro racional pelo compilador.
Genericamente falando, o padro ser zero ou nulo (null), dependendo do tipo de dado. Confiar tanto nos
valores padro, no entanto, geralmente considerado um estilo ruim de programao.
O seguinte mapa resume os valores padro para os tipos de dados citados:
Tipo de Dado )alor padro *para campos+
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char '\u000'
String (ou qualquer objeto) null
boolean false
%otaG Varivies locais so um pouco diferentes; o compilador nunca atribui um valor padro para
uma varivel local no inicializada. Se voc no pode inicializar sua varivel local onde ela est declarada,
certifique-se de atribuir um valor antes de tentar us-la. Acessando uma varivel local no inicializada
resultar em um erro em tempo de compilao.
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
36
Literiais.
A palavra reservada new no usada quando estiver inicializando uma varivel de um tipo primitivo.
Tipos primitivos so tipos especiais de tipos de dados construdos na linguagem; eles no so objetos
criados de uma classe. Um literal o cdigo fonte de representao de um valor fixo; literais so
representados diretamente em seu cdigo sem computao requerida. Como mostrado abaixo, possvel
atribuir um literal para uma varivel de um tipo primitivo:
boolean result = true;
char capitalC = 'C';
byte b = 100;
short s = 10000;
int i = 100000;
Os tipos integrais (byte, short, int, e long) podem ser expressados usando sistema decimal,
octal, ou nmeros hexadecimais. Decimal um sistema de nmeros que voc usa todo dia; baseado em
10 dgitos, numerados de 0 at 9. O sistema de nmeros octal base 8, consistindo dos dgitos de 0 a 7. O
sistema hexadecimal base 16, onde dgitos so os nmeros de 0 at 9 e as letras A at F. Para o propsito
geral de programao, o sistema decimal apropriado para ser o nico sistema numrico que voc sempre
usar. No entanto, se voc precisar do octal ou hexadecimal, o seguinte exemplo mostra a sintaxe correta.
O prefixo 0 indica octal, enquanto 0x indica hexadecimal.
int decVal = 26; // O nmero 26, em decimal
int octVal = 032; // O nmero 26, em octal
int hexVal = 0x1a; // O nmero 26, em hexadecimal
Os tipos de ponto flutuante (float e double) s podem ser expressados usando E ou e (para
notao cientfica), F ou f (32-bit float literal) e D ou d (64-bit double literal; este o padro e por conveno
omitido).
double d1 = 123.4;
double d2 = 1.234e2; // mesmo valor que d1, mas em notao cientfica
float f1 = 123.4f;
Literais do tipo char e String podem conter qualquer caracter 'nicode (UTF-16). Se seu editor e
sistema de arquivos permit-lo, voc pode usar qualquer caracter diretamente em seu cdigo. Se no, voc
pode usar uma "sada 'nicode como em '\u0108' (letra maiscula C com circunflexo), ou S\u00ED
se\u00F1or (Si Se:or em espanhol). Sempre use 'aspas simples' para literais char e "aspas duplas
para literais Strings. Seqncias de sadas Unicode podem ser usadas em outra parte em um programa
(como em um campo nomes, por exemplo), no somente em literais char ou String.
A linguagem de programao Java tambm suporta algumas sadas especiais de seqncias para
literais char e String: \b (backspace), \t (tab), \n (alimenta linha), \f (alimenta formulrio), \r
(retorno de carro), \ (aspas duplas), \' (aspas simples), e \\ (barra).
H tambm o literal especial null que pode ser usado como um valor para referenciar qualquer
tipo. O literal null pode ser atribudo para qualquer varivel, exceto variveis de tipo primitivo. H pouco o
que voc pode fazer com um valor null alm de fazer testes de presena. No entanto, null
frequntemente usado em programas como um marcador para indicar que alguns objetos esto
desabilitados.
Finalmente, h tambm um tipo especial de literal chamado de classe literal; formada pela captura
de um nome de tipo e acrescentando .class, por exemplo, String.class. sto atribui para o objeto
(ou tipo Class) que representa o tipo dele mesmo.
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
37
ArraTs.
Um arraT *vetor+ um container (recipiente) que abriga um nmero fixo de valores ou um tipo
simples. O tamanho de um array estabelecido quando o array criado. Depois da criao, este tamanho
fixado.
Cada item em um array (vetor) chamado um elemento, e cada elemento acessado por um index
(<ndice) numrico. Como mostra a ilustrao acima, a numerao dos <ndices inicia com 0. O 9 elemento,
por exemplo, por essa razo acessado pelo ndice 8.

O seguinte programa, ArrayDemo, cria um array de inteiros, coloca alguns valores nele, e mostra
cada valor na sada padro.
class ArrayDemo {
public static void main(String[] args) {
int[] anArray; //declara um array (vetor) de inteiros
anArray = new int[10]; //aloca memria para 10 inteiros
anArray[0] = 100; // inicializa o primeiro elemento
anArray[1] = 200; // inicializa o segundo elemento
anArray[2] = 300; // etc
anArray[3] = 400;
anArray[4] = 500;
anArray[5] = 600;
anArray[6] = 700;
anArray[7] = 800;
anArray[8] = 900;
anArray[9] = 1000;
System.out.println(Elemento no ndice 0: + anArray[0]);
System.out.println(Elemento no ndice 1: + anArray[1]);
System.out.println(Elemento no ndice 2: + anArray[2]);
System.out.println(Elemento no ndice 3: + anArray[3]);
System.out.println(Elemento no ndice 4: + anArray[4]);
System.out.println(Elemento no ndice 5: + anArray[5]);
System.out.println(Elemento no ndice 6: + anArray[6]);
System.out.println(Elemento no ndice 7: + anArray[7]);
System.out.println(Elemento no ndice 8: + anArray[8]);
System.out.println(Elemento no ndice 9: + anArray[9]);
}
}
A sada do programa :
Elemento no ndice 0: 100
Elemento no ndice 1: 200
Elemento no ndice 2: 300
Elemento no ndice 3: 400
Elemento no ndice 4: 500
Elemento no ndice 5: 600
Elemento no ndice 6: 700
Elemento no ndice 7: 800
Elemento no ndice 8: 900
Elemento no ndice 9: 1000
No mundo real da programao, voc provavelmente usar um dos construtores de looping (for,
while, e do-while) para iterar cada elemento do vetor, ao invs de escrever cada linha individualmente.
Este exemplo para ilustrar a sintaxe de um vetor.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
38
Declarando uma )ari&vel para Acessar um ArraT.
O programa abaixo declara uma array com a seguinte linha de cdigo:
int[] anArray; // declara um array de inteiros
Como as declaraes para variveis de outros tipos, uma declarao tem dois componentes: o tipo
e o nome do array. Um tipo de array escrito como type[], onde type o tipo de dado dos elementos
contidos; os colchetes ([]) so smbolos especiais indicando que esta varivel refere-se a um array. O
tamanho do array no parte do tipo (por esse motivo os colchetes esto vazios). Um nome de array pode
ser qualquer coisa que voc quiser, contanto que ele siga as regras e convenes que foram previamente
discutidas na seo .-omeando 4ari8veis0. Assim como variveis de outros tipos, a declarao no cria
verdadeiramente um array ela simplesmente diz ao compilador que esta varivel contm um vetor de um
determinado tipo.
Similarmente, voc pode declarar arrays de outros tipos:
byte[] anArrayOfBytes;
short[] anArrayOfShorts;
long[] anArray OfLongs;
float[] anArrayorFloats;
double[] anArrayOfDoubles;
boolean[] anArrayOfBooleans;
char[] anArrayOfChars;
String[] anArrayOfStrings;
Voc pode tambm colocar os colchetes depois do nome do array:
float anArrayOfFloats[]; // Este um formato desencorajado
No entanto, convenes desencorajam essa forma; os colchetes identificam o tipo do array e
devem aparecer com a designao do tipo.
7riando; ,niciali-ando; e Acessando um ArraT.
Um caminho para criar um array o operador new. A prxima declarao no programa ArrayDemo
aloca um array com memria suficiente para dez elementos inteiros e atribui o array para a varivel
anArray.
AnArray = new int[10]; // cria um array de inteiros
Se essa declarao estivesse faltando, o compilador mostraria um erro como o seguinte, e a
compilao falharia:
ArrayDemo.java:4: Variable anArray may not have been iniciatialized.
As prximas linhas atribuem valores para cada elemento de um array:
anArray[0] = 100; // inicializa o primeiro elemento
anArray[1] = 200; // inicializa o segundo elemento
anArray[2] = 300; //etc.
Cada elemento do array acessado pelo seu ndice numrico:
System.out.println(Element 1 at index 0: + anArray[0]);
System.out.println(Element 2 at index 0: + anArray[1]);
System.out.println(Element 3 at index 0: + anArray[2]);
Alternativamente, voc pode usar um atalho na sintaxe para criar e inicializar um array:
int[] anArray = {100, 200, 300, 400, 500, 600, 700, 800, 900, 1000};
Aqui o tamanho do array determinado pelo nmero de valores fornecidos entre { e }.
Voc pode tambm declarar um array de arrays (tambm conhecido como um array
multidimensional) usando dois ou mais conjuntos de colchetes, como em String [] [] names. Cada
elemento, dessa forma, ser acessado por um nmero correspondente de valores indexados.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
39
Na linguagem de programao Java, um array multidimensional simplesmente um array cujos
componentes so seus prprios arrays. Esse um array diferente em 7 ou /ortran. A conseqncia disso
que so permitidas variaes no tamanho das seqncias, como mostra o seguinte programa:
MultiDimArrayDemoG
class MultiDimArrayDemo {
public static void main(String[] args) {
String[] [] names = {{Mr. , Mrs. , Ms. },
{Smith, Jones}};
System.out.println(names[0][0] + names[1][0]); //Mr. Smith
System.out.println(names[0][2] + names[1][1]); //Ms. Jones
}
}
A sada do programa :
Mr. Smith
Ms. Jones
Finalmente, voc pode usar a propriedade embutida length para determinar o tamanho de um
array. O cdigo:
System.out.println(anArray.length);
mostrar o tamanho do array na sada padro.
7opiando ArraTs.
A classe System tem um mtodo arraycopy que voc pode usar para copiar eficientemente dados
de uma array para outro:
public static void arraycopy(Object src,
int srcPos,
Object dest,
int destPos,
int length)
Os dois argumentos Object especificam o array do qual os dados sero copiados e o array de
destino. Os argumentos int especificam a posio inicial no array fonte, inciando a posio no array de
destino, e o nmero de elementos que sero copiados.
O seguinte programa, ArrayCopyDemo, declara um array de elementos char, soletrando a palavra
"decaffeined. Ele usa arraycopy para copiar a seqncia de componentes do array para um segundo
array:
class ArrayCopyDemo {
public static void main (String[] args) {
char[] copyFrom = { 'd', 'e', 'c', 'a', 'f', 'f', 'e', 'i', 'n',
'a', 't', 'e', 'd' };
char[] copyTo = new char[7];
System.arraycopy(copyFrom, 2, copyTo, 0, 7);
System.out.println(new String(copyTo));
}
}
A sada do programa :
caffein
UUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
40
Operadores.
A partir do momento que j sabemos como declarar e incializar variveis, podemos conhecer o que
podemos fazer com elas. Aprendendo os operadores da linguagem de programao Java um bom lugar
para comear. Operadores so smbolos especiais que executam operaes especficas em um, dois, ou
trs operandos, e ento retornam um resultado.
Os operadores na prxima tabela so listados de acordo com a ordem de precedncia. Os que se
encontram no topo da tabela, tm maior prioridade. Operadores com maior prioridade so avaliados antes
dos operadores com prioridade relativamente menor. Operadores na mesma linha tm prioridade igual.
Quando operadores de igual prioridade aparecem na expresso, uma regra obrigatria determina que o
primeiro tem prioridade. Todos os operadores binrios exceto para operadores de atribuio tm prioridade
da esquerda para a direita; operadores de atribuio tm prioridade da direita para a esquerda.
Prioridade de Operadores
posicionado aps expr++ expr--
unrio ++expr --expr + expr - expr ~ !
multiplicativo * / %
aditivo + -
deslocamento << >> >>>
relacional < > <= >= na instncia
igualdade == !=
AND (E) &
XOR (XOU) ^
OR (OU) |
lgico AND (E) &&
lgico OR (OU) ||
ternrio ? :
atribuio = += -= *= /= %= &= ^= |= <<= >>= >>>=
Para o propsito geral da programao, certos operadores tendem a aparecer mais freqentemente
que outros; por exemplo, o operador de atribuio "= muito mais comum que o operador de mudana
direita ">>>. A seguinte discusso foca primeiro nos operadores que voc provavelmente usar
regularmente, e termina focando nos que so menos comuns. Cada discusso acompanhada por um
exemplo de cdigo que voc pode compilar e executar. Estudando essas sadas ajudar voc a reforar o
que voc j aprendeu.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
41
Operadores de Atribuio; AritmQticos e 3n&rios.
O Operador de Atribuio Simples.
Um dos operadores mais comuns que voc vai encontrar o operador de atribuio simples "=.
Voc viu esse operador na classe Bicycle; ele atribui o valor da direita para o operando da esquerda:
int cadence = 0;
int speed = 0;
int gear = 1;
Este operador s pode ser usado em objetos para atribuir refer=ncias ao objeto.
Os Operadores AritmQticos.
A linguagem de programao Java fornece operadores que realizam adio, subtrao,
multiplicao, e diviso. Eles so fceis de reconhecer por serem similares aos operadores matemticos. O
nico smbolo que parece novo o "%, que divide um operando por outro e retorna o resto como resultado:
+ operador de adio (tambm usado para concatenao de strings)
- operador de subtrao
* operador de multiplicao
/ operador de diviso
% operador de resto
O seguinte programa, ArithmeticDemo, testa os operadores matemticos.
class ArithmeticDemo {
public static void main (String[] args) {
int result = 1 + 2; // result agora 3
System.out.println(result);
result = result - 1; // result agora 2
System.out.println(result);
result = result * 2; // result agora 4
System.out.println(result);
result = result / 2; // result agora 2
System.out.println(result);
result = result + 8; // result agora 10
result = result % 7; // result agora 3
System.out.println(result);
}
}
Voc pode tambm combinar operadores aritmticos com o operador de atribuio simples para
criar atribuies compostas. Por exemplo, x += 1; e x = x + 1; ambos incrementam o valor de x em
1.
O operador + pode tambm ser usado para concatenar (juntar) duas strings, como mostra o
seguinte programa ConcatDemo:
class ConcatDemo {
public static void main(String[] args) {
String firstString = This is;
String secondString = a concatenated string.;
String third String = firtsString+secondString;
System.out.println(thirdString);
}
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
42
Os Operadores 3n&rios.
Os operadores unrios requerem somente um operando; eles efetuam vrias operaes como uma
incrementao/decrementao de um valor em um, negando uma expresso, ou invertendo o valor de um
boolean.
W Operador unrio de adio; indica valor positivo (nmeros so positivos sem ele, no entanto)
- Operador unrio de menos; nega uma expresso
WW Operador de incremento; incrementa o valor em 1
X X Operador de decremento; decrementa o valor em 1
> Operador de complemento lgico; inverte o valor de um boolean
O seguinte programa, UnaryDemo, testa os operadores unrios:
class UnaryDemo {
public static void main(String[] args) {
int result = +1; //result agora 1
System.out.println(result);
result--; //result agora 0
System.out.println(result);
result++; //result agora 1
System.out.println(result);
result = -result; //result agora -1
System.out.println(result);
boolean success = false;
System.out.println(success); //false (falso)
System.out.println(!success); //true (verdadeiro)
}
}
Os operadores de incremento e decremento podem ser aplicados antes (prefixo) ou depois (sufixo)
do operando. O cdigo result++; e ++result; ambos terminaro em result sendo incrementado em 1.
A nica diferena que a verso prefixo (++result) calcula para o valor incrementado, enquanto a verso
postfi7 (result++) calcula o valor original. Se voc est somente efetuando um incremento/decremento
simples, no faz diferena qual verso voc escolher. Mas se voc usa este operador como parte de uma
expresso grande, o qual voc escolher pode fazer uma diferena significativa.
O seguinte programa, PrePostDemo, ilustra o operador unrio de incremento prefixo/sufixo:
class PrePostDemo {
public static void main(String[] args) {
int i = 3;
i++;
System.out.println(i); // 4
++i;
System.out.println(i); // 5
System.out.println(++i); // 6
System.out.println(i++); // 6
System.out.println(i); // 7
}
}
UUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
43
Operadores de ,gualdade; (elacionais e 7ondicionais.
Os Operadores de ,gualdade e (elacionais.
Os operadores de igualdade e relacionais determinam se um operando maior que, menor que, ou
diferente de outro operador. A maioria desses operadores voc provavelmente achar familiar. Lembre-se
de usar "==, no "=, quando testando de dois valores primitivos so iguais.
== igual a
!= diferente de
> maior que
>= maior ou igual que
< menor que
<= menor ou igual que
O seguinte programa, ComparisonDemo, testa os operadores de comparao:
class ComparisonDemo {
public static void main(String[] args) {
int value1 = 1;
int value2 = 2;
if(value1 == value2) System.out.println(value1 == value2);
if(value1 != value2) System.out.println(value1 != value2);
if(value1 > value2) System.out.println(value1 > value2);
if(value1 < value2) System.out.println(value1 < value2);
if(value1 <= value2) System.out.println(value1 <= value2);
}
}
Sada:
value1 != value2
value1 < value2
value1 <= value2
UUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
Os Operadores 7ondicionais.
Os operadores && e || efetuam operaes ,onditional2)- (9 condicional) e ,onditional231
(O3 condicional) em duas expresses booleanas. Estes operadores exibem comportamentos bit a bit, de
forma que o segundo operador calculado somente se necessrio.
&& Conditional-AND (E condicional)
|| Conditional_OR (OU condicional)
O seguinte programa, CoditionalDemo1, testa estes operadores:
class ConditionalDemo1 {
public static void main(String[] args) {
int value1 = 1;
int value2 = 2;
if((value1 == 1) && (value2 == 2)) System.out.println(value1
is 1 AND value2 is 2);
if((value1 == 1) || (value2 == 1)) System.out.println(value1
is 1 OR value2 is 1);
}
}
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
44
Outro operador condicional ?:, que pode ser considerado como um substituto mais curto para um
if-then-else (que ser discutido mais tarde). Este operador tambm conhecido como um operador
tern8rio porque ele usa trs operandos. No seguinte exemplo, este operador mostrado lendo um
"IfsomeCondition true, atribui o valor do value1 para result. Do contrrio atribui o valor de
value2 para result.
O seguinte programa, ConditionalDemo2, testa o operador ?: :
class ConditionalDemo2 {
public static void main(String[] args) {
int value1 = 1;
int value2 = 2;
int result;
boolean someCondition = true;
result = someCondition ? value1 : value2;
System.out.println(result);
}
}
Porque someCondition verdadeiro, o programa mostra "1 na tela. Use o operador ?: ao invs
de uma declarao if-then-else se este tornar mais seu cdigo mais legvel; por exemplo, quando a
expresso compacta e sem efeitos secundrios (como em atribuies).
O Operador de 7omparao de Tipo instanceof.
O Operador instanceof compara um objeto de um tipo especfico. Voc pode us-lo para testar
se um objeto uma instncia de uma classe, uma instncia de uma subclasse, ou uma instncia de uma
classe que implementa uma interface particular.
O seguinte programa, InstanceofDemo, define uma classe pai (nomeada Parent), uma interface
simples (nomeada MyInterface), e uma classe filha (nomeada Child) que herda da pai e implementa a
interface.
class InstanceofDemo {
public static void main(String[] args) {
Parent obj1 = new Parent();
Parent obj2 = new Child();
System.out.println(obj1 instanceof Parent: + (obj1
instanceof Parent));
System.out.println(obj1 instanceof Child: + (obj1
instanceof Child));
System.out.println(obj1 instanceof MyInterface: + (obj1
instanceof MyInterface));
System.out.println(obj2 instanceof Parent: + (obj2
instanceof Parent));
System.out.println(obj2 instanceof Child: + (obj2
instanceof Child));
System.out.println(obj2 instanceof MyInterface: + (obj2
instanceof MyInterface));
}
}
class Parent{}
class Child extends Parent implements MyInterface{}
interface MyInterface{}
Sada:
obj1 instanceof Parent: true
obj1 instanceof Child: false
obj1 instanceof MyInterface: false
obj2 instanceof Parent: true
obj2 instanceof Child: true
obj2 instanceof MyInterface: true
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
45
Operadores @it5ise e @itS"i't.
A linguagem de programao Java tambm fornece operadores que efetuam operaes bitwise e
bitshift em tipos integrais. Os operadores discutidos nesta seo so menos comumente usados. No
entanto, sua cobertura breve; a inteno simplesmente tornar voc ciente que estes operadores
existem.
O complemento unrio bitwise "~ inverte um padro de bits; ele pode ser aplicado para qualquer
um dos tipos inteiros, fazendo de cada "0 um "1 e de cada "1 um "0. Por exemplo, um byte contm 8
bits; aplicando o operador para um valor cujo padro "00000000 mudaria seu padro para "11111111.
O operador left shift "<< desloca um padro de bit para a esquerda, e o operador right shift ">>
desloca um padro de bits para a direita. O padro de bit dado pelo operando do lado esquerdo, e o
nmero de posies para o deslocamento pelo lado operando do lado direito. O operador right shift ">>>
muda para zero na posio mais esquerda, enquanto a posio mais esquerda depois de ">> depende
da extenso no sinal.
O operador bitwise & fornece uma operao bitwise )- (E).
O operador bitwise ^ fornece uma operao bitwise e7clusive 31 (OU exclusivo).
O operador bitwise | fornece uma operao bitwise inclusive 31 (OU inclusivo).
O seguinte programa, BitDemo, usa o operador bitwise )- para mostrar o nmero "2 na sada
padro.
class BitDemo {
public static void main(String[] args) {
int bitmask = 0x000F;
int val = 0x2222;
System.out.println(val & bitmask); //Mostra 2
}
}
//==============================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
46
9EpressNes; DeclaraNes e @locos.
Operadores podem ser usados na construo de expresses, como calcular valores; expresses
so os componentes centrais de declaraes; declaraes podem ser agrupadas em blocos.
9EpressNes.
Uma expresso um construo feita de variveis, operadores, e invocao de mtodos, que so
construdos de acordo com a sintaxe da linguagem, que calcula um valor nico.
int cadence = 0;
anArray[0] = 100;
System.out.println(Elemento 1 no ndice 0: + an Array[0]);
int result = 1 + 2; //resultado agora 3
if(value1 == value2) System.out.println(value1 == value2);
O tipo de dado do valor retornado em uma expresso depende dos elementos usados na
expresso. A expresso cadence = 0 retorna int porque o operador de atribuio retorna uma valor do
mesmo tipo de dado que est no operando mais esquerda; neste caso, cadence um int. Como voc
pode ver nas outras expresses, uma expresso pode retornar outros tipos de valores como fonte, como um
boolean ou String.
A linguagem de programao Java permite a voc construir expresses compostas de vrias
pequenas expresses desde que o tipo de dado requerido por uma parte da expresso seja igual ao tipo de
dado da outra. Por exemplo:
1 * 2 * 3
Neste exemplo em particular, a ordem em que a expresso avaliada no tem importncia porque o
resultado da multiplicao independe da ordem; a sada sempre a mesma, no importa em qual ordem
voc aplica as multiplicaes. No entanto, isto no verdade para todas as expresses. Por exemplo, a
seguinte expresso retorna resultados diferentes, dependendo se voc coloca o operador de adio ou de
diviso primeiro:
x + y / 100 //ambguo
Voc pode especificar exatamente como uma expresso ser avaliada usando parnteses: (e). Por
exemplo, para fazer a expresso anterior sem ambigidade, voc poderia escrever como segue:
(x + y) / 100 //no ambgua, recomendada
Se voc no indicar explicitamente a ordem para as operaes serem calculadas, a ordem
determinada pela prioridade designada para o operador em uso na expresso. Operadores que tm uma
prioridade maior so calculados primeiro. Por exemplo, o operador de diviso tem uma prioridade maior que
o operador de adio. Portanto, as duas declaraes a seguir so equivalentes:
x + y / 100
x + (y / 100) //no ambgua, recomendada
Quando estiver escrevendo expresses compostas, seja explcito e indique com parnteses quais
operadores devem ser avaliados primeiro. Esta prtica faz com que seu cdigo seja mais fcil de ler e de
fazer manuteno.
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
47
DeclaraNes.
Declaraes so de uma forma rudimentar equivalentes a sentenas na linguagem natural. Uma
declarao (statement) forma uma unidade completa de execuo. Os seguintes tipos de expresses
podem ser feitas em uma declarao terminando a expresso com um ponto-e-vrgula (;):
Declarao de especificao;
Qualquer uso de ++ ou --;
nvocao de mtodos;
Expresso de criao de objetos.
Declaraes tambm so chamadas de e7pressions statements (expresses de declarao). A
seguir so mostrados alguns exemplos de expresses de declarao:
aValue = 8933.234; // declarao de especificao
aValue++; // declarao de incremento
System.out.println(Hello World!); // declarao de invocao de mtodo
Bicycle myBike = new Bicycle(); // declarao de criao de objeto
Em adio s expresses de declarao, h dois outros tipos de declaraes: declaration
statement (sentena de declarao) e control flow statements (declarao de controle de fluxo). Uma
sentena de declarao declara uma varivel. Voc ver muitos exemplos de sentenas de declarao
prontas:
double aValue = 8933.234; // sentena de declarao
Finalmente, as declaraes de controle de fluxo, regulam a ordem em que as declaraes sero
executadas. As declaraes dentro de seu cdigo fonte so geralmente executadas de cima para baixo, na
ordem em que elas aparecem. Declaraes de controle de fluxo, no entanto, param o fluxo da execuo
usando comandos de deciso, looping, e desvio de execuo, habilitando seu programa para executar
condicionalmente blocos particulares do cdigo. As declaraes de controle de fluxo so as declaraes de
comandos de deciso (if-then, if-then-else, switch), as declaraes de looping (for, while,
do-while), e declaraes de desvio (break, continue, return) suportadas pela linguagem de
programao Java.
@locos.
Um bloco um grupo de zero ou mais declaraes entre chaves e podem ser usadas em qualquer
lugar que uma declarao simples permitida. O seguinte exemplo, BlockDemo, ilustra o uso de blocos:
class BlockDemo {
public static void main(String[] args) {
boolean condition = true;
if (condition) { // comea o bloco 1
System.out.println(Condio verdadeira.);
} // fim do bloco 1
else { // comea o bloco 2
System.out.println(Condio falsa.);
} // fim do bloco 2
}
}
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
48
DeclaraNes de 7ontrole de /luEo.
As declaraes dentro de seus arquivos fonte so geralmente executadas de cima para baixo, na
ordem em que elas aparecem. As declaraes de controle de fluxo, no entanto, quebram o fluxo da
execuo empregando controles de deciso, looping, e desvio de execuo, habilitando seu programa para
executar condicionalmente um bloco particular do cdigo. Esta seo descreve as declaraes de controle
de deciso (if-then, if-then-else, switch), as declaraes de looping (for, while, do-
while), e as declaraes de desvio (break, continue return) soportadas pela linguagem de
programao Java.
As DeclaraNes if-then.
A declarao if-then a mais bsica de todas as declaraes de controle de fluxo. Ela diz a seu
programa para executar uma certa seo do cdigo somente se um teste em particular for verdadeiro
(true). Por exemplo, a classe Bicycle poderia permitir uma parada para diminuio da velocidade da
bicicleta somente se a bicicleta estivesse em movimento. Uma possvel implementao do mtodo
applyBrakes poderia ser como a seguinte:
void applyBrakes() {
if (isMoving) {// a clusula if: bicicleta precisa estar se movendo
currentSpeed--; // a clusula then: diminui a velocidade atual
}
}
Se este teste for avalidado como false (considerando que a bicicleta no est em movimento), o
controle pula para o fim da declarao if-then.
Em adio, a abertura e fechamento das chaves opcional, desde que a clusula "then contenha
somente uma declarao:
void applyBrakes() {
if (isMoving) currentSpeed--; //igual anterior, mas sem chaves
}
Decidir quando omitir as chaves assunto de gosto pessoal. Omitindo elas pode fazer o cdigo
mais frgil. Se uma segunda declarao mais tarde adicionada para a clusula "then, um erro comum
poderia ser esquecer de adicionar as chaves novamente requeridas. O compilador no percebe este tipo de
erro; voc s conseguir um resultado incorreto.
//=================================================================================
As DeclaraNes if-then-else.
A declarao if-then-else fornece um caminho secundrio para a execuo quando uma
clusula "if avaliada como false. Voc poderia usar uma declarao if-then-else no mtodo
applyBrakes para executar alguma ao se os freios so aplicados quando a bicicleta no est em
movimento. Neste caso, a ao simplesmente mostrar uma mensagem de erro dizendo que a bicicleta j
est parada.
void applyBrakes() {
if (isMoving) {
currentSpeed--;
} else {
System.out.println(A bicicleta est parada no momento!);
}
}
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
49
O seguinte programa, IfElseDemo, especifica uma graduao baseada em um valor de uma teste
de contagem: um A para um escore de 90% ou mais, um B para um score de 80% ou mais e assim por
diante:
class IfElseDemo {
public static void main(String[] args) {
int testscore = 76;
char grade;
if (testscore >= 90) {
grade = 'A';
} else if (testscore >= 80) {
grade = 'B';
} else if (testscore >= 70) {
grade = 'C';
} else if (testscore >= 60) {
grade = 'D';
} else {
grade = 'F';
}
System.out.println(Grade = + grade);
}
}
A sada do programa :
Grade = C
Voc deve ter observado que o valor do testscore pode satisfazer mais de uma expresso na
declarao composta 76 >= 70 e 76 >= 60. No entanto, se a condio satisfeita, a declarao
apropriada ser executada (grade = 'C') e o restante das condies no sero avaliadas.
A Declarao switch.
Diferente de if-then e if-then-else, a declarao switch permitida para qualquer nmero
de possveis caminhos de execuo. Uma declarao switch trabalha com os tipos de dados primitivos
byte, short, char, e int. Ela tambm trabalha com tipos enumerados e um pequeno nmero de classes
especiais que abrigam certos tipos primitivos: Character, Byte, Short, e Integer.
O seguinte programa, SwitchDemo, declara um int nomeado month cujo valor representa um
ms do ano. O programa mostra o nome do ms, baseado no valor do ms, usando a declarao switch:
class SwitchDemo {
public static void main(String[] args) {

int month = 8;
switch (month) {
case 1: System.out.println(January); break;
case 2: System.out.println(February); break;
case 3: System.out.println(March); break;
case 4: System.out.println(April); break;
case 5: System.out.println(May); break;
case 6: System.out.println(June); break;
case 7: System.out.println(July); break;
case 8: System.out.println(August); break;
case 9: System.out.println(September); break;
case 10: System.out.println(October); break;
case 11: System.out.println(November); break;
case 12: System.out.println(December); break;
default: System.out.println(Invalid month); break;
}
}
}
Neste caso, "August mostrado na sada padro.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
50
O corpo de uma declarao switch conhecido como bloco switch Qualquer declarao
imediatamente contida no bloco switch pode ser rotulada com um ou mais rtulos case ou defaut. A
declarao switch avalia esta expresso e executa o case apropriado.
Naturalmente, voc poderia tambm implementar a mesma coisa com a declarao if-then-
else:
int month = 8;
if (month == 1) {
System.out.println(January);
} else if (month == 2) {
System.out.println(February);
} ... // e assim por diante
Decidir se usa declarao if-then-else ou declarao switch algumas vezes um convite
anlise da questo. Voc pode decidir se usa um ou outro baseado na legibilidade e em outros fatores. Uma
declarao if-then-else pode ser usada para fazer decises baseadas no alcance de valores ou
condies, considerando que uma declarao switch pode fazer decises baseadas somente em um valor
inteiro simples ou enumerado.
Outro ponto interessante a declarao break depois de cada case. Cada declarao break
termina envolvendo uma declarao switch. O controle de fluxo continua com a primeira declarao
seguida do bloco switch. A declarao break necessria porque sem ela, a declarao case seguiria
sem interrupo; ou seja, sem um break explcito, o controle de fluxo seqencialmente seguiria para a
declarao case subseqente. O seguinte programa, SwitchDemo2, ilustra porque isto pode ser til para
ter declaraes case seguindo sem interrupo:
class SwitchDemo2 {
public static void main(String[] args) {
int month = 2;
int year = 2000;
int numDays = 0;
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
numDays = 31;
break;
case 4:
case 6:
case 9:
case 11:
numDays = 30;
break;
case 2:
if ( ((year % 4 == 0) && !(year % 100 == 0))
|| (year % 400 == 0) )
numDays = 29;
else
numDays = 28;
break;
default:
System.out.println(Invalid month.);
break;
}
System.out.println(Number of Days = + numDays);
}
}
A sada do programa : Number of Days = 29
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
51
As DeclaraNes while e do-while.
A declarao while executa continuamente um bloco de declaraes enquanto uma condio em
particular true (verdadeira). Esta sintaxe pode ser expressada como:
while (expresso) {
declarao (s)
}
A declarao while avalia a expresso, que deve ser um valor boolean (booleano). Se a
expresso avaliada como true, a declarao while executa a declarao (s) no bloco while. A
declarao while continua testando a expresso e executando o bloco at que o expresso seja avaliada
como false (falsa). Por exemplo, para usar a declarao while para mostrar o valor de 1 at 10 pode ser
feito como no seguinte programa WhileDemo:
class WhileDemo {
public static void main(String[] args){
int count = 1;
while (count < 11) {
System.out.println(Count is: + count);
count++;
}
}
}
Voc pode implementar um loop infinito usando a declarao while como segue:
while (true) {
// aqui vai seu cdigo
}
A linguagem de programao Java tambm fornece uma declarao do-while, que pode ser
expressada como segue:
do {
declarao (s)
} while (expresso);
A diferena entre do-while e while que do-while avalia esta expresso de baixo do loop para
cima. Por essa razo, as declaraes dentro do bloco do so sempre executadas no mnimo uma vez,
como mostra o seguinte programa DoWhileDemo:
class DoWhileDemo {
public static void main(String[] args){
int count = 1;
do {
System.out.println(Count id: + count);
count++;
} while (count <= 11);
}
}
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
52
A Declarao for.
A declarao for fornece um modo compacto para iterar um alcance de valores. Programadores
freqentemente referem-se a ela como "for loop por causa do modo em que este loop repetido at que
uma condio em particular satisfeita. A forma geral da declarao for pode ser expressada a seguinte:
for (inicializao; terminao; incremento) {
declarao (s)
}
Quando usando esta verso da declarao for, mantenha em mente que:
A expresso de iniciali>a?@o inicializa o loop; ela executada uma vez, quando o loop comea.
Quando a expresso de termia?@o avaliada como false, o loop termina.
A expresso de incremento invocada depois de cada iterao at o fim do loop; isto
perfeitamente aceitvel para esta expresso para incrementar ou decrementar um valor.
O seguinte exemplo de programa, ForDemo, usa uma forma geral para a declarao for para
mostrar os nmeros de 1 at 10 na sada:
class ForDemo {
public static void main(String[] args){
for(int i=1; i<11; i++){
System.out.println(Count is: + i);
}
}
}
A sada do programa :
Count is: 1
Count is: 2
Count is: 3
Count is: 4
Count is: 5
Count is: 6
Count is: 7
Count is: 8
Count is: 9
Count is: 10
Note como o cdigo declara uma varivel dentro da expresso de inicializao. O escopo da
varivel estende-se desta declarao para o final do bloco governado pela declarao for, ela pode ser
usada como fonte na expresso de terminao e incremento. Se a varivel que controla a declarao for
no necessria do lado de fora do loop, melhor declarar a varivel na expresso de inicializao. Os
nomes i, j, e k so freqentemente usados para controlar loops for; declarando elas dentro da expresso
de inicializao limita seu perodo de vida e reduz erros.
As trs expresses para o loop for so opcionais; um loop infinito pode ser criado como segue:
for ( ; ; ) { // loop infinito
// seu cgigo vai aqui
}
A declarao for tambm possui outras formas proporcionais para iterao dentro de
Collections e arrays. Esta forma algumas vezes referida como uma declara?@o for otimi>ado
(enhanced for), e pode ser usada para fazer seus loops mais compactos e fceis de ler. Para demonstrar,
considere o seguinte array, que recebe os nmeros de 1 a 10:
int[] numbers = {1,2,3,4,5,6,7,8,9,10};
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
53
O seguinte programa, EnhancedForDemo, usa o for otimi>ado para o loop atravessar de uma
parte a outra do arraT:
class EnhancedForDemo {
public static void main(String[] args) {
int[] numbers = {1,2,3,4,5,6,7,8,9,10};
for (int item : numbers) {
System.out.println(Count is: + item);
}
}
}
Neste exemplo, a varivel item recebe o valor corrente do arraT de nmeros A sada deste
programa a mesma de antes:
Count is: 1
Count is: 2
Count is: 3
Count is: 4
Count is: 5
Count is: 6
Count is: 7
Count is: 8
Count is: 9
Count is: 10
recomendvel usar esta forma de declarao for ao invs da forma geral sempre que possvel.
//=================================================================================
DeclaraNes de Desvio.
A Declarao break.
A declarao break tem duas formas: rotulada e n@o rotulada. Voc viu a forma no rotulada na
discusso prvia da declarao switch. Voc tambm pode usar um break sem rtulo para terminar um
loop for, while, ou do-while, como mostra o seguinte programa BreakDemo:
class BreakDemo {
public static void main(String[] args) {

int[] arrayOfInts = { 32, 87, 3, 589, 12, 1076,
2000, 8, 622, 127 };
int searchfor = 12;
int i;
boolean foundIt = false;
for (i = 0; i < arrayOfInts.length; i++) {
if (arrayOfInts[i] == searchfor) {
foundIt = true;
break;
}
}
if (foundIt) {
System.out.println(Found + searchfor + at index + i);
} else {
System.out.println(searchfor + not in the array);
}
}
}
O programa procura pelo nmero 12 no array. A declarao break termina o loop for quando o
valor encontrado. O controle de fluxo ento transfere para a declarao de sada o fim do programa. A
sada :
Found 12 at index 4
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
54
Um break sem rtulo termina uma declarao switch, for, while, ou do-while, mas um
break rotulado termina uma declarao exterior. O seguinte programa, BreakWithLabelDemo, similar
ao programa anterior, mas usa loops for aninhados para procurar por um valor em um array bi-
dimensional. Quando o valor encontrado, o break rotulado termina o loop for exterior (rotulado
"search):
class BreakWithLabelDemo {
public static void main(String[] args) {
int[][] arrayOfInts = { { 32, 87, 3, 589 },
{ 12, 1076, 2000, 8 },
{ 622, 127, 77, 955 }
};
int searchfor = 12;
int i;
int j = 0;
boolean foundIt = false;
search:
for (i = 0; i < arrayOfInts.length; i++) {
for (j = 0; j < arrayOfInts[i].length; j++) {
if (arrayOfInts[i][j] == searchfor) {
foundIt = true;
break search;
}
}
}

if (foundIt) {
System.out.println(Found + searchfor +
at + i + , + j);
} else {
System.out.println(searchfor + not in the array);
}
}
}
A sada do programa :
Found 12 at 1, 0
A declarao break termina a declaraao rotulada; ele no transfere o controlde de fluxo para o
rtulo. O controlde de fluxo transferido para a declarao imediatamente seguinte declarao rotulada
(terminada).
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
55
A Declarao continue.
A declarao continue salta a iterao corrente de um loop for, while, ou do-while. A forma
no rotulada salta para o final do corpo do loop interior e avalia a expresso booleana que controla o loop. O
seguinte programa, ContinueDemo, percorre atravs de uma String, contando as ocorrncias da letra
"p. Se o caracter corrente no um p, a declarao continue salta o resto do loop e continua no prximo
caracter. Se ele um "p, o programa incrementa o contador de letras count.
class ContinueDemo {
public static void main(String[] args) {

String searchMe = peter piper picked a peck of pickled peppers;
int max = searchMe.length();
int numPs = 0;
for (int i = 0; i < max; i++) {
// interessado somente em p's
if (searchMe.charAt(i) != 'p')
continue;
// processa p's
numPs++;
}
System.out.println(Found + numPs + p's in the string.);
}
}
Esta a sada do programa:
Found 9 p's in the string.
Para ver o efeito mais claramente, tente remover a declarao continue e recompile. Quando
voc rodar o programa novamente o contador estar errado, dizendo que encontrou 35 p's ao invs de 9.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
56
Uma declarao rotulada continue salta a iterao corrente de um outro loop marcado com o
rtulo dado. O seguinte programa exemplo, ContinueWithLabelDemo, usa loops aninhados para
procurar por uma substring dentro de uma string. Dois loops aninhados so requeridos: um para iterar
acima a substring e um para iterar acima a string sendo procurada. O sequinte programa,
ContinueWithLabelDemo, usa a forma rotulada de continue para saltar uma iterao em outro loop.
class ContinueWithDemo {
public static void main(String[] args) {

String searchMe = Look for a substring in me;
String substring = sub;
boolean foundIt = false;
int max = searchMe.length() - substring.length();
test:
for (int i = 0; i <= max; i++) {
int n = substring.length();
int j = i;
int k = 0;
while (n-- != 0) {
if (searchMe.charAt(j++)
!= substring.charAt(k++)) {
continue test;
}
}
foundIt = true;
break test;
}
System.out.println(foundIt ? Found it :
Didn't find it);
}
}
Esta a sada do programa:
Found it
A Declarao return.
A ltima das declaraes de desvio a declarao return. A declarao return sai do mtodo
corrente, e o controle de fluxo retorna para onde o mtodo foi invocado. A declarao return tem duas
formas: uma que retorna um valor, uma que no. Para retornar um valor, simplesmente coloque o valor (ou
a expresso que calcula o valor) depois da palavra reservada return.
return ++count
O tipo de dado do valor retornado deve ser igual ao tipo do mtodo declarado para retornar o valor.
Quando um mtodo declarado void (vazio), use a forma return que no retorna um valor.
return
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
57
7lasses.
Na introduo aos conceitos de orientao a objeto foi usado uma classe Bicycle em um exemplo,
com racing bikes, mountain bikes, e tandem bikes como subclasses. Aqui est um cdigo exemplo para
uma possvel implementao de uma classe Bicycle, para dar uma viso geral de uma declarao de
classe. A seo subseqente desta lio explicar declaraes de classe passo a passo:
public class Bicycle {
// a classe Bicycle tem trs campos
public int cadence;
public int gear;
public int speed;
// a classe Bicycle tem um construtor
public Bicycle(int startCadence, int startSpeed, int startGear) {
gear = startGear;
cadence = startCadence;
speed = startSpeed;
}
// a classe Bicycle tem quatro mtodos
public void setCadence(int newValue) {
cadence = newValue;
}
public void setGear(int newValue) {
gear = newValue;
}
public void applyBrake(int decrement) {
speed -= decrement;
}
public void speedUp(int increment) {
speed += increment;
}
}
A declarao de classe para uma classe MountainBike que uma subclasse de Bicycle poderia
ser parecida com isto:
public class MountainBike extends Bicycle {
// a subclasse MountainBike tem um campo
public int seatHeight;
// a subclasse MountinBike tem um construtor
public MountainBike(int startHeight, int startCadence, int startSpeed,
int startGear) {
super(startCadende, startSpeed, startGear);
seatHeight = startHeight;
}
// a suclasse MountainBike tem um mtodo
public void seatHeight(int newValue) {
seatHeight = newValue;
}
}
MountainBike herda todos os campos e mtodos de Bicycle e adiciona o campo seatHeight
e um mtodo para inici-lo (mountain bikes tm assentos (seats) que podem ser movidos acima e abaixo
de acordo com o terreno).
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
58
Declarando 7lasses.
Voc deve ter visto classes definidas no seguinte estilo:
class MyClass {
// declaraes de campo, construtor, e mtodos
}
sto uma declara?@o de classe. O corpo da classe (a rea entre as chaves) contm todo o
cdigo que prepara o ciclo de existncia dos objetos criados da classe: construtores para inicializar novos
objetos, declaraes para os campos que fornecem o estado da classe deste objeto, e mtodos para
implementar o comportamento da classe e seus objetos.
Voc pode fornecer mais informaes a respeito da classe, como o nome de sua superclasse, se
ela implementa alguma interface e assim por diante, no incio da declarao da classe. Por exemplo,
class MyClass extends MySuperClass implements YourInterface {
// declaraes de campos, construtores e mtodos
}
informa que MyClass uma subclasse de MySuperClass e que implementa a interface
YourInterface.
Voc tambm pode adicionar modificadores como public ou private. Os modificadores public
e private determinam se outra classe pode acessar MyClass. A lio sobre inter'aces e "eranas
explicar como e porque voc deve usar as palavras reservadas extends e implements em uma
declarao de classe.
Em geral, declaraes de classes podem incluir estes componentes, em ordem:
Modificadores como public, private, e outros que voc encontrar mais tarde.
O nome da classe, com a letra inicial em maiscula por conveno.
O nome da classe pai (superclasse), nesse caso, precedido pela palavra reservada extends. Uma
classe s pode estender (subclasse) um pai.
Uma lista de interfaces separadas por vrgula implementadas pela classe, nesse caso, precedida
pela palavra reservada implements. A classe pode implementar mais de uma interface.
O corpo da classe, envolvida por chaves.
Declarando !embros )ari&veis.
H vrios tipos de variveis:
Membros variveis em uma classe estas so chamadas fields (campos).
Variveis em um mtodo ou bloco de cdigo estas so chamadas vari8veis locais.
Variveis na declarao do mtodo estas so chamadas par5metros.
A classe Bicycle usa as seguintes linhas de cdigo para definir estes campos:
public int cadence;
public int gear;
public int speed;
Declaraes de campo so compostas de trs componentes, em ordem:
Zero ou mais modificadores, como um public ou private.
O tipo de campo.
O nome do campo.
Os campos Bicyce so nomeados cadence, gear, e speed e so todos tipos de dado inteiro
(int). A palavra reservada public identifica estes campos como membros pblicos, acessveis por
qualquer objeto que acesse a classe.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
59
!odi'icadores de Acesso.
O primeiro modificador (mais esquerda) usado deixa voc controlar se outras classes tm acesso
a um campo membro. Por este momento, considere somente public e private. Outros modificadores de
acesso sero discutidos mais tarde.
Modificador public este campo acessvel de todas as classes.
Modificador private este campo acessvel somente dentro da prpria classe.
No esprito do encapsulamento, comum fazer campos private. sto faz com que somente sejam
acessados diretamente da classe Bicycle. Ns poderemos precisar acessar estes valores, no entanto. sto
pode ser feito indiretamente adicionando o mtodo public que obtm um valor de campo para ns:
public class Bicycle {
private int cadence;
private int gear;
private int speed;
public Bicycle(int startCadence, int startSpeed, int startGear) {
gear = startGear;
cadende = startCadence;
speed = startSpeed;
}
public int getCadence() {
return cadence;
}
public void setCadence(int newValue) {
cadence = newValue;
}
public int getGear() {
return gear;
}
public void setGear(int newValue) {
gear = newValue;
}
public int getSpeed() {
return speed;
}
public void applyBrake(int decrement) {
speed -= decrement;
}
public void speedUp(int increment) {
speed += increment;
}
}
UUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
60
De'inindo !Qtodos.
Aqui est um tpico exemplo de declarao de mtodo:
public double calculateAnswer(double sinSpan, int numberOfEngines,
double length, double grossTons) {
// faa os clculos aqui
}
Os nicos elementos requeridos de uma declarao de mtodo o tipo de retorno do mtodo,
nome, um par de parenteses, (),e o corpo entre chaves, {}.
De forma geral, declaraes de mtodos tm seis componentes, em ordem:
!odi'icadores como public, private, e outros que voc aprender mais tarde.
O tipo de retorno o tipo de dado do valor retornado pelo mtodo, ou void se o mtodo
no retorna um valor.
O nome do mQtodo as regras para nomes de campos se aplicam para o nome de
mtodos tambm, mas a conveno um pouco diferente.
A lista de par#metros entre par8nteses uma vrgula delimita a lista de parmetros de
sada, precedida pelo seu tipo de dado, envolvida por parnteses, (). Se no h
parmetros, voc simplesmente usa parnteses vazios.
3ma lista de eEceNes que ser discutida mais tarde.
O corpo do mQtodo; envolvido entre c"aves o cdigo do mtodo incluindo a declarao
de variveis locais, vai aqui.
Modificadores, tipos de retorno, e parmetros sero discutidos mais tarde nesta lio. Excees
sero discutidas em outra lio.
De'inio: dois componentes de uma declarao de mtodo compem a assinatura do mtodo o
nome do mtodo e os tipos de parmetros.
A assinatura do mtodo declarado acima mencionado:
calculateAnswer(double, int, double, double)
%omeando um !Qtodo.
Apesar de um nome de mtodo poder ser qualquer identificador vlido, convenes de cdigo
restringem a nomeao de mtodos. Por conveno nomes de mtodos devem ser um verbo em letras
minsculas ou uma palavra composta que comea com um verbo em letras minsculas, seguida por
adjetivos, substantivos, etc. Em nomes compostos, a primeira letra de cada segunda e seguintes palavras
deve ser maiscula. Aqui est um exemplo:
run
runFast
getBackground
getFinalData
compareTo
setX
isEmpty
Tipicamente, um mtodo tem um nico nome dentro da classe. No entanto, um mtodo pode ter o
mesmo nome de outro mtodo previsto para method overloading (mtodo sobrecarregado).
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
61
!Qtodos sobrecarregados *overloading met"ods+.
A linguagem de programao Java suporta mtodos sobrecarregados, e Java pode distinguir entre
mtodos com diferentes assinaturas. sto significa que mtodos dentro de uma classe podem ter o mesmo
nome se eles tiverem diferentes listas de parmetros (h alguns requisitos para isso que sero discutidos na
lio "nterfaces e Herana).
Supondo que voc tem uma classe que pode usar caligrafia para desenhar vrios tipos de dados
(strings, integers, a assim por diante) e que contm um mtodo para desenhar cada tipo de dado.
incmodo usar um novo nome para cada mtodo por exemplo, drawString, drawInteger,
drawFloat, e assim por diante Na linguagem de programaao Java, voc pode usar o mesmo nome para
todos os mtodos de desenho passando uma lista de argumentos diferentes para cada mtodo. Desse
modo, a classe que desenha dados pode declarar quatro mtodos nomeados draw, cada um com uma lista
de parmetros diferente.
Public class DataArtist {
...
public void draw(String s) {
...
}
public void draw(int i) {
...
}
public void draw(double f) {
...
}
public void draw(int i, double f) {
...
}
}
Mtodos sobrecarregados so diferenciados pelo nmero e o tipo de argumentos passados no
mtodo. No cdigo exemplo, draw(String s) e draw(int i) so mtodos distintos e nicos porque
requerem diferentes tipos de argumentos.
Voc no pode declarar mais de um mtodo com o mesmo nome e mesmo nmero e tipo de
argumentos, porque o compilador no pode distingu-los como diferentes.
O compilador no considera tipo de retorno quando diferenciando mtodos ento voc no pode
declarar dois mtodos com a mesma assinatura se eles tm um tipo de retorno diferente.
%otaG Mtodos sobrecarregados deveriam ser usados raramente, pois podem fazer seu cdigo
muito menos legvel.
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
62
Produ-indo 7onstrutores para suas 7lasses.
Uma classe contm construtores que so invocados para criar objetos da classe projetada.
Declaraes de construtores parecem com declaraes de mtodos exceto que elas usam o nome da
classe e no tm tipo de retorno. Por exemplo, Bicycle tem um construtor:
public Bicycle(int startCadence, int startSpeed, int startGear) {
gear = startGear;
cadence = startCadence;
speed = startSpeed;
}
Para criar um novo objeto Bicycle chamado myBike, um construtor chamado pelo operador
new:
Bicycle myBike = new Bicycle(30, 0, 8);
new Bicycle(30, 0, 8) cria espao na memria para o objeto e inicializa estes campos.
Apesar de Bicycle s ter um construtor, ele poderia ter outros, incluindo um construtor sem
argumentos:
public Bicycle() {
gear = 1;
cadence = 10;
speed = 0;
}
Bicycle yourBike = new Bicycle(); invoca um construtor sem argumento para criar um
novo objeto Bicycle chamado yourBike.
Ambos os construtores poderiam ser declarados em Bicycle porque tm diferentes listas de
argumentos. Assim como mtodos, a plataforma Java diferencia construtores baseada no nmeros de
argumentos na lista de seus tipos. Voc no pode escrever dois construtores que tm o mesmo nmero e
tipo de argumentos para a mesma classe, porque a plataforma no poderia diferenci-los. Se fizer assim,
causar um erro em tempo de compilao.
Voc no pode fornecer qualquer construtor para sua classe, mas voc pode ser cuidadoso ao fazer
isso. O compilador automaticamente fornece um construtor padro sem argumento para qualquer classe
sem construtores. O construtor padro (default) poder chamar o construtor sem argumento da
superclasse. Nesta situao, o compilador verifica se a superclasse no tem um construtor sem
argumentos, ento voc precisa certificar-se de que ele tenha. Se sua classe no tem uma superclasse
explcita, ento ele precisa de uma superclasse implcita do Object, o qual trabalha possuindo um
construtor sem argumento.
Voc pode usar uma superclasse construtora dela mesma. A classe MountinBike no comeo da
lio faz justamente isso. sso ser discutido mais tarde, na lio sobre interfaces e herana.
Voc pode acessar modificadores em uma declarao de construtor para controlar como outras
classes podem chamar o construtor.
%otaG Se qualquer classe no pode chamar um construtor MyClass, ela no pode criar
diretamente objetos MyClass.
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
63
Passando ,n'ormaNes para um !Qtodo um um 7onstrutor.
A declarao para um mtodo ou um construtor declara o nmero e o tipo de argumentos para
aquele mtodo ou construtor. Por exemplo, o seguinte mtodo computa os pagamentos mensais para uma
casa de emprstimos, baseado no valor do emprstimo, na taxa de juros, o tamanho do emprstimo (o
nmero de perodos), e o valor futuro do emprstimo:
public double computePayment(double loanAmt,
double rate,
double futureValue,
int numPeriods) {
double interest = rate / 100.0;
double partial1 = Math.pow((1 + interest), -numPeriods);
double denominador = (1 - partial1) / interest;
double answer = (-loanAmt / denominador)
- (( futureValue * partial1) / denominador);
return answer;
}
Este mtodo tem quatro parmetros: o montante do emprstimo, a taxa de juros o valor futuro e o
nmero de perodos. Os primeiros trs so nmeros de pontos flutuantes de dupla preciso, e o quarto um
inteiro. Os parmetros so usados no corpo de mtodo e em tempo de execuo recebero nos valores os
argumentos que sero passados nele.
%otaG *ar5metros referem-se lista de variveis na declarao do mtodo. )rgumentos so os
valores atuais que so passados nele quando o mtodo invocado. Quando voc invoca um mtodo, os
argumentos usados precisam coincidir com a declarao dos parmetros em tipo e ordem.
//=================================================================================
Tipos de Par#metros.
Voc pode usar qualquer tipo de dado para um parmetro de um mtodo ou construtor. sto inclui
tipos de dados primitivos, como doubles, floats, e integers, como voc viu no mtodo computePayment,
e referncia a tipos de dados, como os objetos e arrays.
Aqui est um exemplo de um mtodo que aceita um array em um argumento. Neste exemplo, o
mtodo cria um novo objeto Polygon e inicializa ele de um objeto array de Point (assuma que Point
uma classe que representa uma coordenada x, y):
public Polygon polygonFrom(Point[] corners) {
// corpo do mtodo vai aqui
}
%otaG A linguagem de programao Java no deixa voc passar mtodos em mtodos. Mas voc
pode passar um objeto em um mtodo e ento invocar o mtodo do objeto.
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
64
%Smero Arbitr&rio de Argumentos.
Voc pode usar um construtor chamado varargs para passar um nmero arbitrrio de valores para
um mtodo. Voc usa varargs quando voc no sabe como muitos argumentos de um tipo em particular
sero passados para o mtodo. sto um atalho para a criao manual de um array (o mtodo prvio
poderia usar varargs preferivelmente ao array).
Para usar varargs, voc segue o tipo do ltimo parmetro por reticncias (trs pontos, ...), ento um
espao, e o nome do parmetro. O mtodo pode ento ser chamado com qualquer nmero daquele
parmetro, inclusive nenhum.
public Polygon polygonFrom(Point... corners) {
int numberOfSides = corners.length;
double squareOfSide1, lengthOfSide1;
squareOfSide1 = (corners[1].x - corners[0].x)*(corners[1].x - corners[0].x)
+ (corners[1].y - corners[0].y)*(corners[1].y - corners[0].y);
lengthOfSide1 = Math.sqrt(squareOfSide1);
// mais cdigos do corpo de mtodo seguem o que foi criado
// e retornam um polgono conectando pontos
}
Voc pde ver que dentro do mtodo, corners (ngulos) so tratados como um array. O mtodo
pode ser chamado igualmente com um array ou com uma seqncia de argumentos. O cdigo no corpo do
mtodo tratar o parmetro como um array em qualquer caso.
Voc ver mais comumente varargs com os mtodos printing; por exemplo, este mtodo printf:
public PrintStream printf(String format, Object... args)
permite a voc mostrar um arbitrrio nmero de objetos. Ele pode ser chamado assim:
System.out.println(%s: %d, %s%n, name, idnum, address);
ou algo como isto:
System.out.println(%s: %d, %s, %s, %s%n, name, idnum, address, phone,
email);

ou ainda com um nmero diferente de argumentos.
//=================================================================================
%omes de Par#metros.
Quando voc declara um parmetro para um mtodo ou um construtor, voc fornece um nome para
aquele parmetro. Este nome usado dentro do corpo de mtodo para referir-se para o argumento
passado.
O nome do parmetro precisa ser nico neste escopo. Ele no pode ter o mesmo nome de outro
parmetro para o mesmo mtodo ou construtor, e ele no pode ser o nome de uma varivel local dentro do
mtodo ou construtor.
Um parmetro pode ter o mesmo nome que um campo da classe. Se este o caso, o parmetro
chamado para sombrear o campo. Sombreamento de campos pode fazer seu cdigo difcil de ler e
convencionalmente usado somente dentro de construtores e mtodos que apontam um campo em
particular. Por exemplo, considere a seguinte classe Circle e seu mtodo setOrigin:
public class Circle {
private int x, y, radius;
public void setOrigin(int x, int y) {
...
}
}
A classe Circle teve trs campos: x, y, e radius. O mtodo setOrigin teve dois parmetros,
cada um deles teve o mesmo nome de um dos campos. Cada parmetro de mtodo sombreou o campo que
compartilha seu nome. Ento usando os nomes simples x e y dentro do corpo do mtodo referiu ao
parmetro, no ao campo. Para acessar o campo, voc precisaria usar um nome qualificador. sto ser
discutido mais tarde na lio entiltulada "Usando a Palavra Reservada this.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
65
Passando Argumentos de Tipos Primitivos de Dados.
Argumentos primitivos, como um int ou um double, so passados nos mtodos por valor. sto
significa que quaisquer mudanas nos valores dos parmetros existem somente dentro do escopo do
mtodo. Quando o mtodo retornar, o parmetro ser dado e qualquer mudanas nele sero perdidas. Aqui
est um exemplo:
public class PassPrimitiveByValue {

public static void main(String[] args) {
int x = 3;
// invoca passMethod() com x como argumento
passMethod(x);
// mostra x para ver se este valor voi modificado
System.out.println(Depois de invocar passMethod, x = + x);
}
// muda o parmetro em passMethod()
public static void passMethod(int p) {
p = 10;
}
}
Quando voc roda o programa, a sada :
Depois de invocar passMethod, x = 3
Passando (e'er8ncia de Argumentos de Tipos de Dados.
Parmetros de Referncia de Tipos de Dados, assim como em objetos, so tambm passados nos
mtodos por valor. sto significa que quando o mtodo retorna, a referncia passada referencia o mesmo
objeto como antes. No entanto, os valores dos campos do objeto podem ser mudados no mtodo se eles
tiverem o prprio acesso nivelado.
Por exemplo, considere o mtodo em uma classe arbitrria que move um objeto Circle:
public void moveCircle(Circle circle, int deltaX, int deltaY) {
// cdigo para mover origem do crculo para x+deltaX, y+deltaY
circle.setX(circle.getX() + deltaX);
circle.setY(circle.getY() + deltaY);
// cdigo para apontar uma nova referncia para o crculo
circle = new Circle(0, 0);
}
Deixe o mtodo ser invocado com estes argumentos:
moveCircle(myCircle, 23, 56)
Dentro do mtodo, circle incialmente refere-se para myCircle. O mtodo muda as coordenadas
x e y do objeto ao qual circle faz referncia (i.e., myCircle) para 23 e 56, respectivamente. Essas
mudanas persistiro quando o mtodo retornar. Ento circle apontado para referenciar para um novo
objeto Circle com x = y = 0. A redesignao no permanece, no entanto, porque a referncia foi
passada nele por valor e no pode mudar. Dentro do mtodo, o objeto dirigido para circle foi mudado,
mas, quando o mtodo retornar, myCircle no obstante referencia o mesmo objeto Circle do mesmo
modo que antes do mtodo ser chamado.
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
66
Objetos.
Um programa tpico Java cria muitos objetos, que como voc tem visto, interagem invocando
mtodos. Durante a interao desses objetos, o programa pode executar vrias tarefas, como uma
implementao de uma &'(, rodar animaes, ou mandar e receber informaes entre uma rede. Logo que
um objeto termina o trabalho para o qual foi criado, seus recursos so reciclados para uso de outros objetos.
Aqui est um pequeno programa, chamado CreateObjectDemo, que cria trs objetos: um objeto
Point e dois objetos Retangle. Voc precisar de todos os trs arquivos fonte para compilar o programa:
public class CreateObjectDemo {
public static void main(String[] args) {
// Declara e cria um objeto ponto
// e dois objetos retngulo.
Point originOne = new Point(23, 94);
Rectangle rectOne = new Rectangle(originOne, 100, 200);
Rectangle rectTwo = new Rectangle(50, 100);
// mostra largura, altura e rea de rectOne
System.out.println(Largura de rectOne: + rectOne.width);
System.out.println(Altura de recOne: + rectOne.height);
System.out.println(rea de rectOne: + rectOne.getArea());
// aponta para a posio de rectTwo
rectTwo.origin = originOne;
// mostra a posio de rectTwo
System.out.println(Posio X de rectTwo: + rectTwo.origin.x);
System.out.println(Posio Y de rectTwo: + rectTwo.origin.y);
// move rectTwo e mostra sua nova posio
rectTwo.move(40, 72);
System.out.println(Posio X de rectTwo: + rectTwo.origin.x);
System.out.println(Posio Y de rectTwo: + rectTwo.origin.y);
}
}
O programa cria, manipula, e mostra informaes sobre vrios objetos. Aqui est a sada:
Largura de rectOne; 100
Altura de rectOne: 200
Area de rectOne: 20000
Posio X de rectTwo: 23
Posio Y de rectTwo: 94
Posio X de rectTwo: 40
Posio Y de rectTwo: 72
As trs sesses seguintes usam o exemplo anterior para descrever o ciclo de existncia de um
objeto dentro de um programa. Nelas, voc aprender como escrever cdigos que criam e usam objetos em
seus prprios programas. Voc aprender tambm como o sistema limpo depois que um objeto tem sua
existncia terminada.
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
67
7riando Objetos.
Como voc sabe, classes fornecem o projeto para objetos; voc cria um objeto de uma classe.
Cada uma das declaraes seguintes retiradas do programa CreateObjectDemo cria um objeto e atribui
ele para uma varivel:
Point originOne = new Point(23, 94);
Rectangle rectOne = new Rectangle(originOne, 100, 200);
Rectangle rectTwo = new Rectangle(50, 100);
A primeira linha cria um objeto da classe Point, e a segunda e a terceira linhas cria cada uma um
objeto da classe Rectangle.
Cada uma dessas declaraes tem trs partes:
Declarao: O cdigo no incio de cada linha que associa o nome da varivel com o tipo do objeto.
,nstanciao: A palavra reservada new um operador Java que cria o objeto.
,niciali-ao: O operador new seguido por uma chamada para um construtor, que inicializa o
novo objeto.
Declarando uma )ari&vel para /a-er (e'er8ncia a um Objeto.
Primeiramente, voc aprendeu que para voc declarar uma varivel, voc escreve:
type name;
sto avisa o compilador que voc usar name para referir-se a um dado que tem o tipo type. Com
as variveis primitivas, esta declarao tambm reserva a quantidade apropriada de memria para a
varivel.
Voc tambm pode declarar uma referncia a uma varivel na prpria linha. Por exemplo:
Point originOne;
Se voc declarar originOne dessa forma, este valor ser indeterminado at que um objeto seja
criado e atribudo para ele. Simplesmente declarando um referncia varivel no cria um objeto. Para isto,
voc precisa usar o operador new, como descrito na seo seguinte. Voc precisa nomear um objeto para
originOne antes de voc us-lo em seu cdigo. Do contrrio, haver um erro de compilao.
Uma varivel neste estado, que no referencia em direo a um objeto, pode ser ilustrada como
segue (a varivel name, originOne, mais a referncia apontando para nenhum lugar).
,nstanciando uma 7lasse.

O operador new instancia uma classe alocando memria para um novo objeto e retornando a
referncia para aquela memria. O operador new tambm invoca o construtor do objeto.
%otaG A frase "instanciando uma classe significa a mesma coisa que "criando um objeto. Quando
voc cria um objeto, voc est criando uma "instncia da classe, portanto, "instanciando uma classe.
O operador new requer um simples argumento escrito aps o mesmo: uma chamada para um
construtor. O nome do construtor fornece o nome da classe para instanciar.
O operador new retorna uma referncia para o objeto que foi criado. Esta referncia usualmente
atribuda a uma varivel do tipo apropriado, como:
Point originOne = new Point(23, 94);
A referncia retornada pelo operador new no tem que ser a atribuio da varivel. Ela tambm
pode usar diretamente uma expresso. Por exemplo:
int height = new Rectangle().height;
Esta declarao ser discutida na prxima seo.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
68
,niciali-ando um Objeto.
Aqui est um cdigo para a classe Point:
public class Point {
public int x = 0;
public int y = 0;
//construtor
public Point(int a, int b) {
x = a;
y = b;
}
}
Esta classe contm um construtor simples. Voc pode identificar o construtor porque esta
declaraao usa o mesmo nome que a classe e ela no retorna tipo. O construtor na classe Point pega dois
argumentos inteiro, como declarado pelo cdigo (int a, int b). A seguinte declarao fornece os
valores 23 e 94 como valores para esses argumentos:
Point originOne = new Point(23, 94);
O resultado da execuo dessa declarao pode ser ilustrado na prxima figura:
Aqui est o cdigo para a classe Rectangle, que contm quatro construtores:
public class Rectangle {
public int width = 0;
public int height = 0;
public Point origin;
// quatro construtores
public Rectangle() {
origin = new Point(0, 0);
}
public Rectangle(Point p) {
origin = p;
}
public Rectangle(int w, int h) {
origin = new Point(0, 0);
width = w;
height = h;
}
public Rectangle(Point p, int w, int h) {
origin = p;
width = w;
height = h;
}
// um mtodo para mover o retngulo
public void move(int x, int y) {
origin.x = x;
origin.y = y;
}
// um mtodo para computar a rea do retngulo
public int getArea() {
return width * height;
}
}
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
69
Cada construtor deixa voc fornecer valores iniciais para o tamanho e largura do retngulo, usando
ambos tipos primitivos e de referncia. Se a classe tem mltiplos construtores, eles precisam ter diferentes
atribuies. O compilador Java diferencia os construtores baseado no nmero e no tipo de argumentos.
Quando o compilador Java encontra o seguinte cdigo, ele sabe como chamar o construtor na classe
Rectangle que requer um argumento Point seguido por dois argumentos inteiros:
Rectangle rectOne = new Rectangle(originOne, 100, 200);
sto chama um dos construtores de Rectangle que inicializa origin para originOne. Tambm, o
construtor aponta width para 100 e height para 200. Agora h duas referencias para o mesmo Point
object um objeto pode ter mltiplas referncias como esta, como mostrado na seguinte figura:
A seguinte linha de cdigo chama o construtor Rectangle que requer dois argumentos inteiros,
que fornecem os valores iniciais para width e height. Se voc inspecionar o cdigo dentro do construtor,
voc ver que criado um novo objeto Point onde os valores x e y so inicializados com 0.
Rectangle rectTwo = new Rectangle(50, 100);
O construtor Rectangle usado na seguinte declarao no pega nenhum argumento, ento ele
chamado de no2argument constructor (construtor sem argumento).
Rectangle rect = new Rectangle();
Todas as classes tm no mnimo um construtor. Se a classe no declara nenhum explicitamente, o
compilador Java automaticamente fornece um construtor sem argumento, chamado default constructor
(construtor padro). Este construtor padro chama o construtor da classe sem argumento pai, ou o Object
construtor se a classe no tem outro pai. Se o pai no tem um construtor (Object no tem um, o
compilador rejeitar o programa.
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
70
3sando Objetos.
Uma vez que voc cria um objeto, voc provavelmente quer us-lo para alguma coisa. Voc pode
precisar usar o valor de um de seus campos, mudar um desses campos, ou chamar um de seus mtodos
para executar uma ao.
(e'erenciando um 7ampo de Objeto.
Campos de objeto so acessveis pelo seu nome Voc precisa usar um nome que no seja
ambgo.
Voc pode usar um nome simples para um campo dentro de sua classe. Por exemplo, ns podemos
adicionar a declarao dentro da classe Rectangle que mostra a width (largura) e a height (altura):
System.out.println(Width and height are: + width + , + height);
Neste caso, 5idt" e "eig"t so nomes simples.
O cdigo que est fora da classe do objeto precisa usar uma referncia ao objeto ou expresso,
seguida por um operador ponto ( . ), seguido por um nome de campo simples, como em:
objectReference.fieldName
Por exemplo, o cdigo na classe CreateObjectDemo est fora do cdigo da classe Rectangle.
Ento para fazer referncia para os campos origin, width, e height no objeto Rectangle nomeado
rectOne, a classe CreateObjectDemo precisa usar os nomes rectOne.origin, rectOne.width e
rectOne.height, respectivamente. O programa usa dois desses nomes para mostrar a width e a
height de rectOne:
System.out.println(Width of rectOne: + rectOne.width);
System.out.println(Height of rectOne: + rectOne.height);
Tentar usar os nomes simples width e height para o cdigo na classe CreateObjectDemo no
faz muito sentido esses campos existem somente dentro do objeto e resulta em um erro de compilao.
Mais tarde, o programa usa um cdigo similar para mostrar a informao sobre rectTwo. Objetos
do mesmo tipo tm suas cpias reconhecidas dos mesmos campos da instncia. Desse modo, cada objeto
Rectangle teve seus campos nomeados como origin, width, e height. Quando voc acessa uma
instncia do campo diretamente em uma referncia de objeto, voc faz referncia quele campo do objeto
em particular. Os dois objetos rectOne e rectTwo no programa CreateObjectDemo tm diferentes
campos origin, width, e height.
Para acessar um campo, voc pode usar uma referncia nomeada para um objeto, como no
exemplo anterior, ou voc pode usar qualquer expresso que retorna uma referncia ao objeto. Relembre
que o operador new retorna uma referncia para um objeto. Ento voc poderia usar o valor retornado de
new para acessar um novo campo do objeto:
int height = new Rectangle().height;
Esta declarao cria um novo objeto Rectangle e imediatamente consegue sua altura. Em
essncia, a declarao calcula a altura default (padro) de um Rectangle. Note que depois da declarao
ser executada, o programa no prolonga uma referncia para o Rectngulo criado, porque o programa
nunca armazena a referncia em nenhum lugar. O objeto perde a referncia, e estes recursos esto livres
para serem reciclados pela Java )irtual !ac"ine.

//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
71
7"amando um !Qtodo de Objeto.
Voc tambm usa uma referncia a um objeto para invocar um mtodo de objeto. Voc junta o
nome simples do mtodo referncia ao objeto, com um operador ponto ( . ) intervindo. Alm disso, voc
fornece, dentro de parnteses, qualquer argumento para o mtodo. Se o mtodo no requer nenhum
argumento, use parntese vazios.
objectReference.methodName(argumentList);
or
objectReference.methodName();
A classe retngulo tem dois mtodos:getArea() para calcular a rea do retngulo e move() para
mudar a origem do retngulo. Aqui est o cdigo CreateObjectDemo que invoca esses dois mtodos:
System.out.println(Area of rectOne: + rectOne.getArea());
...
rectTwo.move(40, 72);
A primeira declarao invoca o mtodo getArea*+ de rectOne e mostra os resultados. A segunda
linha move rectT5o porque o mtodo move*+ recebe novos valores para o objeto origin.E e origin.T.
Assim como instncia de campos, object1eference pode ser uma referncia a um objeto. Voc
pode usar um nome varivel, mas voc tambm pode usar qualquer expresso que retorna uma referncia
ao objeto. O operador new retorna uma referncia ao objeto, ento voc pode usar o valor retornado de new
para invocar um novo mtodo de objeto:
new Rectangle(100, 50).getArea()
A expresso new Rectangle(100, 50) retorna uma referncia ao objeto que aponta para um
objeto Rectangle. Como mostrado, voc pode usar a notao de ponto ( . ) para invocar um novo
mtodo getArea() de Rectangle para calcular a rea de um novo retngulo.

Alguns mtodos, como um getArea(), retornam um valor. Para mtodos que retornam um valor,
voc pode usar a invocao de mtodos em expresses. Voc pode atribuir o valor retornado para uma
varivel, usando os comandos de deciso, ou controlando um loop. Este cdigo atribui o valor retornado por
getArea() para a varivel areaOfRectangle:
int areaOfRectangle = new Rectangle(100, 50).getArea();
Relembre, invocando um mtodo em um objeto em particular, o mesmo que mandar uma
mensagem para aquele objeto. Neste caso, o objeto getArea() que invocado o retngulo retornado
pelo construtor.
//=================================================================================
O Farbage 7ollector *7oletor de LiEo de !em:ria+.
Algumas linguagens de orientao a objeto requerem que voc mantenha rastros para todos os
objetos que voc cria e que voc destrua explicitamente eles quando no so mais necessrios.
Gerenciamento de memria manual tedioso e passvel de erros. A plataforma Java permite a voc criar
quantos objetos voc quiser (limitados, claro, pelo que seu sistema pode controlar), e voc no tem que
se preocupar em destru-los. O ambiente Java de runtime (tempo de execuo) deleta objetos quando est
determinado que eles no sero mais usados. Esse processo chamado de garbage collection.
Um objeto destinado para o garbage collection quando no h mais referncias para aquele
objeto. Referncias que so mantidas em uma varivel so usualmente pingadas quando a varivel sai fora
do escopo. Ou, voc pode explicitamente pingar uma referncia a um objeto indicando a varivel para o
valor especial null. Relembre que o programa pode fazer mltiplas referncias para o mesmo objeto; todas
as referncias para um objeto precisam ser pingadas antes que o objeto seja destinado para o garbage
collector.
O ambiente Java de runtime (tempo de execuo) tem um garbage collector que periodicamente
libera a memria usada pelos objetos que no so mais referenciados. O garbage collector no faz seu
trabalho automaticamente quando determinado que o tempo prioridade.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
72
!ais Sobre 7lasses.
(etornando um valor de um !Qtodo.
Um mtodo retorna para o cdigo que o invocou quando ele:
completa todas as declaraes no mtodo,
atinge a declarao return,
lana uma exceo (assunto coberto mais adiante),
seja qual for que ocorra primeiro.
Voc declara um tipo de retorno do mtodo na declarao do mtodo. Dentro do corpo do mtodo,
voc usa a declarao return para retornar o valor.
Qualquer mtodo declarado como void no retorna um valor. Ele no precisa conter uma
declarao return, mas pode fazer dessa maneira. Em qualquer caso, uma declarao return pode ser
usada para ramificar o bloco de controle de fluxo e sair do mtodo e isso feito simplesmente assim:
return
Se voc tentar retornar um valor de um mtodo que declarado void, voc conseguir um erro de
compilao.
Qualquer mtodo que no declarado void pode conter uma declarao return com o
correspondente valor de retorno, dessa forma:

return returnValue;
O tipo de dado de um valor retornado precisa coincidir com o tipo de retorno declarado no mtodo;
voc no pode retornar um valor inteiro de um mtodo declarado pra retornar um boolean.
O mtodo getArea() na classe Rectangle que foi discutida na seo sobre objetos retorna um
inteiro:
// um mtodo para calcular a rea de um retngulo
public int getArea() {
return width * height;
}
Este mtodo retorna o inteiro que a expresso width * height calcula.
O mtodo area retorna um tipo primitivo. Um mtodo pode tambm retornar uma referncia ao tipo.
Por exemplo, no programa para manipular objetos Bicycle, ns poderamos ter um mtodo como este:
public Bicycle seeWhosFastest(Bicycle myBike, Bicycle your Bike,
Environment env) {
Bicycle fastest;
// cdigo para calcular qual bike mais rpida, dando
// a cada bike uma marcha e cadncia e dando
// o ambiente (terreno e vento)
return fastest;
}
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
73
(etornando uma 7lasse ou ,nter'ace.
Se esta seo confundir voc, pule e retorne para ela depois que voc tiver terminado a lio sobre
interfaces e herana.
Quando um mtodo usa um nome de classe como o tipo de retorno, como em whosFastest faz, o
tipo da classe do objeto retornando precisa ser tambm uma subclasse, ou a classe exata do tipo de
retorno. Supondo que voc tenha uma hierarquia de classe em que ImaginaryNumber uma subclasse
de java.lang.Number, que est a servio como uma subclasse de Object, como ilustrado na seguinte
figura:

Agora suponha que voc tenha um mtodo declarado para retornar um Number:
public Number returnANumber() {
...
}
O mtodo ReturnANumber pode retornar um ImaginaryNumber mas no um Object.
ImaginaryNumber um Number poque ele uma subclasse de Number. Porm, um Object no
necessariamente um Number ele poderia ser uma String ou outro tipo.
Voc pode passar por cima de um mtodo e defin-lo para retornar uma subclasse do mtodo
original, dessa forma:
public ImaginaryNumber returnANumber() {
...
}
Esta tcnica, chamada tipo de retorno co2variante, significa que o tipo de retorno autorizado a
variar na mesma direo que a subclasse.
%otaG Voc tambm pode usar nomes de interface como tipo de retorno. Neste caso, o objeto
retornado precisa implementar a interface especificada.
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
74
3sando a Palavra (eservada this.
Dentro de um mtodo da instncia ou um construtor, this uma referncia para o objeto corrente
o objeto no qual o mtodo ou construtor est sendo chamado. Voc pode fazer referncia para qualquer
membro do objeto corrente de dentro de um mtodo da instncia ou um construtor usando this.
3sando this como um 7ampo.
A razo mais comum para o uso da palavra reservada this porque o campo sombreado por um
mtodo ou parmetro do construtor.
Por exemplo, a classe Point foi escrita dessa forma:
public class Point {
public int x = 0;
public int y = 0;
// construtor
public Point(int a, int b) {
x = a;
y = b;
}
}
mas poderia ser escrita dessa forma:
public class Point {
public int x = 0;
public int y = 0;
// construtor
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
Cada argumento para o segundo construtor sombreia um dos campos do objeto dentro do
construtor o x uma cpia local do primeiro argumento do construtor. Para fazer referncia ao campo x de
Point, o construtor precisa usar this.x.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
75
3sando this como um 7onstrutor.
Para escrever um construtor, voc pode tambm usar a palavra reservada this para chamar outro
construtor na mesma classe. Fazendo dessa forma chamado de um invoca?@o e7pl<cita do construtor.
Aqui est uma classe Rectangle, com uma implementao diferente daquela na seo Objects:
public class Rectangle {
private int x, y;
private int width, height;
public Rectangle() {
this(0, 0, 0, 0);
}
public Rectangle(int width, int height) {
this(0, 0, width, height);
}
public Rectangle(int x, int y, int width, int height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
...
}
Esta classse contm um conjunto de construtores. Cada construtor inicializa algumas ou todas as
variveis membros do retngulo. Os construtores fornecem um valor default (padro) para qualquer
membro varivel cujo valor inicial no provido por um argumento. Por exemplo, o construtor sem
argumento chama os quatro argumentos do construtor com quatro valores 0 e dois argumentos do
construtor chamam os quatro argumentos do construtor com dois valores 0. O compilador determina qual
construtor chamar, baseado no nmero de no tipo de argumentos.
Se presente, a invocao de qualquer construtor precisa ser a primeira linha no construtor.
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
76
7ontrolando o Acesso a !embros de uma 7lasse.
Modificadores de estgios de acesso determinam se outra classe pode usar um campo em
particular ou invocar um mtodo em particular. H dois estgios de controle de acesso;
No estgio mais acima public, ou package-private (sem modificador explcito).
No estgio do membro public, private, protected, ou package-private (sem
modificador explcito).
Uma classe pode ser declarada com o modificador public, nesse caso a classe visvel para
todas as classes em qualquer lugar. Se a classe no tem modificador (o default, tambm conhecido como
package-private), visvel somente dentro do prprio pacote (pacotes so nomeados em grupo de
classes relatadas voc aprender a respeito deles na prxima lio).
No estgio do membro, voc pode tambm usar o modificador public ou o no-modificador
(package-private) somente com as classes de estgio mais acima, e com o mesmo significado. Para
membros, h dois modificadores de acesso adicionais: private e protected. O modificador private
especifica que o membro pode somente ser acessado em sua prpria classe. O modificador protected
especifica que o membro somente pode ser acessado dentre de seu prprio pacote (assim como package-
private) e, em adio, por uma subclasse de sua classe em qualquer pacote.
A seguinte tabela mostra o acesso a membros permitido por cada modificador:
%veis de Acesso
!odi'icador 7lasse Pacote Subclasse Yual$uer
lugar
public Y Y Y Y
protected Y Y Y N
no modifier Y Y N N
private Y N N N
A primeira coluna de dados indica que a classe tem acesso a si mesma para o membro definido no
estgio de acesso. Como voc pode ver, a classe sempre tem acesso para seus prprios membros. A
segunda coluna indica que a classe no mesmo pacote que o da classe (indiferente de seu parentesco) tem
acesso para o membro. A terceira coluna indica que subclasses das classes declaradas fora deste pacote
tem acesso para o membro. A quarta coluna indica que todas as classes tem acesso ao membro.
Nveis de acesso afetam voc em duas situaes. Primeiro, quando voc usa classes que vm de
outro cdigo, como no caso das classes da plataforma Java, nveis de acesso determinam quais membros
dessas classes suas prprias classes podem usar. Segundo, quando voc escreve uma classe, voc
precisa decidir qual nvel de acesso cada membro varivel e cada mtodo em sua classe ter.
D uma olhada em uma coleo de classes e veja como os nveis de acesso afetam sua
visibilidade. A seguinte figura mostra quatro classes neste exemplo e como elas esto relacionadas.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
77
A seguinte tabela mostra onde os membros da classe Alpha so visveis para cada modificador de
acesso que pode ser aplicado a ela.
)isibilidade
!odi'icador Alp"a @eta Alp"asub Fama
public Y Y Y Y
protected Y Y Y N
no modifier Y Y N N
private Y N N N
Tipos na 9scol"a de um %vel de AcessoG os outros programadores usam sua classe,
voc quer se asssegurar que erros provocados pelo abuso no aconteam. Nveis de acesso podem ajudar
voc a fazer isso:
Use o nvel de acesso mais restritivo que fizer sentido para um membro em particular. Use
private a menos que voc tenha uma boa razo para no faz-lo.
Evite campos public exceto para constantes. (Muitos dos exemplos neste tutorial usam
campos pblicos. sto ajuda muito a ilustrar alguns pontos concisamente, mas no
recomendado para produo de cdigo). Campos pblicos tendem a conectar voc para
uma implementao em particular e limitam sua flexibilidade nas mudanas em seu cdigo.
//=================================================================================
7ompreendendo ,nst#ncia e !embros de 7lasse.
Nesta seo, ns discutiremos o uso da palavra reservada static para criar campos e mtodos
que pertencem classe, ao invs de uma instncia da classe.
)ari&veis de 7lasse.
Quando um nmero de objetos criado do mesmo projeto da classe, eles tm cada um sua cpia
distinta das variveis da instncia. No caso da classe Bicycle, as variveis da instncia so cadence,
gear, e speed. Cada objeto Bicycle tem seus prprios valores para estas variveis, armazenados em
diferentes locais de memria.
Algumas vezes, voc quer variveis que sejam comuns para todos os objetos. Elas so
acompanhadas pelo modificador static. Campos que tm o modificador static em suas declaraes
so chamados de campos estticos ou variveis de classe. Eles so associados com a classe, ao invs de
com um objeto qualquer. Todas as instncias da classe compartilham a varivel de classe, que est em um
local fixado na memria. Qualquer objeto pode mudar o valor de uma varivel de classe, mas variveis de
classe podem tambm ser manipuladas sem a criao de uma instncia da classe.
Por exemplo, suponha que voc quer criar um nmero de objetos Bicycle e atribuir a cada um um
nmero serial, comeando com 1 para o primeiro objeto. Este nmero identificador nico para cada objeto
e por essa razo est em uma varivel de instncia. Ao mesmo tempo, voc precisa de um campo para
manter um rastro de como muitos objetos Bicycle foram criados para que voc saiba qual identidade
atribuir para a prxima. Dessa maneira o campo no relatado para qualquer objeto individual, mas para a
classe como um todo. Por isso, voc precisa de uma varivel de classe, numberOfBicycles, como segue:
public class Bicycle {
private int cadence;
private int gear;
private int speed;
// adiciona uma varivel de instncia para a ID do objeto
private int id;
// adiciona uma varivel de classe para o
// nmero de objetos Bicycle instanciados
private static int numberOfBicycles = 0;
......
}
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
78
Variveis de classe so referenciadas pelo nome da prpria classe, como em
Bicycle.numberOfBicycles
Desse modo mostra claramente que elas so variveis da classe.
%otaG Voc pode tambm fazer referncia a campos estticos com uma referncia ao objeto,
como em:
myBike.numberOfBicycles
mas isto desencorajado porque no mostra claramente que se trata de variveis de classes.
Voc pode usar o construtor Bicycle para apontar a varivel de instncia id e incrementar a
varivel de classe numberOfBicycles:
public class Bicycle {
private int cadence;
private int gear;
private int speed;
private int id;
private static int numberOfBicycles = 0;
public Bicycle(int startCadence, int startSpeed, int startGear) {
gear = startGear;
cadence = startCadence;
speed = startSpeed;
// incrementa o nmero de Bicycles e atribui um nmero ID
id = ++numberOfBicycles;
}
// novo mtodo para retornar a varivel de instncia ID
public int getID() {
return id;
}
......
}
!Qtodos de 7lasse.
A linguagem de programao Java suporta mtodos estticos assim como variveis estticas.
Mtodos estticos, os quais tm o modificador static em suas declaraes, precisam ser invocados com
o nome da classe, sem a necessidade da criao de uma instncia da classe, como em:
ClassName.methodName(args)
%otaG Voc pode tambm fazer referncia a mtodos estticos com uma referncia ao objeto,
como:
instanceName.methodName(args)
mas isso desencorajado porque no mostra claramente que eles so mtodos de classe.
Um uso comum para os mtodos estticos para acessar campos estticos. Por exemplo, ns
poderamos adicionar um mtodo esttico para a classe Bicycle para acessar o campo esttico
numberOfBicycles:
public static int getNumberOfBicycles() {
return numberOfBicycles;
}
Nem todas as combinaes de variveis de instncia de classe e mtodos so permitidos:
Mtodos da instncia podem acessar variveis de instncia e mtodos de instncia diretamente.
Mtodos da instncia podem acessar variveis de classe e mtodos da classe diretamente.
Mtodos de Classe podem acessar variveis de classe e mtodos da classe diretamente.
Mtodos da Casse n@o podem acessar variveis de instncia ou mtodos de instncia diretamente
eles precisam usar uma referncia ao objeto. Alm disso, mtodos de classe n@o podem usar a
palavra reservada this porque ali no h instncia para fazer referncia para this.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
79
7onstantes.
O modificador static, em combinao com o modificador final, tambm usado para definir
constantes. O modificador final indica que o valor do campo no pode mudar.
Por exemplo, a seguinte declarao de varivel define uma constante nomeada PI, cujo valor
uma aproximao de pi (o raio de uma circunferncia de um crculo para este dimetro):
static final double PI = 3.141592653589793;
Constantes definidas dessa forma no podem ser modificadas, e ela vai gerar um erro de tempo de
compilao se seu programa tenta fazer isso. Por conveno, o nome da constante de valores escrito em
letras maisculas. Se o nome composto por mais de uma palavra, as palavras so separadas por um
underscore ( _ ).
Nota: Se um tipo primitivo ou uma string difinida como uma constante e o valor conhecido em
tempo de compilao, o compilador substitui o nome da constante em todos os lugares no cdigo com este
valor. sto chamado de compile2time constant (constante em tempo de compilao). Se o valor da
constante no lado de fora muda (por exemplo, se for legislado que pi atualmente ser 3.975), voc precisar
recompilar qualquer classe que use a constante para mudar o valor corrente.
A 7lasse @icTcle.
Depois de todas as modificaes feitas nesta seo, a classe Bicycle agora :
public class Bicycle{
private int cadence;
private int gear;
private int speed;
private int id;
private static int numberOfBicycles = 0;
public Bicycle(int startCadence, int startSpeed, int startGear){
gear = startGear;
cadence = startCadence;
speed = startSpeed;
id = ++numberOfBicycles;
}
public int getID() {
return id;
}
public static int getNumberOfBicycles() {
return numberOfBicycles;
}
public int getCadence(){
return cadence;
}
public void setCadence(int newValue){
cadence = newValue;
}
public int getGear(){
return gear;
}
public void setGear(int newValue){
gear = newValue;
}
public int getspeed(){
return speed;
}
public void applyBrake(int decrement){
speed -= decrement;
}
public void speedUp(int increment){
speed += increment;
}
}
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
80
,nciali-ando 7ampos.
Como voc viu, voc geralmente pode fornecer um valor inicial para um campo como nesta
declarao:
public class BedAndBreakfast {

public static int capacity = 10; // incializa para 10
public boolean full = false; // incializa para false
}
sso funciona tambm quando o valor calculado e a incializao podem ser colocados em uma linha.
No entanto esta forma de inicializao tem suas limitaes por causa de sua simplicidade. Se a inicializao
requer alguma lgica (por exemplo, tratamentos de erros ou um loop for para abastecer um array
complexo), atribuies simples so inadequadas. Variveis de instncia podem ser inicializadas em
construtores, onde tratamentos de erros ou outra lgica podem ser usados. Para fornecer a mesma
capacidade para variveis de classe, a linguagem de programao Java inclui blocos de inicializao
estticos.
%otaG No necessrio declarar campos no incio da definio da classe, embora isso seja a
prtica mais comum. Somente necessrio que eles sejam declarados e incializados antes de serem
usados.
@locos de ,niciali-ao 9st&ticos.
Um bloco de inicializao esttico um bloco normal de cdigo envolvido por chaves, { }, e
precedito pela palavra reservada static. Aqui est um exemplo:
static {
// qualquer cdigo que for necessrio para inicializao vai aqui
}
Uma classe pode ter qualquer nmero de blocos de inicializao estticos, e eles podem aparecer
em qualquer lugar no corpo da classe. O sistema de runtime garante que os blocos de inicializao
estticos sero chamados na ordem em que eles aparecem no cdigo fonte.
H uma alternativa para blocos estticos voc pode escrever um mtodo esttico privativo:
class Whatever {
public static varType myVar = initializeClassVariable();
private static varType initializeClassVariable() {

// cdigo de inicializao vai aqui
}
}
A vantagem de mtodos estticos privativos que eles podem ser reutilizados mais tarde se voc
precisar reinicializar a varivel da classe.
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
81
,niciali-ando !embros da ,nst#ncia.
Normalmente, voc colocaria o cdigo para inicializar uma varivel da instncia em um construtor.
H duas alternativas para o uso de um construtor para inicializar as variveis da instncia: blocos de
inicializao e mtodos finais.
Blocos de incializao para variveis da instncia parecem com os blocos estticos de inicializao,
mas sem a palavra reservada static:
{
// qualquer cdigo necessrio para a incializao vai aqui
}
O compilador Java copia blocos de inicializao em cada construtor. Por essa razo, este caminho
pode ser usado para compartilhar blocos de cdigo entre mltiplos construtores.
Um mtodo final no pode passar por cima em uma subclasse. sto ser discutido na lio sobre
interfaces e herana. Aqui est um exemplo do uso de um mtodo final para inicializao de uma varivel
da instncia:
class Whatever {
private varType myVar = initializeInstanceVariable();
protected final varType initializeInstanceVariable() {
// cdigo de inicializao vai aqui
}
}
sto especialmente til se as subclasses podem querer reusar o mtodo de inicializao. O
mtodo final porque chamar mtodos no finais durante a inicializao da instncia pode causar
problemas.
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
82
7lasses Anin"adas.
A linguagem de programao Java permite a voc definir uma classe dentro de outra classe. Desta
maneira. uma classe chamada de classe aninhada e ilustrada aqui:
class OuterClass {
...
class NestedClass {
...
}
}
Uma classe aninhada um membro que est envolvendo uma classe e, como tal, tem acesso a
outros membros da classe envolvida, mesmo que eles sejam declarados privados. Como um membro de
OuterClass, uma classe aninhada pode ser declarada private, public, protected, ou package
private. (Relembre que outras classes s podem ser declaradas como public ou package private).
TerminologiaG Classes aninhadas so divididas em duas categorias: estticas e no estticas
Classes aninhadas que so declaradas static so simplesmente chamadas static nested classes
(classes aninhadas estticas). Classes aninhadas no estticas so chamadas inner classes (classes
internas).
Class OuterClass {
...
static class StaticNestedClass {
...
}
class InnerClass {
...
}
}
//=================================================================================
Por$ue 3sar 7lasses Anin"adas.
H muitos motivos que obrigam o uso de classes aninhadas, entre eles:
Este um caminho para logicamente agrupar classes que so usadas somente em um lugar.
sto aumenta o encapsulamento.
Classes Aninhadas podem tornar o cdigo mais legvel e fcil de consertar.
Agrupamanto l:gico de classes Se a classe til para somente uma outra classse, ento
mais lgico embut-la naquela classe e manter as duas juntas. Aninhamentos como "classes de ajuda
fazem seus pacotes mais eficientes.
Aumento do encapsulamento Considere duas classes de alto nvel, A e B, onde B precisa
acessar os membros de A que no entanto foram declarados private. Colocando a classe B dentro da
classe A, os membros de A podem ser declarados private e B pode acess-los mesmo assim. Alm disso,
B fica escondido do resto do mundo.
7:digo mais legvel e '&cil de manter Aninhando classes pequenas dentro de classes de alto
nvel posiciona o fechamento do cdigo onde ele usado.
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
83
7lasses Anin"adas 9st&ticas.
Assim como mtodos e variveis da classe, uma classe aninhada est associada com esta outra
classe. E como mtodos da classe esttica, uma classe aninhada esttica no pode fazer referncia
diretamente para as variveis da instncia ou mtodos definidos nesta classe envolvida ela pode us-la
somente usando uma referncia ao objeto.
%otaG Uma classe aninhada esttica interage com os membros da instncia da outra classe (e
outras classes) somente com qualquer outra classe de alto nvel semelhante. Com efeito, uma classe
aninhada esttica tem um comportamento de uma classe de alto nvel que foi aninhada em outra classe de
alto nvel por convenincia de acondicionamento.
Classes aninhadas estticas so acessadas usando o nome da classe envolvida:
OuterClass.StaticNestedClass
Por exemplo, para criar um objeto para a classe aninhada esttica, use esta sintaxe:
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
//=================================================================================
7lasses ,nternas.
Assim como mtodos e variveis da instncia, uma classe interna est associada com uma
instncia se estiver envolvendo a classe e tem acesso direto para aqueles mtodos e campos do objeto.
Alm disso, pelo motivo de uma classe interna estar associada com uma instncia, ela no define qualquer
membro esttico nela mesma.
Objetos que so instanciados de uma classe interna existem dentro dos limites da instncia da outra
classe. Considere a seguinte classe:
class OuterClass {
...
class InnerClass {
...
}
}
Uma instncia de InnerClass pode existir somente dentro da instncia de OuterClass e tem
direito ao acesso para os mtodos e campos da instncia que est envolvendo. A prxima figura ilustra a
idia:
Para instanciar uma classe interna, voc precisa primeiro instanciar a outra classe. Ento, crie o
objeto dentro de outro objeto com a sintaxe:
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
Adicionalmente, h dois tipos especiais de classes internas: classes locais e classes annimas
(tambm chamadas classes internas annimas). Ambas sero discutidas resumidamente no prxima seo.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
84
9Eemplo de 7lasse Anin"ada.
Para ver uma classe interna em uso, considere um simples pilha de inteiros. Pilhas, que so tipos
comuns de dados estruturados em programao, so como pilhas de recipientes. Quando voc adiciona um
recipiente para a pilha, voc o coloca no topo; quando voc remove um, voc o remove do topo. O acrnimo
para isto L(A3 #last in; first out%/ Recipientes na parte mais baixa da pilha podem ficar l por um longo
tempo enquanto a parte superior dos recipientes vem e vo.
A classe StackOfInts a seguir implementada como um array. Quando voc adiciona um inteiro
(chamado 'pushing'), ele vai para o primeiro elemento disponvel vazio. Quando voc remove um inteiro
(chamado "popping), voc remove o ltimo inteiro no array.
A classe StackOfInts a seguir (uma aplicao) consiste de:
A classe exterior, StackOfInts, que inclui mtodos para empurrar um inteiro na pilha,
dispara um inteiro cancelado na pilha, e testa para ser se a pilha est vazia.
A classe interna StepThrough, que similar a um iterador padro Java. teradores so
usados para percorrer por completo uma estrutura de dados e tipicamente tm mtodos
para testar pelo ltimo elemento, recuperar o elemento atual, e mover para o prximo
elemento.
Um mtodo main que instancia um array StackOfInts (StackOne) e abastece ele com
inteiros (0, 2, 4, etc.), ento instancia um objeto StepThrough (iterator) e o usa para
mostrar a sada dos argumentos de stackOne.
Na prxima pgina voc tem a aplicao completa:
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
85
public class StackOfInts {
private int[] stack;
private int next = 0; // indexa o ltimo tem em stack + 1
public StackOfInts(int size) {
// cria um array grande o suficiente para receber a pilha
stack = new int[size];
}
public void push(int on) {
if(next < stack.length)
stack[next++] = on;
}
public boolean isEmpty() {
return (next == 0);
}
public int pop() {
if (!isEmpty())
return stack[--next]; // item no topo da lista
else
return 0;
}
public int getStackSize() {
return next;
}
private class StepThrough {
// inicia a ao de percorrer de uma parte a outra com i=0
private int i = 0;
// incrementa o ndice
public void increment() {
if (i < stack.length)
i++;
}
// recupera o elemento corrente
public int current() {
return stack[i];
}
// ltimo elemento na pilha?
public boolean isLast() {
if(i == getStackSize() - 1)
return true;
else
return false;
}
}
public StepThrough stepThrough() {
return new StepThrough();
}
public static void main(String[] args) {
// instancia classe exterior como stackOne
StackOfInts stackOne = new StackOfInts(15);
// povoa stackOne
for (int j = 0; j < 15; j++) {
stackOne.push(2 * j);
}
// instancia classe interna com iterator
StepThrough iterator = stackOne.stepThrough();
// mostra stackOne[i], um por linha
while(!iterator.isLast()) {
System.out.println(iterator.current() + );
iterator.increment();
}
System.out.println();
}
}
A sada :
0 2 4 6 8 10 12 14 16 18 20 22 24 26
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
86
Note que a classe StepThrough faz referncia diretamente para a instncia da pilha varivel de
StackOfInts.
Classes internas so usadas principalmente para implementar classes helper (de ajuda) como a
mostrada no exemplo. Se voc planeja a manipulao de eventos usurio-interface, voc precisar
aprender a conhecer a respeito delas usando classes internas porque os mecanismos de eventos manuais
fazem uso intensivo delas.
//=================================================================================
7lasses ,nternas Locais e AnZnimas.
H dois tipos adicionais de classes internas. Voc pode declarar uma classe interna dentro do corpo
de um mtodo. Esta classe conhecida como uma classe interna local. Voc tambm pode declarar uma
classe interna dentro do corpo do mtodo sem nome-la. Estas classes so conhecidas como classes
internas anBnimas. Voc encontrar classes semelhantes na programao avanada Java.
//=================================================================================
!odi'icadores.
Voc pode usar os mesmos modificadores para classes internas que voc usa para outros membros
de classes externas. Por exemplo, voc pode usar os especificadores de acesso private, public, e
protected para restringir o acesso a classes internas, da mesma forma que voc faz com outros
membros de classes.
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
87
Tipos %umer&veis.
Um tipo numervel um tipo onde os campos consistem de um conjunto fixo de constantes.
Exemplos comuns incluem direes circulares (valores de -31$H, S3'$H, E)S$, e CES$) e os dias da
semana.
Porque eles so constantes, os nomes dos campos de um tipo numervel so letras maisculas.
Na linguagem de programao Java, voc define um tipo numervel usando a palavra reservada
enum. Por exemplo, voc pode especificar um tipo numervel com os dias da semana:
public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY
}
Voc pode usar tipos enumerveis a qualquer momento que voc precisar para representar um
conjunto fixo de constantes. sto inclui tipos enumerveis naturais como os planetas em nosso sistema solar
e conjunto de dados onde voc conhece todos os possveis valores em tempo de compilao por
exemplo, as escolhas de um menu, marcadores de linha de comando, e assim por diante.
Aqui est um cdigo que mostra como usar enumervel Day definido acima:
public class EnumTest {
Day day;
public EnumTest(Day day) {
this.day = day;
}
public void tellItLikeItIs() {
switch (day) {
case MONDAY: System.out.println(Monday are bad.);
break;
case FRIDAY: System.out.println(Fridays are better.);
break;
case SATURDAY:
case SUNDAY: System.out.println(Weekends are best.);
break;
default: System.out.println(Midweek days are so-so.);
break;
}
}
public static void main(String[] args) {
EnumTest firstDay = new EnumTest(Day.MONDAY);
firstDay.tellItLikeItIs();
EnumTest thirdDay = new EnumTest(Day.WEDNESDAY);
thirdDay.tellItLikeItIs();
EnumTest fifthDay = new EnumTest(Day.FRIDAY);
fifthDay.tellItLikeItIs();
EnumTest sixthDay = new EnumTest(Day.SATURDAY);
sixthDay.tellItLikeItIs();
EnumTest seventhDay = new EnumTest(Day.SUNDAY);
seventhDay.tellItLikeItIs();
}
}
A sada :
Mondays are bad.
Midweek days are so-so.
Fridays are better.
Weekends are best.
Weekends are best.
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
88
Os tipos enumerveis da linguagem de programao Java so muito mais poderosos que seus
correlatos em outras linguagens. A declarao enum define uma classe (chamada enum type). O corpo da
classe enum pode incluir mtodos e outros campos. O compilador automaticamente adiciona alguns
mtodos especiais quando criado um enum. Por exemplo, eles tm um mtodo de valor static que
retorna um array contendo todos os valores de enum na ordem em que eles foram declarados. Este mtodo
comumente usado em combinao com o construtor for-each para iterar completamente os valores de
um tipo enum. Por exemplo, este cdigo da classe exemplo Planet abaixo itera completamente todos os
planetas no sistema solar.
for (Planet p: Planet.values()) {
System.out.println(Your weight on %s is %f%n,
p, p.surfaceWeight(mass));
}
%otaG Todos os enums implicitamente estendem java.lang.Enum. Desde que Java no suporta
mltiplas heranas, um enum no pode estender mais alguma coisa. Em adio para as propriedades do
construtor, Planet tem mtodos que permitem a voc recuperar a superfcie de gravidade e peso de um
objeto em cada planeta.
public enum Planet {
MERCURY (3.303e+23, 2.4397e6),
VENUS (4.869e+24, 6.0518e6),
EARTH (5.976e+24, 6.37814e6),
MARS (6.421e+23, 3.3972e6),
JUPITER (1.9e+27, 7.1492e7),
SATURN (5.688e+26, 6.0268e7),
URANUS (8.686e+25, 2.5559e7),
NEPTUNE (1.024e+26, 2.4746e7);
private final double mass; // em Kilogramas
private final double radius; // em metros
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
private double mass() { return mass; }
private double radius() { return radius; }
// universal gravitational constant (m3 kg-1 s-2)
public static final double G = 6.67300E-11;
double surfaceGravity() {
return G * mass / (radius * radius);
}
double surfaceWeight(double otherMass) {
return otherMass * surfaceGravity();
}
public static void main(String[] args) {
double earthWeight = Double.parseDouble(args[0]);
double mass = earthWeight/EARTH.surfaceGravity();
for (Planet p : Planet.values())
System.out.printf("Your weight on %s is %f%n",
p, p.surfaceWeight(mass));
}
}
Se voc rodar Planet.class da linha de comando com um argumento de 175 voc conseguir a
sada:
$ java Planet 175
Your weight on MERCURY is 66.107583
Your weight on VENUS is 158.374842
Your weight on EARTH is 175.000000
Your weight on MARS is 66.279007
Your weight on JUPITER is 442.847567
Your weight on SATURN is 186.552719
Your weight on URANUS is 158.397260
Your weight on NEPTUNE is 199.207413
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
89
AnotaNes.
Anotaes fornecem dados a respeito do programa que no fazem parte do programa em si. Elas
no tm efeito direto na operao do cdigo ao qual elas comentam.
Anotaes tem uma variedade de usos, como estes:
,n'ormao para o compilador Anotaes podem ser usadas pelo compilador para
detectar erros ou suprimir advertncias.
Processamento de tempo de compilao e tempo de desenvolvimento Ferramentas
de software podem processar informaes de anotaes para gerar cdigo, arquivos XML,
e assim por diante.
Processamento runtime *tempo de eEecuo+ Algumas anotaes so disponibilizadas
para serem examinadas em tempo de execuo.
Anotaes podem ser aplicadas para as declaraes de classes, campos e mtodos, alm de
outros elementos do programa.
A anotao aparece primeiro, freqentemente (por conveno) na prpria linha, e pode incluir
elementos com valores nomeados ou no:
@Author(
name = Benjamin Franklin,
date = 3/27/2003
)
class MyClass() { }
ou
@SuppressWarnings(value = unchecked)
void myMethod() { }
Se h somente um elemento nomeado "value, ento o nome pode ser omitido, como em:
@Overrride
void mySuperMethod() { }
Documentao.
Muitas anotaes repem o que de outra maneira seria comentado no cdigo.
Supondo que um grupo de software tem tradicionalmente comeado o corpo de cada classe com
comentrios fornecendo importantes informaes:
public class Generation3List extends Generation2List {
// Author: John Doe
// Date: 3/17/2002
// Current revision: 6
// Last modified: 4/12/2004
// By: Jane Doe
// Reviewers: Alice, Bill, Cindy
// class code goes here
}
Para adicionar estes mesmos metadados como uma anotao, voc precisa primeiro definir o tipo
de anotao. A sintaxe para fazer isso :
@interface ClassPreamble {
String author();
String date();
int currentRevision() default 1;
String lastModified() default "N/A";
String lastModifiedBy() default "N/A";
String[] reviewers(); // Note use of array
}
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
90
O tipo de anotao parece um pouco como uma definio de interface onde a palavra reservada
interface precedida pelo caracter @ (@ = .)$0 como em )nnotation $ype). Tipos de anotao so, de
fato, uma forma de interface, que ser coberta em uma lio mais tarde.
O corpo da definio da anotao acima contm declaraes de elementos do tipo anotao, que
parecem uma poro de mtodos. Note que eles podem ser tambm definidos com valores opcionais
padro.
Uma vez que o tipo de anotao foi definido, voc pode usar anotaes de qualquer tipo, com os
valores acumulados, como em:
@ClassPreamble (
author = "John Doe",
date = "3/17/2002",
currentRevision = 6,
lastModified = "4/12/2004",
lastModifiedBy = "Jane Doe"
reviewers = {"Alice", "Bob", "Cindy"} // Note array notation
)
public class Generation3List extends Generation2List {
// class code goes here
}
%otaG Para fazer a informao em @ClassPreamble aparecer no gerador de documentao
Javadoc, voc precisa anotar a definio da @ClassPreamble com a anotao @Documented:
import java.lang.annotation.*; // import this to use @Documented
@Documented
@interface ClassPreamble {
// Annotation element definitions

}
AnotaNes 3sadas pelo 7ompilador.
H trs tipos de anotaes que so pr-definidas pela auto-especificao da linguagem:
@Deprecated, @Override, e @SuppressWarnings.
[Deprecated a anotao @Deprecated indica que o elemento marcado depreciado e
mostra que ser pouco usado. O compilador gera uma advertncia sempre que o programa usa o mtodo,
classe, ou campo com a anotao @Deprecated. Quando um elemento depreciado, tambm pode ser
documentado usando a tag Javadoc @deprecated, como mostrado no exemplo seguinte. O uso do
smbolo @ em ambos, comentrios Javadoc e anotaes no coincidncia eles so relatados
conceitualmente. Alm disso, note que a tag Javadoc comea com a letra minscula d e a anotao
comea com a letra maiscula "D.
// Javadoc comment follows
/**
* @deprecated
* explanation of why it was deprecated
*/
@Deprecated
static void deprecatedMethod() { }
}
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
91
[Override a anotao @Override informa ao compilador que o elemento est destinado para
passar por cima de um elemento declarado em uma superclasse (passar por cima de mtodos ser
discutido na lio "nterfaces e Herana).
// mark method as a superclass method
// that has seen overridden
@Override
int overriddenMethod() { }
Embora no seja necessrio usar esta anotao quando passando por cima de um mtodo, isto
ajuda a prevenir erros. Se o mtodo marcado com @Override falha para corretamente passar por cima de
um mtodo em uma de suas superclasses, o compilador gera um erro.
[Suppress1arnings a anotao @SuppressWarnings diz ao compilador para suprimir
advertncias especficas que ele geraria caso contrrio. No exemplo seguinte, um mtodo depreciado
usado e o compilador normalmente geraria uma advertncia. Neste caso, no entanto, a anotao causa a
supresso da advertncia.
// use a deprecated method and tell
// compiler not to generate a warning
@SuppressWarnings("deprecation")
void useDeprecatedMethod() {
objectOne.deprecatedMethod(); //deprecation warning - suppressed
}
Cada mensagem do compilador tem seu lugar prprio para uma categoria. A especificao da
linguagem Java lista duas categorias: .deprecation0 (depreciao) e .unchecked0 (no checado). A
advertncia .unchecked0 pode ocorrer quando interagindo com cdigo legado escrito antes do advento
dos genricos (assunto discutido na lio intitulada "Genricos). Para suprimir mais de uma categoria de
advertncias, use a seguinte sintaxe:
@SuppressWarnings({unchecked, deprecation})
Processando AnotaNes.
O mais avanado uso de anotaes inclui escrever um processamento de anotaes que pode ler
um programa Java e realizar aes baseado nestas anotaes. sso pode, por exemplo, gerar um cdigo
fonte auxiliar, aliviando o programador de ter que criar cdigos boilerplate, que sempre seguem exemplos
prognosticados. Para faciliar este trabalho, a release 5.0 do J! inclui uma ferramenta de processamento
de anotaes, chamada apt. Na release 6 do J!, a funcionalidade de apt uma parte padro do
compilador Java.
Para fazer informaes de anotao disponveis em tempo de execuo, o tipo da anotao precisa
ele mesmo ser anotado com:
@Retention(RetentionPolicy.RUNTIME), as follows:
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@interface AnnotationForRuntime {
// Elements that give information
// for runtime processing

}
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
92
,nter'aces.
H um nmero de situaes em engenharia de software quando importante para grupos distintos
de programadores concordarem um "contrato que explique nos mnimos detalhes como seus softwares
interagem. Cada grupo tem habilidade para escrever seu cdigo sem conhecimento de como outros grupos
escrevem os seus. Genericamente falando, interfaces so esses contratos.
Por exemplo, imagine uma sociedade futurista onde carros robs controlados por computadores
transportam passageiros atravs das ruas da cidade sem um operador humano. Fabricantes
automobilsticos escrevem software (Java, claro) que operam os automveis parar, acelerar, virar
esquerda, e assim por diante. Outros grupos industriais, fabricantes de instrumentos eletrnicos de
orientao, fazem sistemas de computador que recebem dados de posio &*S #&lobal *ositioning
Satellite% e transmitem sem fios as condies de trfego e usam esta informao para dirigir o carro.
Os fabricantes de automveis precisam publicar uma interface padro industrial que explica nos
mnimos detalhes quais mtodos podem ser invocados para fazer o carro mover (qualquer carro, de
qualquer fabricante). Os fabricantes de instrumentos podem ento escrever softwares que invocam os
mtodos descritos na interface para comandar os carros. Nenhum grupo industrial precisa saber como o
software do outro grupo implementado. De fato, cada grupo considera este software altamente proprietrio
e reserva o direito de modific-lo a qualquer tempo, contanto que continue a ficar fiel interface publicada.
,nter'aces em Java.
Na linguagem de programao Java, uma interface um tipo de referncia, similar a uma classe,
que pode conter somente constantes, marcao de mtodos, e tipos aninhados. No h corpos de mtodos.
nterfaces no podem ser instanciadas elas podem somente ser implementadas pelas classes ou
estendidas (e7tended) por outras interfaces. Extenso ser discutida mais tarde nesta lio.
Definir uma interface similar criao de uma nova classe:
public interface OperateCar {
// declaraes de constantes, talvez nuenhuma
// assinaturas dos mtodos
int turn(Direction direction, // Como enum com valores RIGHT, LEFT
double radius, double startSpeed, double endSpeed);
int chageLanes(Direction direction, double startSpeed,
double endSpeed);
int signalTurn(Direction direction, boolean signalOn);
int gerRadarFront(double distanceToCar, double speedOfCar);
int getRadarRear(double distanceToCar, double speedOfCar);
......
// mais assinaturas de mtodos
}
Note que a assinatura do mtodo no tem chaves e so terminadas por um ponto-e-vrgula.
Para usar uma interface, voc escreve uma classe que implementa uma interface. Quando uma
classe instancivel implementa uma interface, ela fornece um corpo de mtodo para cada um dos mtodos
declarados na interface. Por exemplo,
public class OperadteBMW760i implements OperateCar {
// o mtodo OperateCar assinalado, com implementao --
// por exemplo:
int signalTurn(Direction direction, boolean signalOn) {
// cdigo para virar BMW para a esquerda acende luz indicadora
// cdigo para virar BMW para a direita desliga a luz indicadora
// cdigo para virar BMW para a esquerda liga a luz indicadora
// cdigo para virar BMW para a direita desliga a luz indicadora
}
// outros membros, se necessrio -- por exemplo, classes de ajuda
// invisveis para os clientes da interface
}
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
93
No exemplo de carro-rob acima, so os fabricantes de automveis quem implementam a interface.
Uma implementao de ,hevrolet poder ser substancialmente diferente de uma $oyota, claro, mas
ambos os fabricantes adicionaro a mesma interface. Fabricantes de instrumentos, que so os clientes da
interface, construiro sistemas que usam dados &*S em uma localizao de carros, mapas digitais de
estradas, e dados de trfego para dirigir o carro. Fazendo dessa forma, os sistemas de instrumentos
invocaro os mtodos da interface; virar, mudar pista, frear, acelerar, e assim por diante.
,nter'aces como AP,s.
O exemplo de carro-rob mostra uma interface sendo usada como um padro industrial )pplication
*rogramming (nterface #)*(%. )*(s so tambm comuns em produtos de software comercial Tipicamente,
uma companhia vende um pacote de software que contm mtodos complexos que outra companhia quer
para usar em seu prprio produto de software. Um exemplo poderia ser um pacote de imagens digitais
processando mtodos que sero vendidos para companhias que fabricam programas grficos para
usurios-finais. A companhia de grficos ento invoca a imagem processando mtodos usando a assinatura
e tipo de retorno definidos na interface. Enquanto a )*( da companhia de processamento de imagens feita
pblica (para seus clientes) esta implementao da )*( mantida como um segredo bem guardado de
fato, ela precisa revisar a implementao de tempos em tempos e continuar a implementao da interface
original na qual os clientes tm confiado.
,nter'aces e !Sltiplas =eranas.
nterfaces tm um outro papel muito importante na linguagem de programao Java. nsterfaces no
so parte da hierarquia de classes, apesar de elas trabalharem em combinao com classes. A linguagem
de programao Java no permite mltiplas heranas (heranas sero discutidas mais tarde nesta lio),
mas interfaces fornecem uma alternativa. Em Java, uma classe pode herdar de somente uma classe mas
ela pode implementar mais de uma interface. Dessa forma, objetos podem tem mltiplos tipos: os tipos de
suas prprias classes e os tipos de todas as interfaces que sero implementadas. sto significa que se a
varivel declarada para ser um tipo de uma interface, este valor pode fazer referncia a qualquer objeto
que instanciado de qualquer classe que implementa uma interface. sto ser discutido mais tarde nesta
lio, na seo intitulada "Usando uma nterface como um Tipo.
De'inindo uma ,nter'ace.
Uma declarao de interface consiste de modificadores, a palavra reservada interface, o nome
da interface, uma lista separada por vrgulas das interfaces pai (se houver), e um corpo da interface. Por
exemplo:
public interface GroupedInterface extends Interface1, Interface2, Interface3 {
// delcarao de constantes
double E = 2.718282; // base dos logaritmos naturais
void doSomething (int i double x); // assinaturas de mtodos
int doSomethingElse(String s);
}
O acesso public especificado indica que a interface pode ser usada por qualquer classe em
qualquer pacote. Se voc no especificar que a interface pblica, sua interface ser acessvel somente
para classes definidas no mesmo pacote da interface.
Uma interface pode estender outras interfaces, exatamente como uma classe pode estender ou ter
uma subclasse de qualquer classe. Contudo, considerando que uma classe pode estender somente uma
outra classe, uma interface pode estender qualquer nmero de interfaces. A declarao da interface inclui
uma lista separada por vrgulas de todas as interfaces que ela estende.
O 7orpo da ,nter'ace.
O corpo da interface contm as declaraes dos mtodos para todos os mtodos incudos na
interface. Uma declarao de mtodos dentro de uma interface seguida por um ponto-e-vrgula, mas no
chaves, porque uma interface no fornece implementaes para os mtodos declarados dentro dela. Todos
os mtodos declarados em uma interface so implicitamente public, ento o modificador public pode ser
omitido.
Uma interface pode conter declaraes de constantes em adio s declaraes de mtodos. Todos
os valores constantes definidos em uma interface so implicitamente public, static, e final. Portanto,
esses modificadores podem ser omitidos.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
94
,mplementando uma ,nter'ace.
Para declarar uma classe que implementa uma interface, voc inclui uma clusula implements na
declarao da classe. Sua classe pode implementar mais de uma interface, mas a palavra reservada
implements seguida por uma lista separada por vrgulas de interfaces implementadas pela classe.
Por conveno, a clusula implements segue a clusula extends, se houver uma.
3m 9Eemplo de ,nter'ace; 7omentado.
Considere uma interface que define como comparar o tamanho de objetos.
public interface Relatable {
// this (objeto chamando isLargeThan) e
// outro precisa ser instanciado da mesma classe
// retorna 1, 0, -1, se este maior
// do que, igual a, ou menor que outro
public int isLargerThan(Relatable other);
}
Se voc quiser habilitar para comparar objetos similares, no esquea o que eles so, a classe que
instancia eles deve implementar Relatable.
Qualquer classe pode implementar Relatable se h algum caminho para comparar o tamanho
relativo dos objetos instanciados da classe. Para strings, eles poderiam ser nmero de caracteres; para
livros, eles poderiam ser nmero de pginas; para estudantes, eles poderiam ser altura; e assim por diante.
Para objetos geomtricos planos, a rea poderia ser uma boa escolha (veja a classe RectanglePlus a
seguir), enquanto volume poderia trabalhar com objetos geomtricos tri-dimensionais.
Se voc quer que a classe implemente Relatable, ento voc sabe que voc pode comparar o
tamanho dos objetos instanciados daquela classe.
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
95
,mplementando a ,nter'ace Relatable.
Aqui est a classe Rectangle que foi apresentada na seo Criao de Objetos; reescrita para
implementar Relatable.
public class RectanglePlus implements Relatable {
public int width = 0;
public int height = 0;
public Point origin;
// quatro construtores
public RectanglePlus() {
origin = new Point(0, 0);
}
public RectanglePlus(Point p) {
origin = p;
}
public RectanglePlus(int w, int h) {
origin = new Point(0, 0);
width = w;
height = h;
}
public RectanglePlus(Point p, int w, int h) {
origin = p;
width = w;
height = n;
}
// um mtodo para mover o retngulo
public void move(int x, int y) {
origin.x = x;
origin.y = y;
}
// um mtodo para a computao da rea do retngulo
public int getArea() {
return width * height;
}
// um mtodo para implementar Relatable
public int isLargerThan(Relatable other) {
RectanglePlus otherRect = (RectanglePlus)other;
if (this.getArea() < otherRect.getArea())
return -1;
else if (this.getArea() > otherRect.getArea())
return 1;
else
return 0;
}
}
Porque RectanglePlus implementa Relatable, o tamanho de quaisquer dois objetos
RectanglePlus podem ser comparados.
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
96
3sando uma ,nter'ace como um Tipo.
Quando voc define uma nova interface, voc est definindo um novo tipo de dado de referncia.
Voc pode usar nomes de interfaces em qualquer outro lugar e voc pode usar qualquer outro nome de tipo
de dado. Se voc define uma varivel de referncia cujo tipo uma interface, qualquer objeto que voc
assinou para ele pode ter uma instncia de uma classe que implementa a interface.
Como um exemplo, aqui est um mtodo para encontrar a extenso de um objeto em um par de
objetos, para qualquer objeto que est instanciado da classe que implementa Relatable:
public Object findLargest(Object object1, Object object2) {
Relatable obj1 = (Relatable)object1;
Relatable obj2 = (Relatable)object2;
if ( (obj1).isLargerThan(obj2) > 0)
return object1;
else
return object2;
}
Para lanar object1 para um tipo Relatable, ele pode invocar o mtodo isLargerThan.
Se voc criar um ponto de implementao Relatable em uma vasta variedade de classes, os
objetos instanciados de qualquer uma dessas classes podem ser comparados com o mtodo
findLargest() estabelecido que ambos os objetos so da mesma classe. Similarmente, todos eles
podem ser comparados com os seguintes mtodos:
public Object findSmallest(Object object1, Object object2) {
Relatable obj1 = (Relatable)object1;
Relatable obj2 = (Relatable)object2;
if ( (obj1).isLargerThan(obj2) < 0)
return object1;
else
return object2;
}
public boolean isEqual(Object object1, Object object2) {
Relatable obj1 = (Relatable)object1;
Relatable obj2 = (Relatable)object2;
if ( (obj1).isLargerThan(obj2) == 0)
return true;
else
return false;
}
Esses mtodos trabalham para quaisquer objetos "relatable, no importa o que suas classes
esto herdando. Quando eles implementam Relatable, eles podem ser ambos de seus prprios tipos de
classes (ou superclasses) e um tipo Relatable. sto d a eles algumas das vantagens da mltipla
herana, onde eles podem ter comportamento de ambas: a superclasse e a herana.
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
97
(eescrevendo ,nter'aces.
Considere uma interface que voc desenvolveu chamada DoIt:
public interface DoIt {
void doSomething(int i, double x);
int doSomethingElse(String s);
}
Suponha que, mais tarde, voc quer adicionar um terceiro mtodo para DoIt, dessa forma, a
interface vem a ser:
public interface DoIt {
void doSomething(int i, double x);
int doSomethingElse(String s);
boolean didItWork(int i, double x, String s);
}
Se voc fizer esta mudana, todas as classes que implementam a antiga interface DoIt sero
quebradas porque elas no implementam mais a interface. Programadores confiando nesta interface
protestaro com estrondo.
Tente avisar todos os usurios de sua interface e especifique isto completamente desde o incio. Se
isto for impossvel, voc pode precisar criar mais interfaces mais tarde. Por exemplo, voc poderia criar a
interface DoIt que estende DoIt:
public interface DoItPlus extends DoIt {
boolean didItWork(int i, double x, String s);
}
Agora os usurios de seu cdigo podem escolher continuar usando a interface antiga ou atualizar
para a nova interface.
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
98
=erana.
Nas lies anteriores, voc viu o tema herana mencionado vrias vezes. Na linguagem Java,
classes podem ser derivadas de outras classes, e por meio disso, herdando campos e mtodos dessas
classes.
De'iniNesG
Uma classe que derivada de outra classe chamada subclasse (tambm uma classe derivada,
classes estendida -e7tended2; ou classe filha). A classe da qual a subclasse derivada chamada
superclasse (tambm conhecida como uma classe base ou uma classe pai).
Excetuando Object, que no tem superclasse, toda classe tem uma e somente uma superclasse
direta (herana simples). Na falta de qualquer outra superclasse explcita, qualquer classe
implicitamente uma subclasse de Oject.
Classes podem ser derivadas de classes que so derivadas de classes que so derivadas de
classes, e assim por diante, e a ltima pode ser derivada da classe mais ao topo, Object. De modo
que uma classe citada para ser descendente de todas as classes na cadeia da herana
estendendo o retorno para Object.
A idia de herana simples mas poderosa: quando voc quer criar uma nova classe e h uma
classe pronta que inclui alguns dos cdigos que voc quer, voc pode derivar sua nova classe da classe
existente. Fazendo isso, voc pode reusar os campos e mtodos da classe existente sem ter de reescrev-
la (e debug-la!).
Uma subclasse herda todos os membros (campos, mtodos, e classes aninhadas) da superclasse.
Construtores no so membros ento eles no so herdados pelas subclasses, mas o construtor da
superclasse pode ser invocado da subclasse.
A =ierar$uia de 7lasses da Plata'orma Java.
A classe Object, definida no pacore java.lang, define e implementa comportamentos comuns
para todas as classes incluindo as que voc escrever. Na plataforma Java, muitas classes derivam
diretamente de Object, outras classes derivam de algumas dessas classes, e assim por diante, formando
uma hierarquia de classes.
No topo da hierarquia, Object a mais genrica de todas as classes. Classes perto da parte de
baixo da hierarquia fornecem muitos comportamentos especializados.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
99
3m 9Eemplo de =erana.
Aqui est um cdigo exemplo para uma possvel implementao de uma classe Bicycle, que foi
apresentada na lio de Classes e Objetos:
public class Bicycle {
// a classe Bicycle tem trs campos
public int cadence;
public int gear;
public int speed;
// a classe Bicycle tem um construtor
public Bicycle(int startCadence, int startSpeed, int startGear) {
gear = startGear;
cadence = startCadence;
speed = startSpeed;
}
// a classe Bicycle tem quatro mtodos
public void setCadence(int newValue) {
cadence = newValue;
}
public void setGear(int newValue) {
gear = newValue;
}
public void applyBrake(int decrement) {
speed -= decrement;
}
public void speedUp(int increment) {
speed += increment;
}
}
A declarao para a classe MountainBike que uma subclasse de Bicycle pode parecer com
isto:
public class MountainBike extends Bicycle {
// a subclasse MountainBike adiciona um campo
public int seatHeight;
// a subclasse MountainBike tem um construtor
public MountainBike(int startHeight, int startCadence,
int startSpeed, int start Gear) {
super(startCadende, startSpeed, startGear);
seatHeight = startHeight;
}
// a subclasse MountainBike adiciona um mtodo
public void setHeight(int newValue) {
seatHeight = newValue;
}
}
MountainBike herda todos os campos e mtodos de Bicycle e adiciona o campo seatHeight
e o mtodo para apont-lo. Exceto para o construtor, isto como se voc tivesse escrito uma nova classe
MountainBike a partir da incio, com seus campos e cinco mtodos. No entanto, voc no tem de fazer
todo o trabalho. sto pode ser especialmente til se os mtodos na classe Bicycle so complexos e levam
um tempo substancial para debugar.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
100
O Yue )oc8 Pode /a-er em uma Subclasse.
Uma subclasse herda todos os membros public e private de sua classe pai, no importa em
qual pacote a subclasse esteja. Se a subclasse est no mesmo pacote que a classe pai, ela tambm herda
os membros package2private da classe pai. Voc pode usar os membros herdados assim como, substitu-
los, escond-los, ou supr-los com novos membros:
Os campos herdados podem ser usados diretamente, assim como quaisquer outros campos.
Voc pode declarar um campo na subclasse com o mesmo nome que um na superclasse, dessa
maneira escondendo ele (no recomendado).
Voc pode declarar novos campos na subclasse que no esto na superclasse.
Os mtodos herdados podem ser usados diretamente com eles so.
Voc pode escrever uma nova instncia de mtodo na subclasse que tem a mesma assinatura que
uma na superclasse, dessa forma passando por cima dela.
Voc pode escrever um novo mtodo static na subclasse que no est na superclasse.
Voc pode escrever um construtor na subclasse que invoca o construtor da superclasse, ou
implicitamente ou usando a palavra reservada super.
A seo seguinte nesta lio explicar estes tpicos.
!embros Privados em uma Superclasse.
Uma subclasse no pode herdar os membros private de sua classe pai. No entanto, se a
superclasse tiver mtodos public ou protected para acessar estes campos private, eles podem
tambm ser usados pela subclasse.
Uma classe aninhada tem acesso para todos os membros private da classe que a envolve
inclusive campos e mtodos. Conseqentemente, uma classe aninhada public ou protected herdada de
uma subclasse tem acesso indireto para todos os membros private da superclasse.
Lanando Objetos.
Ns vimos que um objeto do tipo de dado da classe da qual ele foi instanciado. Por exemplo, se
voc escrever:
public MountainBike myBike = new MountainBike();
ento myBike do tipo MountainBike.

MountainBike descendente de Bike e Object. Conseqentemente, uma MountainBike
uma Bicycle e tambm um Object, e ela pode ser usada em qualquer lugar onde Bicycle ou Object
forem chamados.
O contrrio no necessariamente verdade: uma Bicycle pode ser uma MountainBike, mas
no necessariamente. Similarmente, um Object pode ser uma Bicycle ou uma MountainBike, mas no
necessariamente.
Lanamento (,asting) mostra o uso de um objeto de um tipo no lugar de outro tipo, entre os objetos
permitidos pela herana e implementao. Por exemplo, se voc escrever:
Object obj = new MountainBike();
ento obj um Object e uma MountainBike (at o momento em que obj atribudo a qualquer
objeto que no uma MountainBike). sto chamado de lanamento implcito (implicit casting).
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
101
Se, por outro lado, voc escrever:
MountainBike myBike = obj;
voc pode conseguir um erro em tempo de compilao, porque obj no conhecido para o
compilador para ser um MountainBike. Porm, voc pode dizer ao compilador que voc promete atribuir
uma MoutainBike para obj por lanamento explcito (e7plicit casting):
MountainBike myBike = (MountainBike)obj;
Este lanamento insere uma checagem em tempo de execuo na qual obj atribudo a
MountainBike, dessa forma o compilador pode assumir sem perigo que obj uma MountainBike. Se
obj no uma MountainBike em tempo de execuo, uma exceo ser lanada.

Nota: Voc pode fazer um teste lgico de um tipo em particular de objeto usando o operador
instanceof. sto pode salvar voc de um erro em tempo de execuo devido a um lanamento
inapropriado. Por exemplo:
if (obj instanceof MountainBike) {
MountainBike myBike = (MountainBike)obj;
}
Aqui um operador instanceof verifica de que maneira um obj refere-se a uma MountainBike
de maneira que ns podemos fazer o lanamento com conhecimento (cast) que no haver lanamento de
exceo em tempo de execuo.
Passando Por 7ima e 9scondendo !Qtodos.
,nst#ncia de !Qtodos.
Uma instncia de mtodos em uma subclasse com a mesma assinatura (nome, membro adicional e
o tipo de seus parmetros) e retorna o tipo como uma instncia do mtodo na superclasse passando por
cima (overriding) do mtodo da superclasse.
A capacidade de uma subclasse para passar por cima de um mtodo permite a uma classe herdar
de uma superclasse aquele comportamento que "fechado o suficiente e tem ento a modificao do
comportamento como necessidade. O mtodo de passar por cima pode tambm retornar um subtipo de um
tipo retornado pelo mtodo sobrescrito. sto chamado um retorno de tipo covariante.
Quando passando por cima de um mtodo, voc pode querer usar a anotao @Override que
instrui o compilador que voc pretende passar por cima de um mtodo na superclasse. Se, por alguma
razo, o compilador detectar que o mtodo no existe na superclasse, ele gerar um erro.
!Qtodos de 7lasse.
Se uma subclasse define um mtodo de classe com a mesma assinatura que um mtodo na
superclasse, o mtodo na subclasse esconde ele na superclasse.
A distino entre esconder e passar por cima tem implicaes importantes. A verso da passagem
por cima do mtodo que invocado o mesmo na subclasse. A verso de esconder o mtodo que
invocado depende se ele invocado da superclasse ou da subclasse. D uma olhada no exemplo que
contm duas classes. A primeira Animal, que contm um instncia do mtodo e um mtodo da classe:
public class Animal {
public static void testClassMethod() {
System.out.println(The class method in Animal.);
}
public void testInstanceMethod() {
System.out.println(The instance method in Animal.);
}
}
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
102
A segunda classe, uma subclasse de Animal, chamada Cat:
public class Cat extends Animal {
public static void testClassMethod() {
System.out.println(The class method in Cat.);
}
public void testInstanceMethod() {
System.out.println(The instance method in Cat.);
}
public static void main(String[] args) {
Cat myCat = new Cat();
Animal myAnimal = myCat;
Anmal.testClassMethod();
myAnimal.testInstanceMethod();
}
}
A classe Cat passa por cima do mtodo da instncia em Animal e esconde o mtodo da classe em
Animal. O mtodo main na classe cria uma instncia de Cat e chama testClassMethod() na classe e
testInstanceMethod() na instncia.
A sada do programa a seguinte:
The class method in Animal.
The instance method in Cat.
Como prometido, a verso de esconder o mtodo que invocado o mesmo na superclasse, e a
verso de passar por cima do mtodo que invocado a mesma na subclasse.
!odi'icadores.
O acesso especial para um mtodo passado por cima pode permitir mais, mas no menos, acesso
que o mtodo de passar por cima Por exemplo, um mtodo da instncia protected na superclasse pode
ser feito public, mas no private, na subclasse.
Sum&rioG A seguinte tabela resume o que acontece quando voc define um mtodo com a mesma
assinatura que um mtodo na superclasse:
De'inindo um !Qtodo com a !esma Assinatura $ue o !Qtodo da Superclasse
!Qtodo da ,nst#ncia da
Superclasse
!Qtodo 9st&tico da
Superclasse
!Qtodo da ,nst#ncia na
Subclasse
Passagem por cima Fera um erro em tempo de
compilao
!Qtodo 9st&tico da
Subclasse
Fera um erro em tempo de
compilao
9sconde
%otaG Na subclasse, voc pode sobrecarregar os mtodos herdados da superclasse. Dessa
maneira nenhum mtodo herdado esconde nem sobrecarrega os mtodos da superclasse eles so novos
mtodos, exclusivos para a subclasse.
9scondendo 7ampos.
Dentro da classe, um campo que tem o mesmo nome de um campo na superclasse esconde os
campos da superclasse, mesmo se seus tipos so diferentes. Dentro da subclasse, o campo na superclasse
no pode ser referenciado por seu nome simples. Em vez disso, o campo pode ser acessado dentro de
super, que coberto na prxima seo. Falando genericamente, ns no recomendamos esconder
campos pois isso faz o cdigo difcil de ler.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
103
3sando a Palavra (eservada super.
Acessando !embros da Superclasse.
Se seu mtodo passa por cima de um dos mtodos da superclasse, voc pode invocar o mtodo de
passar por cima direto usando a palavra reservada super. Voc tambm pode usar super para referir-se a
um campo escondido (apesar de esconder campos ser desencorajado) Considere esta classe,
Superclass:
public class Superclass {
public void printMethod() {
System.out.prontln(Printed in Superclass.);
}
}
Aqui est uma subclasse, chamada Subclass, que passa por cima de printMethod():
public class Subclass extends Superclass {
public void printMethod() { // passa por cima de printMethod na
// Superclasse
super.printMethod();
System.out.println(Printed in Subclass);
}
public static void main(String[] args) {
Subclass s = new Subclass();
s.printMethod();
}
}
Dentro da Subclass, o nome simples printMethod() refere-se para o mesmo declarado na
Subclass, que passa por cima do mesmo na Superclass. Desta forma, para referir-se para
printMethod() herdado da Superclass, Subclass precisa usar um nome qualificador, usando super
como mostrado. Compilando e executando Subclass mostra o seguinte:
Printed in Superclass.
Printed in Subclass.
7onstrutores da Subclasse.
O sequinte exemplo ilustra como usar a palavra reservada super para invocar um construtor da
superclasse. Relembre que no exemplo Bicycle, MountainBike uma subclasse de Bicycle. Aqui est
o construtor da sublcasse MountainBike que chama o construtor da superclasse e ento adiciona o
cdigo de inicializao dela mesma:
public MountainBike(int startHeight, int startCadence,
int startSpeed, int startGear) {
super(startCadende, startSpeed, startGear);
seatHeight = startHeight;
}
A invocao de um construtor da superclasse pode ser a primeira linha no construtor da subclasse.
A sintaxe para chamar um construtor da superclasse :
super();
--or--
super(lista de parmetros);
Com super(), o construtor sem argumentos da superclasse chamado. Com super (lista
de parmetros), o construtor da superclasse com os parmetros correspondentes na lista chamado.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
104
%otaG Se um construtor no invoca explicitamente um construtor da superclasse, o compilador
Java automaticamente insere uma chamada para o construtor sem argumentos da superclasse. Se a
superclasse no tem um construtor sem argumentos, voc receber um erro em tempo de compilao.
Object atua como um construtor, dessa forma se Object o nico na superclasse, no h problema.
Se um construtor na sublcasse invoca um construtor desta superclasse, seja implcita ou
explicitamente, voc pode pensar que ser chamada uma srie completa de construtores, todos retornando
para o construtor de Object. De fato, este o caso. sto chamado constructor chaining (construtor
encadeado), e voc precisa tomar cuidado quando h uma longa linha de classes descendentes.
Object como uma Superclasse.
A classe Object, no pacote java.lang, est colocado no topo da rvore de hierarquia de classes.
Cada classe uma descendente, direta ou indiretamente, da classe Object. Voc no precisa usar
nenhum desses mtodos, mas, se voc escolher usar, voc precisa passar por cima dele com o cdigo que
especificado para sua classe. Os mtodos herdados de Object que so discutidos nesta seo so:
protected Object cone() throws CloneNotSupportedException
Cria e retorna uma cpia do objeto.
public boolean equals(Object obj)
ndica se algum outro objeto "igual a este.
protected void finalize() throws Throwable
Chamada para o garbage collector em um objeto quando o garbage collector determina que
no h mais referncias para o objeto.
public final Class getClass()
Retorna a classe em tempo de execuo de um objeto.
public int hashCode()
Retorna um valor hash code (cdigo revisado) para o objeto.
public String toString()
Retorna uma representao de string de um objeto.
Os mtodos notify, notifyAll, e wait de Object todos acionam uma parte em atividades de
sincronizao independentemente da fila corrente em um programa, o que ser discutido mais tarde na lio
e no ser coberto agora. H cinco desses mtodos:
public final void notify()
public final void notifyAll()
public final void wait()
public final void wait(long timeout)
publid final void wait(long timeout, int nanos)
Nota: H alguns aspectos sutis para alguns desses mtodos, especialmente o mtodo clone.
O !Qtodo clone().
Se a classe, ou sua superclasse, implementa a interface Cloneable, voc pode usar o mtodo
clone() para criar uma cpia de um objeto existente. Para criar um clone, voc escreve:
aCloneableb!ect.clone();
A implementao de Object deste mtodo checa para ver se o objeto em que clone() foi
invocado implementa a interface Cloneable. Se o objeto no faz isso, o mtodo lana uma exceo
CloneNotSupportedException. Excees manuais sero discutidas em uma lio mais tarde. Por este
momento, voc precisa saber que clone() precisa ser declarado como:
protected Object clone() throws CloneNotSupportedException
-- ou --
public Object clone() throws CloneNotSupportedException
se voc est escrevendo um mtodo clone*+ para passar por cima do mesmo em Object.
Se o objeto no qual clone() foi invocado no implementa a interface Cloneable, a
implementao de Object do mtodo clone() dria um objeto da mesma classe que o objeto original de
inicializa as novas variveis membros do objeto para terem os mesmos valores que as variveis membros
do objeto original correspondente.
Um caminho simples para fazer sua classe clonvel adicionar implements Cloneable para
sua declarao de classe, ento seus objetos podem invocar o mtodo clone().
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
105
Para algumas classes, o comportamento padro do mtodo Object's clone() trabalha muito
bem. Se, no entanto, um objeto conter uma referncia para um objeto externo, chamado ObjExternal,
voc precisaria passar por cima de clone() para conseguir o comportamento correto. Por outro lado, uma
mudana em ObjExternal pode fazer com que um objeto seja visvel neste clone tambm. sto significa
que o objeto original e este clone no so independentes para desassoci-los, voc precisa passar por
cima de clone(), para que ele clone o objeto e ObjExternal. Ento o objeto original referencia
ObjExternal e o clone referencia um clone de ObjExternal, dessa forma o objeto e seu clone sero
verdadeiramente independentes.
O !Qtodo equals().
O mtodo equals() compara dois objetos pela igualdade e retorna true se ele for igual. O
mtodo equals() fornecido na classe Object usa o operador de identidade (==) para determinar se dois
objetos so iguais. Para tipos de dados primitivos, ele retorna o resultado correto. Para objetos, no entanto,
ele no o faz. O mtodo equals() fornecido por Objects testa se as referncias ao objeto so iguais o
que , se os objetos comparados forem exatamente do mesmo tipo.
Para testar se dois objetos so iguais no sentido da equivalncia (contendo a mesma informao),
voc precisa passar por cima o mtodo equals(). Aqui est um exemplo de uma classe Book que usa
equals():
public class Book {
...
public boolean equals(Object obj) {
if (obj instanceof Book)
return ISBN.equals((Book)obj.getISBN());
else
return false;
}
}
Considere este cdigo que testa a igualdade de duas instncias da classe Book:
Book firstBook = new Book(0201914670);
Book secondBook = new Book(0201914670);
if (firstBook.equals(secondBook)) {
System.out.println(objects are equal);
} else {
System.out.println(objects are not equal);
}
Este programa mostra objects are equal comparando atravs da referncia de dois objetos
distintos firstBook e secondBook. Eles so considerados iguais porque os objetos comparados contm
o mesmo nmero BSN.
Voc sempre pode passar por cima o mtodo equals() se o operador de identificao no
apropriado para sua classe.
%otaG Se voc passar por cima equals(), voc precisa pode passar por cima hashCode() da
mesma forma.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
106
O !Qtodo finalize().
A classe Object fornece um mtodo de retorno, finalize(), que pode ser invocado em um
objeto quando ele torna-se lixo. A implementao de Object, finalize() no faz nada voc pode
passar por cima finalize para fazer limpeza, para liberao de recursos.
O mtodo finalize() pode ser chamado automaticamente pelo sistema, mas quando ele
chamado, ou ento se ele chamado, incerto. No entanto, voc no pode confiar neste mtodo para fazer
isto por voc. Por exemplo, se voc no fechar as descries de arquivos em seu cdigo depois da
execuo (93 #input9output% e voc omitir finalize() para fech-lo para fazer isto por voc, voc pode
perder os descritores do arquivo.
O !Qtodo getClass().
Voc no pode passar por cima getClass.
O mtodo getClass() retorna um objeto Class, que tem mtodos que voc pode usar para
conseguir informaes respeito da classe, da mesma maneira que o nome (getiSmpleName()), a
superclasse (getSuperclass()), e a interface que esta implementa (getInterfaces()). Por
exemplo, o seguinte mtodo pega e mostra o nome da classe de um objeto:
void printClassName(Object obj) {
System.out.println(The object's class is
oj.getClass().getSimpleName());
}
A classe Class, no pacote java.lang, tem um grande nmero de mtodos (mais de 50). Por
exemplo, voc pode testar para ver se a classe uma anotao (isAnnotation()), uma interface
(isInterface()), ou uma enumerao (isEnum()). Voc pode ver o que os campos dos objetos so
(getFields()) ou o que estes mtodos so (getMethods()), e assim por diante.

O !Qtodo hashCode().
O valor retornado por hashCode() o hash code cdigo modificado do objeto, que o endereo
de memria do objeto na memria em hexadecimal.
Por definio, se dois objetos so iguais, seus hash code precisam tambm ser iguais. Se voc
passa por cima o mtodo equals(), voc altera o modo como dois objetos so igualados e a
implementao de Object de hashCode() no mais vlida. Portanto, se voc passar por cima o mtodo
equals, voc prescisa tambm passar por cima o mtodo hashCode().
O !Qtodo toString().
Voc deve considerar sempre a passagem do mtodo toString() em suas classes.
O mtodo toString() de Object retorna uma representao String do objeto, que muito til
para debug. A representao String para um objeto depende unicamente do objeto, que o motivo de
voc precisar passar toString() em suas classes.
Voc pode usar toString() juntamente com System.out.println() para mostrar uma
representao de um objeto, como uma instncia de Book:
System.out.println(firstBook.toString());
que, pelo mtodo da propriedade toString() passada, mostra alguma coisa til, como isto:
ISBN: 0201914670; The JFC Swing Tutorial; A Guide to Constructing GUIs,
2nd Editon
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
107
9screvendo !Qtodos e 7lasses /inais.
Voc pode declarar alguns ou todos os mtodos da classe como final. Voc usa a palavra
reservada final em uma declarao do mtodo para indicar que o mtodo no pode ser passado por cima
pela subclasse. A classe Object faz isso um nmero desses mtodos final.
Voc pode escolher fazer um mtodo final se ele tem uma implementao que no pode ser
mudada e se crtico para a consistncia do estado do objeto. Por exemplo, voc pode querer fazer o
mtodo getFirstPlayer nesta classe final ChessAlgorithm:
class ChessAlgorithm {
enum ChessPlayer { WHITE, BLACK }
...
final ChessPlayer getFirstPlayer() {
return ChessPlayer.WHITE;
}
...
}
Mtodos chamados dos construtores podem geralmente ser declarados finais. Se um construtor
chama uma mtodo no-final, uma subclasse pode redefinir o mtodo com resultados inesperados ou
indesejveis.
Note que voc pode tambm declarar uma classe inteira final isto evita a classe de ser subclasse
sto particularmente til, por exemplo, quando estiver criando uma classe imutvel como a classe String.
7lasses e !Qtodos Abstratos.
Uma classe abstrata uma classe que declarada abstract ela pode ou no incluir mtodos
abstratos Classes abstratas no podem ser instanciadas, mas elas podem ter uma subclasse.
Um mtodo abstrato um mtodo que declarado sem uma implementao (sem chaves, e
seguido por um ponto-e-vrgula), como este:
abstract void moveTo(double destaX, double deltaY);
Se a classe incluir mtodos abstratos, a classe precisa ela mesma ser declarada abstract, como
em:
public abstract class GraphicObject {
// declare campos
// declare mtodos no abstratos
abstract void draw();
}
Quando uma classe abstrata tem uma subclasse, a subclasse usualmente fornece implementaes
para todos os mtodos abstratos na classe pai. Entretanto, se ela no o faz, a subclasse precisa tambm
ser declarada abstract.
%otaG Todos os mtodos em uma interface so implicitamente abstract, ento o modificador
abstract no usado com mtodos da interface (ele poderia ser somente isto no necessrio).
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
108
7lasses Abstratas versus ,nte'aces.
Diferente de interfaces, classes abstratas podem conter campos que no so static e final, e
eles podem conter mtodos implementados. Como classes abstract so similares a interfaces, exceto
que elas fornecem uma implementao parcial, deixam para a subclasse a complementao da
implementao. Se uma classe abstract contm somente declaraes de mtodos abstratos, ela pode
ser declarada como uma interface em seu lugar.
Mltiplas interfaces podem ser implementadas pelas classes em qualquer lugar na hierarquia da
classe, sendo ou no relatadas para uma outra em qualquer lugar. Pense em Comparable e Cloneable,
por exemplo.
Por comparao, classes abstract so comumente subclasses para compartilhar peas da
implementao. A classe simples abstract uma subclasse para classes similares que tm uma parte em
comum (as partes da implementao da classe abstrata), mas tambm tm algumas diferenas (os mtodos
abstratos).
3m 9Eemplo de 7lasse Abstrata.
Em uma aplicao de desenho orientado a objetos, voc pode desenhar crculos, retngulos, linhas,
curvas, e muitos outros objetos grficos. Todos esses objetos tm certamente estados (por exemplo:
position, orientation, line color, fill color) e comportamentos (por exemplo: move$o, rotate, resi>e,
draw) em comum. Alguns desses estados e comportamentos so os mesmos para todos os objetos grficos
por exemplo: position, fill color, and move$o. Outros requerem implementaes diferentes por
exemplo, resi>e ou draw. Todos os GraphicObjects precisam conhecer como desenhar ou
redimensionar eles mesmos; eles s diferem em como eles fazem isso. Esta uma situao perfeita para
uma superclasse abstract. Voc pode tirar vantagem das similaridades e declarar todos os objetos
grficos para herdarem do mesmo objeto pai por exemplo, GraphicObject, como mostrado na seguinte
figura:
Primeiro, voc declara uma classe abstrata, GraphicObject, para fornecer variveis e mtodos
dos membros que so totalmente compartilhados por todas as subclasses, como a posio atual e o mtodo
moveTo. GraphicsObject tambm declara mtodos abstratos para mtodos, como um draw ou resize,
que so implementados por todas as subclasses mas precisam ser implementados de diferentes maneiras.
A classe GraphicObject podem parecer como isto:
abstract class GraphicObject {
int x, y;
...
void moveTo(int newX, int newY) {
...
}
abstract void draw();
abstract void resize();
}
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
109
Cada sublcasse no abstrata de GraphicObject, como um Circle ou Rectangle, pode
fornecer implementaes para os mtodos draw e resize:
class Circle extends GraphicObject {
void draw() {
...
}
void resize() {
...
}
}
class Rectangle extends GraphicObject {
void draw() {
...
}
void resize() {
...
}
}
Yuando uma 7lasse Abstrata ,mplementa uma ,nter'ace.
Na seo (nterfaces, voc deve ter notado que a classe que implementa uma interface pode
implementar todos os mtodos da interface sto possvel, contudo, para definir uma classe que no
implementa todos os mtodos da interface, certifique-se que a classe declarada para ser abstract. Por
exemplo:
abstract class X implements Y {
// implementa tudo exceto um mtodo de Y
}
class XX extends X {
// implementa o restante do mtodo em Y
}
Neste caso, a classe X pode ser abstract porque ela no implementa completamente Y, mas a
classe XX, de fato, implementa Y.
!embros da 7lasse.
Uma classe abstrata pode ter campos estticos e mtodos estticos. Voc pode usar membros
estticos com um referncia classe por exemplo, AbstractClasss.staticMethod() - como voc
faria com qualquer outra classe.




Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
110
A 7lasse %Smeros.
Quando trabalhando com nmeros, muitas vezes voc usa tipos primitivos em seus cdigos. Por
exemplo:
int i = 500;
float gpa = 3.65;
byte mask = 0xff;
H, no entanto, razes para usar objetos em lugar de primitivos, e a plataforma Java fornece
classes empacotadas para cada tipo de dados primitivos. Essas classes "empacotam o primitivo em um
objeto. Muitas vezes, a embalagem concluda pelo compilador se voc usa um primitivo ao invs de um
objeto esperado, o compilador encaixota o primitivo nessa classe empacotada para voc. Similarmente, se
voc usa um objeto number quando um primitivo esperado, o compilador desempacota o objeto para
voc.:
Integer x, y;
x = 12;
y = 15;
System.out.println(x+y);
Quando x e y so designados como valores inteiros, o compilador encaixota os inteiros porque x e
y so objetos inteiros. Na declarao println(), x e y so desempacotados para que eles possam ser
adicionados como inteiros.
Todos as classes embaladas numricas so subclasses da classe abstrata Number:
%otaG H quatro outras subclasses de Number que no so discutidas aqui. BigDecimal e
BigInteger so usadas para clculos de alta preciso. AtomicInteger e AtomicLonger so usados
para aplicaes multi2thread.
H trs razes para que voc use um objeto Number ao invs de um primitivo:
Como um argumento de um mtodo que espera um objeto (muitas vezes usado quando
manipulando colees de nmeros).
Para usar constantes definidas pela classe, como em MIN_VALUE e MAX_VALUE, que fornece o
maior e o menor salto de um tipo de dado.
Para usar mtodos de classe para converso de valores para e dos tipos primitivos, para converso
para e de strings, e para converso entre sistemas numricos (decimal, octal, hexadecimal,
binrio).
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
111
A seguinte tabela lista os mtodos da instncia que todas as subclasses da classe Number
implementam.
!Qtodos ,mplementados por todas as Subclasses de Number
!Qtodo Descrio
byte byteValue()
short shortValue()
int intValue()
long longValue()
float floatValue()
double doubleValue()
7onverte o valor deste objeto Number para o tipo
de dado primitivo retornado.
int compareTo(Byte anotherByte)
int compareTo(Double anotherDouble)
int compareTo(Float anotherFloat)
int compareTo(Integer anotherInteger)
int compareTo(Long anotherLong)
int compareTo(Short anotherShort)
7ompara este objeto Number para o argumento.
boolean equals(Object obj)
Determina se este objeto Number Q igual ao
argumento. Os mQtodos retornam true se o
argumento no Q null e Q um objeto do mesmo
tipo e com o mesmo valor numQrico. =& alguns
re$uerimentos eEtras para objetos Double e
Float $ue so descritos na documentao AP,
Java.
Cada classe Number contm outros mtodos que so teis para converso de nmeros para e de
strings e para converso entre sistemas de nmeros. A seguinte tabela lista estes mtodos na classe
Integer. Mtodos de outras subclasses Number so similares.
!Qtodos de 7onverso; 7lasse Integer
!Qtodo Descrio
static Integer decode(String s)
Decodi'ica uma string em um inteiro. Pode
aceitar representaNes string de nSmeros
decimais; octais; ou "eEadedimais como entrada.
static int parseInt(String s)
(etorna um inteiro *somente decimal+
static int parseInt(String s, int
radix)
(etorna um inteiro; dando uma representao
string de nSmeros decimais; bin&rios; octais; ou
"eEadecimais *radix igual a B\; 6; ]; ou BA;
respectivamente+ como entrada.
String toString()
(etorna um objeto String representando o valor
deste Integer.
static String toString(int i)
(etorna um objeto String representando o
inteiro especi'icado.
Static Integer valueOf(int i)
(etorna um objeto Integer mantendo o valor do
primitivo especi'icado.
static Integer valueOf(String s)
(etorna um objeto Integer mantendo o valor da
representao da string especi'icada.
static Integer valueOf(String s, int
radix)
(etorna um objeto Integer mantendo o valor
inteiro da representao da string especi'icada;
analisada gramaticalmente com o valor de
radix. Por eEemplo; se s V <DDD? e radix V ]; o
mQtodo retorna o inteiro de base B\ e$uivalente
para o nSmero octal DDD.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
112
/ormatando Sadas %umQricas.
nicialmente voc viu o uso dos mtodos print() e println() para mostrar strings na sada
padro (System.out). Desde que todos os nmeros podem ser convertidos em strings, voc pode usar
esses mtodos para mostrar uma combinao de strings e nmeros. A linguagem de programao Java
tem outros mtodos, no entanto, que permitem a voc exercer muito mais controle sobre suas sadas
quando nmeros so includos.
Os !Qtodos printf() e println().
O pacote java.io inclui uma classe PrintStream que tem duas formataes de mtodos que
voc pode usar para substituir print() e println(). Esses mtodos, format() e printf(), so
equivalentes aos anteriores. O familiar System.out que voc est usando existe para ser o objeto
PrintStream, ento voc pode invocar os mtodos PrintStream em System.out. Dessa forma, voc
pode usar format() ou printf() em qualquer lugar em seu cdigo onde voc tenha previamente
usado print() ou println(). Por exemplo,
System.out.format(......);
A sintaxe para esses dois mtodos java.io.PrintStream a mesma:
public PrintStream format(String format, Object... args)
onde format uma string que especifica a formatao a ser usada e args uma lista de
variveis para serem mostradas usando aquela formatao. Um exemplo simples poderia ser:
System.out.format(The value of the float variable is %f, while the value
of the + integer variable is %d, and the string is %s,
floatVar, intVar, stringVar);
O primeiro parmetro, format, o formato da string especificando como os objetos no segundo
parmetro, args, esto sendo formatados. O formato da string contm um texto explicando os
especificadores de formato, que so caracteres especiais que formatam argumentos de Object... args.
(A notao Object... args chamada varargs, que menciona que o nmero de argumentos pode
variar).
Especificadores de formato comeam com o sinal de porcentagem ( % ) e terminam com um
conversor. O conversor um caracter indicando o tipo do argumento para ser formatado. Entre o sinal de
porcentagem ( % ) e o conversor voc pode ter marcadores e especificadores opcionais. H muitos
conversores, marcadores, e especificadores, que so documentados em java.util.Formatter.
Aqui est um exemplo bsico:
int i = 461012;
System.out.format(The value of i is: %d%n, i);
O especificador %d especifica que a varivel simples um inteiro decimal. O %n um caracter de
nova linha independente de plataforma. A sada :
The value of i is: 461012
Os mtodos printf() e format() so sobrecarregados. Cada um tem uma verso com a
seguinte sintaxe:
public PrintStream format(Locale l, String format, Object... args)
Para mostrar nmeros em sistema francs (onde a vrgula usada em lugar de um ponto decimal
na representao inglesa de nmeros de ponto flutuante), por exemplo, voc pode usar:
System.out.format(Locale.FRANCE, The value of the float variable is %f,
while the value of the + integer variables is %d, and the string is %s%n,
floatVar, intVar, stringVar);
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
113
3m 9Eemplo.
A seguinte tabela lista alguns dos conversores e marcadores que so usados em um simples
programa, TestFormat.java, que mostrado aps a tabela:
7onversores e !arcadores *'lags+ em TestFormat.java
7onversor !arcador
*'lag+
9Eplicao
d
3m inteiro decimal.
f
3m 'loat *'lutuante+
n
3m caracter de nova lin"a apropriado para a plata'orma
rodando a aplicao. )oc8 pode usar sempre %n; ao invQs
de \n.
tB
3ma converso date ^ time X especi'ica localmente o
nome completo do m8s.
td, te
3ma converso date ^ time X 6 dgitos dia do m8s. td 'oi
condu-ido para -ero; se necess&rio; te no.
ty, tY
3ma converso date ^ time X ty V 6 dgitos do ano; tY V
H dgitos do ano.
tl
3ma converso date ^ time X 'ormato de "oras em B6.
tM
3ma converso date ^ time X minutos em 6 digitos;
carregando os -eros se necess&rio
tp
3ma converso date ^ time X espec'ica local amUpm
*minSsculo+
tm
3ma converso date ^ time X meses em 6 dgitos;
carregando -eros; se necess&rio
tD 3ma converso date ^ time X data como %tm%td%ty
08
Oito caracteres de largura; carregando -eros se
necess&rio
+
,nclui sinais; se positivo ou negativo
,
,nclui caracteres especi'icados agrupados localmente
-
Justi'icado _ es$uerda
.3
Tr8s posiNes depois do ponto decimal
10.3
De- caracteres na largura; justi'icado _ direita; com tr8s
posiNes depois do ponto decimal
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
114
O seguinte programa mostra algumas formataes que voc pode fazer com format(). O pacote
java.util precisa ser importado pois ele contm as classes Locale e Calendar:
import java.util.*;
public class TestFormat {
public static void main(String[] args) {
long n = 461012;
System.out.format(%d%n, n);
System.out.format(%08d%n, n);
System.out.format(%+8d%n, n);
System.out.format(%,8d%n, n);
System.out.format(%+,8d%n%n, n);
double pi = Math.PI;
System.out.format(%f%n, pi);
System.out.format(%.3f%n, pi);
System.out.format(%10.3f%n, pi);
System.out.format(%-10.3f%n, pi);
System.out.format(Locale.FRANCE, %-10.4f%n%n, pi);
Calendar c = Calendar.getInstance();
System.out.format(%tB %te, %tY%n, c, c, c);
System.out.format(%tl:%tM %tp%n, c, c, c);
System.out.format(%tD%n, c));
}
A sada :
461012
00461012
+461012
461,012
+461,012
3.141593
3.142
3.142
3.142
3,1416
May 29, 2006
2:34 am
05/29/06
%otaG A discusso nesta seo cobre somente os mtodos bsicos de format() e printf().
Detalhes adicionais podem ser encontrados na seo +asic (93 entitulada "Formatando.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
115
A 7lasse DecimalFormat.
Voc pode usar a classe java.text.DecimalFormat para controlar a sada de zeros
direcionados e rastreados, prefixos e sufixos, separadores agrupados (milhares), e o separador decimal.
DecimalFormat oferece um grande rol de flexibilidade na formatao de nmeros, mas ela pode fazer
seus cdigos complexos.
O seguinte exemplo cria um objeto DecimalFormat, myFormatter, passando uma string padro
para o construtor DecimalFormat. O mtodo format(), que DecimalFormat herda de NumberFormat,
ento invocado por myFormatter ele aceita um valor double como um argumento e retorna o nmero
formatado em uma string:
Aqui est um exemplo de programa que ilustra o uso de DecimalFormat:
import java.text.*;
public class DecimalFormatDemo {
static public void customFormat(String pattern, double value) {
DecimalFormat myFormatter = new DecimalFormat(pattern);
String output = myFormatter.format(value);
System.out.println(value + + pattern + + output);
}
static public void main(String[] args) {
customFormat(###,###.###, 123456.789);
customFormat(###.##, 123456.789);
customFormat(000000.000, 123.78);
customFormat($###,###.###, 12345.67);
}
}
A sada :
123456.789 ###,###.### 123,456.789
123456.789 ###.## 123456.79
123.78 000000.000 000123.780
12345.67 $###,###.### $12,345.67
A seguinte tabela explica cada linha da sada:
Sada de DecimalFormat.java
)alor Padro Sada 9Eplicao
123456.789 ###,###.### 123,456.789
O sinal <cer$uil"a? * # + denota um dgito; a
vrgula Q uma lugar mantido para a
separao do grupo; e o ponto Q um lugar
mantido para o separador decimal
123456.789 ###.## 123456.79
O value tin"a tr8s dgitos _ direita do ponto
decimal; mas o padro tem somente dois. O
mQtodo 'ormat trata isto arredondando
acima.
123.78 000000.000 000123.780
O padro especi'ica rastro e carregamento
de -eros; por$ue o caracter \ Q usado ao
invQs do sinal <cer$uil"a? * # +
12345.67 $###,###.### $12,345.67
O primeiro caracter na con'igurao Q o sinal
de d:lar * $ +. %ote $ue ele imediatamente
precede o dgito mais _ es$uerda na sada
'ormatada.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
116
AlQm da AritmQtica @&sica.
A linguagem de programao Java suporta aritmtica bsica com os operadores: +, -, *, / e %. A
classe Math no pacote java.lang fornece mtodos e constantes para fazer clculos matemticos mais
avanados.
Os mtodos na classe Math so todos estticos, ento voc precisa cham-los diretamente da
classe, como em:
Math.cos(angle);
%otaG Usando a caracterstica da linguagem static import, voc no precisa escrever Math
na frente de cada funo matemtica:
import static java.lang.Math.*;
sto permite a voc invocar os mtodos da classe Math pelos seus nomes simples. Por exemplo:
cos(angle);
7onstantes e !Qtodos @&sicos.
A classe Math inclui duas constantes:
Math.E, que a base dos logaritmos naturais, e
Math.PI, que o raioi da circunferncia de um crculo para seu dimetro.
A classe Math tambm inclui mais de 40 mtodos estticos. A seguinte tabela lista alguns dos
mtodos bsicos:
!Qtodos @&sicos Math
!Qtodo Descrio
double abs(double d)
float abs(float f)
int abs(int i)
long abs(long lng)
(etorna o valor absoluto do argumento
double ceil(double d)
(etorna o menor inteiro $ue Q maior ou igual ao
argumento. (etornado como double
double floor(double d)
(etorna o maior inteiro $ue Q menor ou igual ao
argumento. (etornado como double.
double rint(double d)
(etorna o inteiro $ue Q 'ec"ado no valor do
argumento. (etornado como double.
long round(double d)
int round(float f)
(etorna o 'ec"ado long ou int; como indicado
pelo tipo de retorno do mQtodo; para o argumento
double min(double arg1, double arg2)
float min(float arg1, float arg2)
int min(int arg1, int arg2)
long min(long arg1, long arg2)
(etorna o menor dos dois argumentos
double max(double arg1, double arg2)
float max(float arg1, float arg2)
int max(int arg1, int arg2)
long max(long arg1, long arg2)
(etorna o maior dos dois argumentos
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
117
O seguinte programa, BasicMathDemo, ilustra como usar alguns desses mtodos:
public class BasicMathDemo {
public static void main(String[] args) {
double a = -191.635;
double b = 43.74;
int c = 16, d = 45;
System.out.printf(The absolute value of %.3f is %.3f%n, a, Math.abs(a));
System.out.printf(The ceiling of %.2f is %.0f%n, b, Math.ceil(b));
System.out.printf(The floor of %.2f is %.0f%n, b, Math.floor(b));
System.out.printf(The rint of %.2f is %.0f%n, b, Math.rint(b));
System.out.printf(The max of %d and %d is %d%n, c, d, Math.max(c, d));
System.out.printf(The min of %d and %d is %d%n,c, d, Math.min(c, d));
}
}
Aqui est a sada do programa:
The absolute value of -191.635 is 191.635
The ceiling of 43.74 is 44
The floor of 43.74 is 43
The rint of 43.74 is 44
The max of 16 and 45 is 45
The min of 16 and 45 is 16

!Qtodos 9Eponenciais e Logartmicos.
A prxima tabela lista mtodos exponenciais e logartmicos da classe Math:
!Qtodos 9Eponenciais e Logartmicos
!Qtodo Descrio
double exp(double d)
(etorna a base dos logaritmos naturais; e; para
a pot8ncia do argumento.
double log(double d)
(etorna o logaritmo natural do argumento
double pow(double base, double exponent)
(etorna o valor do primeiro argumento elevado
para a pot8ncia do segundo argumento
double sqrt(double d)
(etorna a rai- $uadrada do argumento
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
118
O seguinte programa, ExponentialDemo, mostra o valor de e, ento chama cada mtodo listado
na tabela anterior em nmeros escolhidos arbitrariamente:
public class ExponentialDemo {
public static void main(String[] args) {
double x = 11.635;
double y = 2.76;
System.out.printf(The value of e is %.4f%n, Math.E);
System.out.printf(exp(%.3f) is %.3f%n, x, Math.exp(x));
System.out.printf(log(%.3f) is %.3f%n, x, Math.log(x));
System.out.printf(pow(%.3f, %.3f) is %.3f%n, x, y, Math.pow(x, y));
System.out.printf(sqrt(%.3f) is %.3f%n, x, Math.sqrt(x));
}
}
Aqui est a sada:
The value of e is 2.7183
exp(11.635) is 112983.831
log(11.635) is 2.454
pow(11.635, 2.760) is 874.008
sqrt(11.635) is 3.411
!Qtodos TrigonomQtricos.
A classe Math fornece uma coleo de funes trigonomtricas, que so resumidas na seguinte
tabela. O valor passado em cada um desses mtodos um ngulo expressado em radianos. Voc pode
usar o mtodo toRadians para converter de graus para radianos.
!Qtodos TrigonomQtricos
!Qtodo Descrio
double sin(double d)
(etorna o seno do valor double especi'icado
double cos(double d)
(etorna o cosseno do valor double especi'icado
double tan(double d)
(etorna a tangente do valor especi'icado double
double asin(double d)
(etorna o arcosseno do valor especi'icado double
double acos(double d)
(etorna o arcocosseno do valor especi'icado double
double atan(double d)
(etorna a arcotangente do valor especi'icado double
double atan2(double y, double x)
7onverte coordenadas retangulares *x, y+ para
coordenadas polares *r, theta+ e retorna theta
double toDegrees(double d)
double toRadians(double d)
7onverte o argumento para graus ou radianos
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
119
Aqui est um programa, TrigonometricDemo, que usa cada um desses mtodos para calcular
vrios valores trigonomtricos para um ngulo de 45 graus:
public class TrigonometricDemo {
public static void main(String[] args) {
double degrees = 45.0;
double radians = Math.toRadians(degrees);
System.out.format(The value of pi is %.4f%n, Math.PI);
System.out.format(The sine of %.1f degrees is %.4f%n,
degrees, Math.sin(radians));
System.out.format(The cosine of %.1f degrees is %.4f%n,
degrees, Math.cos(radians));
System.out.format(The tangent of %.1f degrees is %.4f%n,
degrees, Math.tan(radians));
System.out.format(The arcsine of %.4f is %.4f degrees %n,
Math.sin(radians),
Math.toDegrees(Math.asin(Math.sin(radians))));
System.out.format(The arccosine of %.4f is %.4f degrees %n,
Math.cos(radians),
Math.toDegrees(Math.acos(Math.cos(radians))));
System.out.format(The arctangent of %.4f is %.4f degreees %n,
Math.tan(radians),
Math.toDegrees(Math.atan(Math.tan(radians))));
}
}
A sada do programa :
The value of pi is 3.1416
The sine of 45.0 degrees is 0.7071
The cosine of 45.0 degrees is 0.7071
The tangent of 45.0 degrees is 1.0000
The arcsine of 0.7071 is 45.0000 degrees
The arccosine of 0.7071 is 45.0000 degrees
The arctangent of 1.0000 is 45.0000 degrees
%Smeros (andZmicos.
O mtodo random() retorna um nmero selecionado pseudo-randmico entre 0.0 e 1.0. O alcance
inclui 0.0 mas no 1.0. Em outras palavras: 0.0 <= Math.random() < 1.0. Para conseguir um alcance
diferente, voc pode executar clculos no valor retornado pelo mtodo random. Por exemplo, para gerar um
inteiro entre 0 e 9, voc pode escrever:
int number = (int) (Math.random() * 10);
Pela multiplicao do valor por 10, o alcance dos valores possveis vem a ser 0.0 <= numer <
10.0.
Usar Math.random til quando voc precisa gerar um nmero simples randmico. Se voc
precisa gerar uma srie de nmeros randmicos, voc precisa criar uma instncia de java.util.Random
e invocar os mtodos nesse objeto para gerar nmeros.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
120
7aracteres.
Muitas vezes, se voc estiver usando um simples valor de caracter, voc usa o tipo char. Por
exemplo:
char ch = 'a';
char uniChar = '\u039A'; // Unicode para o caracter mega grego
char[] charArray ={ 'a', 'b', 'c', 'd', 'e' }; // um array de caracteres
H outras situaes, no entanto, quando voc precisa usar um char como um objeto por
exemplo, como um argumento do mtodo onde um objeto esperado. A linguagem de programao Java
fornece uma classe empacotadora que "empacota o char em um objeto Character para este propsito.
Um objeto do tipo Character contm um campo simples, cujo tipo char. Esta classe Character
tambm oferece um nmero de mtodos de classe teis (i.e., estticas) para manipulao de caracteres.
Voc pode criar um objeto Character com o construtor Character:
Character ch = new Character('a');
O compilador Java tambm cria um objeto Character para voc em outras circunstncias. Por
exemplo, se voc passar um primitivo char em um mtodo que espera um objeto, o compilador
automaticamente converte o char para um Character para voc. Esta caracterstica chamada
autobo7ing ou unbo7ing, se a converso vai pelo caminho inverso.
Aqui est um exemplo de bo7ing:
Character ch = 'a'; // o char primitivo 'a' empacotado
// no objeto Character
e aqui est um exemplo de ambos: empacotamento e desempacotamento:
Character test(Character c) {...} // parmetros do mtodo e
// retorno do tipo = objeto Character
char c = test('x'); // primitivo 'x' empacotado pelo mtodo test,
// retorno desempacotado para char 'c'
%otaG A classe Character imutvel, dessa forma, uma vez que ela criada, o objeto
Character no pode ser mudado.
A seguinte tabela lista alguns dos mtodos mais teis na classe Character, mas no completa.
Para consultar uma lista completa dos mtodos nesta classe (h mais de 50), recorra especificao )*(
java.lang.Character.
!Qtodos `teis na 7lasse Character
!Qtodo Descrio
boolean isLetter(char ch)
boolean isDigit(char ch)
Determina se o valor char especi'icado Q uma
letra ou um dgito; respectivamente
boolean isWhiteSpace(char ch) Determina se o valor char especi'icado Q um
espao em branco
boolean isUpperCase(char ch)
boolean isLowerCase(char ch)
Determina se o valor char especi'icado Q uma
letra maiSscula ou minSscula; respectivamente
char toUpperCase(char ch)
char toLowerCase(char ch)
(etorna a letra maiSscula ou minSscula do valor
char especi'icado
toString(char ch)
(etorna um objeto string representando o valor
do caracter especi'icado X $ue Q um caracter
Snico string
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
121
Se$R8ncias de /uga *Escape SeDuences+.
Um caracter precedido por uma barra invertida ( \ ) uma seqncia de fuga e tem um significado
especial para o compilador. Um caracter de nova linha ( \n ) tem sido usado freqentemente neste tutorial
nas declaraes System.out.println() para avanar para a prxima linha depois que a string
mostrada. A seguinte tabela mostra as seqncias de fuga Java:
Se$R8ncias de /uga *Escape SeDuences+
Se$R8ncia de /uga Descrio
\t ,nsere uma tabulao no teEto neste ponto
\b ,nsere um retrocesso no teEto neste ponto
\n ,nsere uma nova lin"a no teEto neste ponto
\r ,nsere um retorno de carro no teEto neste ponto
\f ,nsere uma alimentao de 'ormul&rio no teEto neste ponto
\' ,nsere um caracter aspa simples no teEto neste ponto
\ ,nsere um caracter aspa dupla no teEto neste ponto
\\ ,nsere um caracter barra invertida no teEto neste ponto
Quando uma seqncia de fuga encontrada em uma declarao print (mostrar), o compilador
interpreta isto adequadamente. Por exemplo, se voc quer colocar aspas dentro de aspas, voc precisa
usar a seqncia de fuga, \, no interior das aspas. Para mostrar a seqncia:
She said Hello! to me.
Voce precisa escrever:
System.out.println(She said \Hello!\ to me.);
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
122
Strings.
Strings, que so amplamente usados na programao Java, so uma seqncia de caracteres. Na
linguagem de programao Java, strings so objetos.
A plataforma Java fornece a classe String para criar e manipular strings.
7riando Strings.
O caminho mais direto para criar uma string escrever:
String greeting = Hello World!;
Neste caso, Hello World! uma string literal uma srie de caracteres em seu cdigo que
envolvida em aspas duplas. Quando encontrado uma string literal em seu cdigo, o compilador cria um
objeto String com este valor neste caso, Hello World!.
Como com qualquer outro objeto, voc pode criar objetos String usando a palavra reservada new
e o construtor. A classe String tem 11 construtores que fornecem a voc um valor inicial da string usando
fontes diferentes, como em um array de caracteres:
char[] helloArray = { 'h', 'e', 'l', 'l', 'o', '.'};
String helloString = new String(helloArray);
System.out.println(helloString);
A ltima linha do cdigo mostra hello.
%otaG A classe String imutvel, ento a partir do momento que um objeto String criado ele
no pode ser mudado. A classe String tem um nmero de mtodos, alguns sero discutidos a seguir, que
aparecem para modificar strings. Desde que strings so imutveis, o que estes mtodos realmente fazem
criar e retornar uma nova string que contm o resultado da operao.
String Length *9Etenso da String+.
Mtodos usados para obter informaao a respeito de um objeto so conhecidos como mQtodos de
acesso. Um mtodo de acesso que voc pode usar com strings o mtodo length(), que retorna o
nmero de caracteres contidos no objeto string. Depois das seguintes duas linhas de cdigo serem
executadas, len igual a 17:
String palindrome = Dot saw I was Tod;
int len = palindrome.lenght();
Um palndromo uma palavra ou sentena que simtrica ela soletrada da mesma forma para
a frente e para trs, ignorando maisculas e pontuao. Aqui est um pequeno e ineficiente programa para
reverter uma string palndroma. Ela invoca o mtodo String charAt(i), que retorna o i
th
caracter na
string, contando do 0.
public class StringDemo {
public static void main(String[] args) {
String palindrome = Dot saw I was Tod;
int len = palindrome.length();
char[] tempCharArray = new char[len];
char[] charArray = new char[len];
//coloca a string original em um array de chars
for (int i = 0; i < len; i++) {
tempCharArray[i] = palindrome.charAt(i);
}
// reverte o array de chars
for (int j = 0; j < len; j++) {
charArray[j] = tempCharArray[len - 1 - j];
}
String reversePalindrome = new String(charArray);
System.out.println(reversePalindrome);
}
}
A sada do programa :
doT saw I was toD
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
123
Para realizar a reverso da string, o programa teve que converter a string em um array de
caracteres (primeiro loop for), reverter o array em um segundo array (segundo loop for), e ento
converter novamente em uma string. A classe String inclui um mtodo, getChars(), para converter uma
string, ou uma poro de uma string, em um array de caracteres ento ns poderamos substituir o
primeiro loop for no programa acima com
palindrome.getChars(0, len - 1, tempCharArray, 0);
7oncatenando Strings.
A classe String inclui um mtodo para concatenar duas strings:
string1.concat(string2);
sto retorna uma nova string que a string1 com a string2 adicionada a ela no final.
Voc tambm pode usar o mtodo concat() com strings literais, como em:
My name is .concat(Rumplestiltskin);
Strings so mais comumente concatenadas com o operador +, como em:
Hello, + world + !
que resulta em:
Hello, world!
O operador + amplamente usado nas declaraes print. Por exemplo:
String string1 = saw I was ;
System.out.println(Dot + string1 + Tod);
que mostra:
Dot saw I was Tod
Desta maneira uma concatenao pode ser uma mistura de quaisquer objetos. Para cada objeto
que no uma String, o mtodo toString() chamado para converter para uma String.
%otaG A linguagem de programao Java no permite strings literais para ampliar linhas em
cdigos fontes, ento voc pode usar o operador de concatenao + no final de cada linha em uma string
multi-linhas. Por exemplo:
String quote = Now is the time for all good +
men to come to the aid of their country.;
Quebrar strings entre linhas usando o operador de concatenao + , novamente, muito comum
em declaraes print.
7riando Strings /ormatadas.
Voc tem visto o uso dos mtodos printf() e format() para mostrar a sada com nmeros
formatados. A classe String tem um mtodo de classe equivalente, format(), que retorna um objeto
String melhor que um objeto PrintStream.
Usando mtodo esttico format() de String permite a voc criar uma string formatada que
voc pode reusar, em oposio a uma antiga declarao print. Por exemplo, ao invs de
System.out.printf(The value of the float variable is %f, while the value of the +
integer variable is %d, and the string is %s, floatVar, intVar, stringVar);
voc pode escrever:
String fs;
fs = String.format(The value of the float variable is %f, while the value of the +
integer variable is %d, and the string is %s, floatVar, intVar, stringVar);
System.out.println(fs);
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
124
7onverso 9ntre %Smeros e Strings.
7onvertendo Strings em %Smeros.
Freqentemente, um programa acaba com dados numricos em um objeto string um valor
entrado pelo usurio, por exemplo.
As subclasses Number que envolvem tipos numricos primitivos (Byte, Integer, Double, Float,
Long e Short) cada uma fornece um mtodo da classe nomeada valueOf que converte uma string em
um objeto daquele tipo. Aqui est um exemplo, ValueOfDemo, que pega duas strings da linha de
comando, converte elas em nmeros e efetua operaes matemticas nesses valores:
public class ValueOfDemo {
public static void main(String[] args) {
// este programa requer dois argumentos na linha de comando
if(args.length == 2) {
//converte strings em nmeros
float a = (Float.valueOf(args[0]) ).floatValue();
float b = (Float.valueOf(args[1]) ).floatValue();
// faz alguns clculos
System.out.println(a + b = + (a + b) );
System.out.println(a - b = + (a - b) );
System.out.println(a * b = + (a * b) );
System.out.println(a / b = + (a / b) );
System.out.println(a % b = + (a % b) );
} else {
System.out.println(This program requires two command-lines+
arguments.);
}
}
}
A sada do programa quando voc usa 4.5 e 87.2 na linha de comando :
a + b = 91.7
a - b = -82.7
a * b = 392.4
a / b = 0.0516055
a % b = 4.5
%otaG Cada uma das subclasses Number que envolvem tipos primitivos numricos tambm
fornece um mtodo parseXXXX() (por exemplo, parseFloat()), que pode ser usado para converter
strings em nmeros primitivos. Desde que um tipo primitivo retornado ao invs de um objeto, o mtodo
parseFloat() mais direto que o mtodo valueOf(). Por exemplo, no programa ValueOfDemo, ns
poderamos usar:
float a = Float.parseFloat(args[0]);
float b = Float.parseFloat(args[1]);
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
125
7onvertendo %Smeros em Strings.
Algumas vezes voc precisa converter um nmero em uma string porque voc precisa operar no
valor em esta forma de string. H muitas maneiras fceis para converter um nmero em uma string:
int e;
String s1 = + i; // Concatena i com uma string vazia;
// Converso manobrada por voc
ou
String s2 = String.valueOf(i); // O mtodo da classe valueOf
Cada uma das subclasses de Number inclui um mtodo da classe, toString(), que converter
este tipo primitivo em uma string. Por exemplo:
int i;
double d;
String s3 = Integer.toString(i);
String s4 = Double.toString(d);
O exemplo ToStringDemo usa o mtodo toString para converter um nmero em uma string. O
programa ento usa alguns mtodos string para calcular o nmero de dgitos antes e depois do ponto
decimal:
public class ToStringDemo {
public static void main(String[] args) {
double d = 858.48;
String s = Double.toString(d);
int dot = s.indexOf('.');
System.out.println(dot + digits before decimal point.);
System.out.println( (s.length() - dot - 1) +
digits after decimal point.);
}
}
A sada do programa :
3 digits before decimal point.
2 digits after decimal point.
//=================================================================================
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
126
!anipulando 7aracteres em uma String.
A classe String tem um nmero de mtodos para examinar o contedo de strings, encontrando
caracteres ou substrings dentro de uma string, mudando case (maiscula ou minscula), e outras tarefas.
Pegando 7aracteres e Substrings pelo andice.
Voc pode pegar o caracter de um ndice em particular dentro de uma string invocando o mtodo
de acesso charAt(). O ndice do primeiro caracter 0, enquanto o ndice do ltimo caracter length()-
1. Por exemplo, o seguinte cdigo pega o caracter no ndice 9 em uma string:
String anotherPalindrome = Niagara. O roar again!;
char aChar = anotherPalindrome.charAt(9);
ndices comeam com 0, ento o caracter no ndice 9 'O', como ilustrado na seguinte figura:
Se voc quer pegar mais que um caracter consecutivo de uma string, voc pode usar o mtodo
substring. O mtodo substring tem duas verses, como mostra a seguinte tabela:
Os !Qtodos substring na classe String.
!Qtodo Descrio
String substring(int
beginIndex, int endIndex)
(etorna uma nova string $ue Q uma substring dessa
string. O primeiro argumento inteiro especi'ica o ndice
do primeiro caracter. O segundo argumento integer Q o
ndice do Sltimo caracter W B.
String substring(int
beginIndex)
(etorna uma nova string $ue Q uma substring dessa
string. O argumento integer especi'ica o ndice do
primeiro caracter. A$ui; a substring retornada estende2se
para o 'inal da string original.
O seguinte cdigo pega do palndromo Niagara a substring que estende-se do ndice 11 acima,
mas no incluindo o ndice 15, que forma a palavra "roar:
String anotherPalindrome = Niagara. O roar again!;
String roar = anotherPalindrome.substring(11, 15);
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
127
Outros !Qtodos para !anipular Strings.
Aqui esto alguns outros mtodos String para manipulao de strings:
Outros !Qtodos na 7lasse String para !anipulao de Strings
!Qtodo Descrio
String[] split(String regex)
String[] split(String regex, int
limit)
Procura por um igual como especi'icado pelo
argumento string *$ue contQm uma eEpresso regular+
e divide esta string em um array de strings
correspondente. O argumento integer opcional
especi'ica o taman"o m&Eimo do array retornado.
CharSequence subSequence(int
beginIndex, int endIndex)
(etorna uma nova se$R8ncia de caracteres construda
do ndice beginIndex atQ endIndex - 1.
String trim()
(etorna uma c:pia dessa string com espaos em
branco removidos
String toLowerCase()
String toUpperCase()
(etorna uma c:pia dessa string convertida para letras
minSsculas ou maiSsculas Se nen"uma converso 'or
necess&ria; esses mQtodos retornam a string original.
Procurando por 7aracteres e Substrings em uma String.
H alguns outros mtodos para encontrar caracteres ou substrings dentro de uma string. A classe
String fornece mtodos de acesso que retornam a posio dentro da string de um caracter especfico ou
substring: indexOf() e lastIndexOf(). O mtodo indexOf() procura do comeo para frente da
string, e o mtodo lastIndexOf() procura do final para trs da string. Se um caracter ou substring no
encontrado, indexOf() e lastIndexOf() retornam -1.
A classe String tambm fornece um mtodo de busca, contains, que retorna true se a string
contm uma seqncia de caracteres em particular. Use este mtodo quando voc somente precisar saber
que a string contm a seqncia de caracteres, mas a localizao precisa no seja importante.
A seguinte tabela descreve os vrios mtodos de busca em strings:
Os !Qtodos de @usca na 7lasse String
!Qtodo Descrio
int indexOf(int ch)
int lastIndexOf(int ch)
(etorna o ndice da primeira *Sltima+
ocorr8ncia do caracter especi'icado
int indexOf(int ch, int fromIndex)
int lastIndexOf(int ch, int fromIndex)
(etorna o ndice da primeira *Sltima+
ocorr8ncia do caracter especi'icado;
procurando para a 'rente *para tr&s+ do ndice
especi'icado
int indexOf(String str)
int lastIndexOf(String str)
(etorna o ndice da primeira *Sltima+
ocorr8ncia da substring especi'icada
int indexOf(String str, int fromIndex)
int lastIndexOf(String str, int
fromIndex)
(etorna o ndice da primeira *Sltima+
ocorr8ncia da substring especi'icada;
procurando para a 'rente *para tr&s+ do ndice
especi'icado.
boolean contains(CharSequence s)
(etorna true se a string contQm a se$R8ncia de
caracteres especi'icada
%otaG CharSequence uma interface que implementada pela classe String. Por essa razo,
voc pode usar uma string como um argumento do mtodo contains().
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
128
Substituindo 7aracteres e Substrings em uma String.
A classe String tem poucos mtodos para insero de caracteres ou substrings em uma string.
Em geral, no h necessidade: voc pode criar uma nova string pela concatenao de substrings/
A classe String tem quatro mtodos para substituir caracteres ou substrings encontrados,
todavia. Eles so:
!Qtodos para a !anipulao de Strings na 7lasse String
!Qtodo Descrio
String replace(char oldChar, char
newChar)
(etorna uma nova string resultante da substituio
de todas as ocorr8ncias de oldChar nesta string
com newChar.
String replace(CharSequence target,
CharSequence replacement)
Substitui cada substring da string $ue Q igual _
se$R8ncia alvo com a se$R8ncia de substituio
literal especi'icada.
String replaceAll(String regex,
String replacement)
Substitui cada substring da string $ue Q igual _
eEpresso regular dada com a substituio dada.
String replaceFirst(String regex,
String replacement)
Substitui a primeira substring dessa string $ue Q
igual _ eEpresso regular dada com a substituio
dada.
3m 9Eemplo.
A seguinte classe, Filename, ilustra o uso de lastIndexOf() e substring() para isolar
diferentes partes de um nome de arquivo.
%otaG Os mtodos na seguinte classe Filename no checam qualquer erro e assumem que seus
argumentos contm um caminho de diretrio completo com uma extenso. Se esses mtodos produzissem
cdigo, eles poderiam verificar que seus argumentos estavam construdos adequadamente.
/**
* Esta classe assume que a string usada para inicializar
* o caminho completo tem um caminho de diretrio, nome de arquivo, e extenso.
* Os mtodos no funcionam se isto no existir.
*/
public class Filename {
private String fullPath;
private char pathSeparator, extensionSeparator;
public Filename(String str, char sep, char ext) {
fullPath = str;
pathSeparator = sep;
extensionSeparator = ext;
}
public String extension() {
int dot = fullPath.lastIndexOf(extensionSeparator);
return fullPath.substring(dot + 1);
}
public String filename() { // pega o nome do arquivo sem a extenso
int dot = fullPath.lastIndexOf(extensionSeparator);
int sep = fullPath.lastIndexOf(pathSeparator);
return fullPath.substring(sep + 1, dot);
}
public String path() {
int sep = fullPath.lastIndexOf(pathSeparator);
return fullPath.substring(0, sep);
}
}
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
129
Aqui est um programa, FileNameDemo, que constri um objeto Filename e chama todos os seus
mtodos:
public class FileNameDemo {
public static void main(String[] args) {
final String FPATH = /home/mem/index.html;
Filename myHomePage = new Filename(FPATH, '/', '.');
System.out.println(Extension = + myHomePage.extension());
System.out.println(Fileneme = + myHomePage.filename());
System.out.println(Path = + myHomePage.path());
}
}
E aqui est a sada do programa:
Extension = html
Filename = index
Path = /home/mem
Como mostra a seguinte figura, seu mtodo extension usa lastIndexOf para descobrir a ltima
ocorrncia do ponto ( . ) no nome do arquivo. Ento substring usa o valor retornado de lastIndexOf
para extrair a extenso do nome do arquivo isto , a substring do ponto at o final da string. Este cdigo
assume que o nome do arquivo tem um ponto nele; se o nome no tem um ponto, lastIndexOf retorna -1,
e o mtodo da substring lana uma StringIndexOutBoundsException.
Alm disso, repare que o mtodo extension usa dot + 1 como o argumento para substring.
Se o caracter ponto ( . ) o ltimo caracter da string, dot + 1 igual ao tamanho da string, que a
extenso do maior ndice na string (porque ndices iniciam com 0). Este um argumento legal para
substring porque este mtodo aceita um ndice igual a, mas no maior que, o tamanho da string e
interpreta isto para significar "o final da string.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
130
7omparando Strings e PorNes de Strings.
A classe String tem um nmero de mtodos para comparar strings e pores de strings. A
seguinte tabela lista esses mtodos:
!Qtodos para 7omparao de Strings
!Qtodo Descrio
boolean endsWith(String suffix)
boolean startsWith(String prefix)
(etorna true se esta string termina ou comea
com a substring especi'icada como um
argumento para o mQtodo
boolean starsWith(String prefix, int
offset)
7onsidera a string comeando pelo ndice
offset; e retorna true se ela comea com a
substring especi'icada como um argumento
int compareTo(String anotherString)
7ompara duas strings leEicogra'icamente.
(etorna um inteiro indicando se esta string Q
maior $ue *resultado Q O \+; igual a *resultado Q V
\+; ou menor $ue *resultado Q b \+ o argumento.
int compareToIgnoreCase(String str)
7ompara duas strings leEicogra'icamente;
ignorando di'erenas entre minSsculas e
maiSsculas. (etorna um inteiro indicando se esta
string Q maior $ue *resultado Q O \+; igual a
*resultado Q V \+; ou menor $ue *resultado Q b \+
o argumento
boolean equals(Object anObject)
(etorna true se e somente se o argumento Q um
objeto String $ue representa a mesma
se$R8ncia de caracteres $ue este objeto.
boolean equalsIgnoreCase(String
anotherString)
(etorna true se e somente se o argumento Q um
objeto String $ue representa a mesma
se$R8ncia de caracteres $ue este objeto;
ignorando di'erenas entre minSsculas e
maiSsculas.
boolean regionMatches(int toffset,
String other, int ooffset, int len)
Testa se a regio especi'icada da string Q igual _
regio do argumento da String. (egio Q o
taman"o len e comea no ndice toffset para
esta string e ooffset para a outra string.
boolean regionMatches(boolean
ignoreCase, int toffset, String other,
int ooffset, int len)
Testa se a regio especi'icada da string Q igual _
regio especi'icada do argumento da String.
(egio Q o taman"o len e comea no ndice
toffset para esta string e ooffset para outra
string. O argumento boolean indica se
di'erenas entre caracteres minSsculos e
maiSsculos podem ser ignorados; se verdadeiro;
as di'erenas so ignoradas $uando comparando
caracteres.
boolean matches(Sting regex)
Testa se esta string Q igual _ eEpresso regular.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
131
O seguinte programa, RegionMatchesDemo, usa o mtodo regionMatches para procurar por
uma string dentro de outra string:
public class RegionMatchesDemo {
public static void main(String[] args) {
String searchMe = Green Eggs and Ham;
String findMe = Eggs;
int searchMeLength = searchMe.length();
int findMeLength = findMe.length();
boolean foundIt = false;
for (int i = 0; i <= (searchMeLength - findMeLength); i++) {
if (searchMe.regionMatches(i, findMe, 0, findMeLenght)) {
foundIt = true;
System.out.println(searchMe.substring(i, i + findMeLength));
break;
}
}
if (!foundIt) System.out.println(No match found.);
}
}
A sada do programa Eggs.
O programa passa atravs da string referida por searchMe um caracter de cada vez. Para cada
caracter, o programa chama o mtodo regionMatches para determinar se a substring comeando com o
caracter corrente igual string que o programa est olhando.
A 7lasse StringBuilder.
Objetos StringBuilder so como objetos String, exceto que eles podem ser modificados.
nternamente, esses objetos so tratados como arrays de tamanho varivel que contm uma seqncia de
caracteres. Em qualquer ponto, o tamanho e contedo da seqncia pode ser mudado por meio da
invocao de mtodos.
Strings podem sempre ser usadas a menos que construtores de string ofeream uma vantagem
em termos de simplificao do cdigo (veja o programa exemplo no fim desta seo) ou melhorar a
performance. Por exemplo, se voc precisa concatenar um grande nmero de strings, escolher um objeto
StringBuilder mais eficiente.
Taman"o e 7apacidade.
A classe StringBuilder, como a classe String, tem um mtodo length() que retorna o
tamanho da seqncia de caracteres no construtor.
Diferente de strings, cada construtor string tambm tem uma capacidade, o nmero de espaos de
caracteres que esto alocados. A capacidade, que retornada pelo mtodo capacity(), sempre maior
ou igual que o tamanho (usualmente maior que) e automaticamente expandir de acordo coma necessidade
para acomodar adies para o construtor string.
7onstrutores StringBuilder
7onstrutor Descrio
StringBuilder()
7ria um construtor string va-io com a
capacidade de BA *BA elementos va-ios+
StringBuilder(CharSequence cs)
7ria um construtor string contendo os mesmos
caracteres $ue a CharSequence especi'icada;
mais um eEtra de BA elementos va-ios seguindo
a CharSequence.
StringBuilder(int initCapacity)
7ria um construtor string com a capacidade
inicial especi'icada.
StringBuilder(String s)
7ria um construtor string cujo valor Q iniciali-ado
pela string especi'icada; mais um eEtra de BA
elementos va-ios seguindo a string.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
132
Por exemplo, o seguinte cdigo:
StringBuilder sb = new StringBuilder();//cria um construtor vazio, capacidade 16
sb.append(Greetings);//adiciona 9 caracteres string no comeo
produzir um construtor string com um tamanho 9 e uma capacidade 16:
A classe StringBuilder tem alguns mtodos associados para tamanho e capacidade que a
classe String no tem:
!Qtodos de Taman"o e 7apacidade
!Qtodo Descrio
void setLenght(int newLength)
9stabelece o taman"o da se$R8ncia de
caracteres. Se newLength Q menor $ue
length(); o Sltimo caracter na se$R8ncia est&
truncado *incompleto+. Se newLength Q maior
$ue length(); caracteres nulos so adicionados
ao 'inal da se$R8ncia de caracteres.
void ensureCapacity(int minCapacity)
Farante $ue a capacidade Q ao menos igual $ue
o mnimo especi'icado.
Um nmero de operaes (por exemplo, append(), insert(), ou setength()) pode aumentar
o tamanho da seqncia de caracteres no construtor string a fim de que o length() (tamanho) resultante
seja maior que a !apa!it"() (capacidade) resultante. Quando isso acontece, a capacidade
automaticamente aumentada.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
133
OperaNes String@uilder.
As principais operaes em um StringBuilder que no so disponveis em String so os
mtodos append() e insert(), que so sobrecarregados assim como aceitam dados de qualquer tipo.
Cada um converte este argumento em uma string e ento anexa ou insere os caracteres dessa string para
a seqncia de caracteres no construtor string. O mtodo append() sempre adiciona esses caracteres
no final da seqncia de caracteres, enquanto o mtodo insert() adiciona os caracteres para o ponto
especificado.

Aqui est uma srie de mtodos da classe StringBuilder:
Diversos !Qtodos String@uilder
!Qtodo Descrio
StringBuilder append(boolean b)
StringBuilder append(char c)
StringBuilder append(char[] str)
StringBuilder append(char[] str, int offset,
int len)
StringBuilder append(double d)
StringBuilder append(float f)
StringBuilder append(int i)
StringBuilder append(long lng)
StringBuilder append(Object obj)
StringBuilder append(String s)
AneEa o argumento para o construtor
string. O dado Q convertido para uma
string antes da operao append()
acontecer.
StringBuilder delete(int start, int end)
StringBuilder deleteCharAt(int index)
Deleta o*s+ caracter*s+ especi'icado neste
construtor string.
StringBuilder insert(int offset, boolean b)
StringBuilder insert(int offset, char c)
StringBuilder insert(int offset, char[] str)
StringBuilder insert(int offset, char[] str,
int offset, int len)
StringBuilder insert(int offset, double d)
StringBuilder insert(int offset, float f)
StringBuilder insert(int offset, int i)
StringBuilder insert(int offset, long lng)
StringBuilder insert(int offset, Object obj)
StringBuilder insert(int offset, String s)
,nsere o segundo argumento no construtor
string. O primeiro argumento integer
indica o ndice anterior onde o dado est&
para ser inserido. O dado Q convertido em
uma string antes da operao de insero
acontecer.
StringBuilder replace(int start, int end,
String s)
void setCharAt(int index, char c)
Substitui o*s+ caracter*s+ especi'icado no
construtor string.
StringBuilder reverse()
(everte o*s+ caracter*s+ especi'icado no
construtor string.
String toString()
(etorna uma string $ue contQm a
se$R8ncia de caracteres no construtor.
%otaG Voc pode usar qualquer mtodo String em um objeto StringBuilder primeiro
convertendo o construtor string em uma string com o mtodo toString() da classe StringBuilder.
Ento convertendo a string de volta em um construtor string usando o construtor
StringBuilder(String str).
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br
134
3m 9Eemplo de StringBuilder.
O programa StringDemo que foi relacionado na seo intiulada "Strings um exemplo de um
programa que poderia ser mais eficiente se uma StringBuilder fosse usado ao invs de uma String.
StringDemo reverte um palndromo. Aqui, novamente, ele est registrado:
public class StringDemo {
public static void main(String[] args) {
String palindrome = Dot saw I was Tod;
int len = palindrome.length();
char[] tempCharArray = new char[len];
char[] charArray = new char[len];
// coloca a string original em um array de chars
for (int i = 0; i < len; i++) {
tempCharArray[i] = palindrome.charAt(i);
}
// reverte o array de chars
for (int j = 0; j < len; j++) {
charArray[j] = tempCharArray[len - 1 - j];
}
String reversePalindrome = new String(charArray);
System.out.println(reversePalindrome);
}
}
Rodando o programa produzida esta sada:
doT saw I was toD
Para executar a reverso da string, o programa converte a string em um array de caracteres
(primeiro loop for), reverte o array em um segundo array (segundo loop for), e ento converte
novamente em uma string.
Se voc converter a string palindrome em um construtor string, voc pode usar o mtodo
reverse() na classe StringBuilder. sto faz o cdigo simples e fcil de ler:
public class StringBuilderDemo {
public static void main(String[] args) {
String palindrome = Dot saw I was Tod;
StringBuilder sb = new StringBuilder(palindrome);
sb.reverse(); // reverte isto
System.out.println(sb);
}
}
Rodando o programa produzida a mesma sada:
doT saw I was toD
Note que println() mostra o construtor string, como em:
System.out.println(sb);
porque sb.toString() chamado implicitamente, assim como com qualquer outro objeto em
uma invocao println().
%otaG H tambm uma classe StringBuffer que exatamente a mesma que a classe
StringBuilder, exceto que ela enfileirada a salvo pela virtude de ter seus mtodos sincronizados. Filas
sero discutidas na lio sobre concorrncia.
Traduo do site http://java.sun.com/docs/books/tutorial/ por Marcos Cesar Kossoski.Contato: marcoskcesar@yahoo.com.br