Professional Documents
Culture Documents
www.primebean.com.br
contato@primebean.com.br
www.primebean.com.br
www.primebean.com.br/joeydecurcio
Tecnologia
www.primebean.com.br
www.primebean.com.br/joeydecurcio
Sumrio
1. Introduo.........................................................................................................................................1
1.1 Oque Java................................................................................................................................1
1.2 Histrico.....................................................................................................................................1
1.3. Padronizao.............................................................................................................................3
1.4. Principais Caractersticas da Linguagem Java..........................................................................3
1.5. Mquina Virtual Java................................................................................................................4
1.6. Extenses..................................................................................................................................6
1.7. Frameworks..............................................................................................................................7
1.8. Ambientes de desenvolvimento................................................................................................7
1.9. Certificaes.............................................................................................................................8
1.10. Comunidade............................................................................................................................9
1.11. Licena....................................................................................................................................9
1.12. O que necessrio para programar em JAVA.........................................................................9
2. Desenvolvendo o Primeiro Programa em Java...............................................................................11
2.1. public class MeuPrimeiroPrograma........................................................................................12
2.2. public static void main............................................................................................................12
2.3. (String[ ] args).........................................................................................................................13
2.4. Inicio e Fim { }.......................................................................................................................13
2.5. System.out.println...................................................................................................................13
2.6. ("Bem vindo ao mundo Java!")...............................................................................................13
3. Regras e convenes de nomenclatura...........................................................................................14
3.1. Nome de Classes.....................................................................................................................15
3.2. Nome de Pacotes.....................................................................................................................15
3.3. Criando Pacotes......................................................................................................................16
3.4. Definindo Pacotes...................................................................................................................17
3.5. Importando Pacotes.................................................................................................................17
3.6. importando um pacote usamos o comando import.................................................................18
3.7. Nome de atributos ou variveis..............................................................................................19
3.8. Nome de atributos finais ou constantes..................................................................................19
3.9. Tipos de dados e declarao de atributos................................................................................20
3.10. Atribuio de Valores a Variveis ou Atributos....................................................................22
3.11. Inicializao de variveis ou atributos..................................................................................22
3.12. Mtodo de Sada Padro.......................................................................................................25
3.13. Controle de Texto..................................................................................................................26
3.14. Apresentando valores de variveis ou atributos....................................................................27
3.15. Concatenao........................................................................................................................28
3.15.1. Cuidados ao concatenar.................................................................................................30
www.primebean.com.br
www.primebean.com.br/joeydecurcio
www.primebean.com.br
www.primebean.com.br/joeydecurcio
1. Introduo
1.1 Oque Java
Java uma linguagem de programao orientada a objeto desenvolvida na dcada
de 90 por uma equipe de programadores chefiada por James Gosling, na empresa Sun
Microsystems. Diferentemente das linguagens convencionais, que so compiladas para
cdigo nativo, a linguagem Java compilada para um "bytecode" que executado por
uma mquina virtual. A linguagem de programao Java a linguagem convencional
da Plataforma Java, mas no sua nica linguagem.
1.2 Histrico
Em 1991, na Sun Microsystems, foi iniciado o Green Project, o bero do Java, uma
linguagem de programao orientada a objetos. Os mentores do projeto eram Patrick
Naughton, Mike Sheridan, e James Gosling. O objetivo do projeto no era a criao de
uma nova linguagem de programao, mas antecipar e planejar a prxima onda do
mundo digital. Eles acreditavam que, em algum tempo, haveria uma convergncia dos
computadores com os equipamentos e eletrodomsticos comumente usados pelas
pessoas no seu dia-a-dia.
Para provar a viabilidade desta idia, 13 pessoas trabalharam arduamente durante
18 meses. No vero de 1992 eles emergiram de um escritrio de Sand Hill Road no Menlo
Park com uma demonstrao funcional da idia inicial. O prottipo se chamava *7 (leia-se
StarSeven), um controle remoto com uma interface grfica touchscreen. Para o *7, foi
criado um mascote, hoje amplamente conhecido no mundo Java, o Duke. O trabalho do
Duke no *7 era ser um guia virtual ajudando e ensinando o usurio a utilizar o
equipamento.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
www.primebean.com.br
www.primebean.com.br/joeydecurcio
1.3. Padronizao
Em 1997 a Sun Microsystems tentou submeter a linguagem a padronizao pelos
orgos ISO/IEC e ECMA, mas acabou desistindo. Java ainda um standard de fato, que
controlada atravs da JCP Java Community Process. Em 13 de Novembro de 2006, a
Sun lanou a maior parte do Java como Software Livre sob os termos da GNU General
Public License (GPL). Em 8 de Maio de 2007 a Sun finalizou o processo, tornando
praticamente todo o cdigo Java como software de cdigo aberto, menos uma pequena
poro que a Sun no possui copyright.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
JVM),
em
muitos
processador para pr-compilar bytecode para cdigo nativo. Outros mecanismos ainda
mais elaborados como o HotSpot da Sun, que guarda informaes disponveis somente
em tempo de execuo (ex.: nmero de usurios, processamento usado, memria
disponvel), para otimizar o funcionamento da JVM, possibilitando que a JVM v
www.primebean.com.br
www.primebean.com.br/joeydecurcio
"aprendendo" e melhorando seu desempenho. Isto uma realidade to presente que hoje
fcil encontrar programas corporativos e de misso crtica usando tecnologia Java. No
Brasil, por exemplo, a maioria dos Bancos utiliza a tecnologia Java para construir seus
home banks, que so acessados por milhares de usurios diariamente.
Grandes stios como o eBay utilizam Java para garantir alto desempenho. E a cada
ano Java tem se tornado mais rpido, na medida que se evolui o compilador dinmico.
Essa implementao no entanto tem algumas intrnsecas. A pr-compilao exige
tempo, o que faz com que programas Java demorem um tempo significativamente maior
para comearem a funcionar. Soma-se a isso o tempo de carregamento da mquina
virtual. Isso no um grande problema para programas que rodam em servidores e que
deveriam ser inicializados apenas uma vez. No entanto isso pode ser bastante indesejvel
para computadores pessoais onde o usurio deseja que o programa rode logo depois de
abri-lo.
A prxima verso da mquina virtual produzida pela Sun promete novos recursos
que iro minimizar este fato. O Java ainda possui uma outra desvantagem considervel
em programas que usam bastante processamento numrico. O padro Java tem uma
especificao rgida de como devem funcionar os tipos numricos. Essa especificao
no condiz com a implementao de pontos flutuantes na maioria dos processadores o
que faz com que o Java seja significativamente mais lento para estas aplicaes quando
comparado a outras linguagens.
Os bytecodes produzidos pelos compiladores Java podem ser usados num
processo de engenharia reversa para a recuperao do programa-fonte original. Esta
uma caracterstica que atinge em menor grau todas as linguagens compiladas. No entanto
j existem hoje tecnologias que "embaralham" e at mesmo criptografam os bytecodes
praticamente impedindo a engenharia reversa.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
1.6. Extenses
Extenses em Java:
J2SE (Standard Edition)
J2EE (Enterprise Edition)
J2ME (Micro-Edition for PDAs and cellular phones)
JCE (Java Cryptography Extension)
JMF (Java Media Framework)
JNDI (Java Naming and Directory Interface)
JSML (Java Speech API Markup Language)
JDBC (Java Database Connectivity)
JMS (Java Message Service)
JAAS (Java Authentication and Authorization Service)
JDO (Java Data Objects)
JAIN (Java API for Integrated Networks)
JDMK (Java Dynamic Management Kit)
Jini (a network architecture for the construction of distributed systems)
Jiro
JXTA (open source-based peer-to-peer infrastructure)
Java Card
JavaSpaces
JMI (Java Metadata Interface)
JMX (Java Management Extensions)
JSP (JavaServer Pages)
JSF (JavaServer Faces)
JNI (Java Native Interface)
J3D (A high level API for 3D graphics programming)
www.primebean.com.br
www.primebean.com.br/joeydecurcio
1.7. Frameworks
possvel utilizar frameworks para facilitar o desenvolvimento de aplicaes.
Dentre os mais utilizados pode-se destacar:
Hibernate ferramenta para ORM;
Spring ferramenta que auxilia principalmente implementao de injeo de
dependncias e inverso de controle;
Log4j ferramenta para facilitar a criao de logs na aplicao;
Junit ferramenta para auxiliar na criao de testes unitrios;
Struts controlador MVC (Model 2) web.
JSF Framework para desenvolvimento WEB MVC Atual Especificao Java
1.9. Certificaes
A linguagem Java est consolidada entre as mais utilizadas em todo mundo, com
ela podemos desenvolver diversos tipos de sistemas, dos mais simples aos mais robustos
funcionando em diferentes plataformas. Uma tima maneira conseguir uma oportunidade
nesse mercado to promissor conhecendo a fundo como a linguagem funciona, e uma
certificao Java com certeza um timo caminho para isso.
Os benefcios que uma certificao pode trazer so muitos, na viso do mercado
um profissional certificado comprova no s proficincia na tecnologia, mas tambm
outras qualidades como disciplina, autodidatismo e dedicao alm de claro
diferenciao em relao a outros candidatos com experincia equivalente.
Embora a valorizao do seu currculo no mercado seja muito importante, o
benefcio maior ser o aprendizado que voc ser capaz de adquirir para ser um bom
profissional. Alguns pontos que podem ser destacados em relao ao aprendizado que
www.primebean.com.br
www.primebean.com.br/joeydecurcio
1.10. Comunidade
A comunidade de desenvolvedores Java rene-se em grupo denominados JUGs
(Java User Groups). No Brasil o movimento de grupos de usurios expandiu-se bastante
e tem formado alguns dos maiores grupos de usurios Java do mundo, como por exemplo
o PortalJava e o GUJ.
1.11. Licena
A Sun disponibiliza a maioria das distribuies Java gratuitamente e obtm receita
com programas mais especializados como o Java Enterprise System. Em 13 de novembro
de 2006, Sun liberou partes de Java como software livre, sob a licena GNU General
Public License (GPL).
www.primebean.com.br
www.primebean.com.br/joeydecurcio
10
Eclipse
JBuilder
JEdit
JDeveloper
Gratuito Descrio
sim
sim
sim
sim
www.primebean.com.br
www.primebean.com.br/joeydecurcio
NetBeans
sim
11
www.primebean.com.br
www.primebean.com.br/joeydecurcio
12
Por exemplo:
//Este um comentrio de uma linha
/*Este um um comentrio
de vrias
linhas*/
www.primebean.com.br
www.primebean.com.br/joeydecurcio
13
2.5. System.out.println
System.out.println a sada padro de Java. este mtodo que indica o que deve
aparecer na tela.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
14
www.primebean.com.br
www.primebean.com.br/joeydecurcio
15
de
nomes
de
classes:
Pessoa,
ImpostoDeRenda,
Conta,
AgenciaDeEmprego, ...
www.primebean.com.br
www.primebean.com.br/joeydecurcio
16
br.com.nomedaempresa.nomedoprojeto.subpacote2.subpacote3
Os pacotes s possuem letras minsculas, no importa quantas palavras estejam
contidas nele. Esse padro existe para evitar ao mximo o conflito de pacotes de
empresas diferentes.
Usamos pacotes para organizar as classes semelhantes. Pacotes, a grosso modo,
so apenas pastas ou diretrios do sistema operacional onde ficam armazenados os
arquivos fonte Java e so essenciais para o conceito de encapsulamento, no qual so
dados nveis de acesso as classes.
PS: Java possui um pacote padro que utilizado quando programamos. As classes do
pacote padro de bibliotecas no seguem essa nomenclatura, que foi dada para
bibliotecas de terceiros.
O nome do pacote deve fazer referncia total s funes exercidas pelas classes
dentro do pacote, pois pacotes servem basicamente para organizar os arquivos de cdigo
fonte de nosso projeto.
Exemplos de nomes de pacotes:
br.com.nomedaempresa.nomedoprojeto.criptografia;
br.com.nomedaempresa.nomedoprojeto.entidade;
br.com.nomedaempresa.nomedoprojeto.dao;
www.primebean.com.br
www.primebean.com.br/joeydecurcio
17
www.primebean.com.br
www.primebean.com.br/joeydecurcio
18
www.primebean.com.br
www.primebean.com.br/joeydecurcio
19
de
nomes
de
PARAR_DE_EXECUTAR,
www.primebean.com.br
www.primebean.com.br/joeydecurcio
atributos
finais
ou
constantes:
TAMANHO,
20
Tem
um
grande
alcance
que
fica
entre
-9,22E+18
(exatos
www.primebean.com.br
www.primebean.com.br/joeydecurcio
21
padro ASCII utiliza apenas um byte que fornece 256 letras diferentes, mas o padro
utilizado em Java (ISO) nos d a possibilidade de at 65.536 caracteres diferentes. Para
nmeros decimais utilizamos dois tipos de dados, dependendo da necessidade de seu
alcance e preciso (nmeros aps a vrgula).
O tipo de dado mais comum para nmero decimal o float. Em um tipo de dado
float, podemos guardar nmeros grandes que vo desde 1,4E-45 at 3,4028235E+38.
Para nmero decimais com grande preciso ou valores extraordinrios (geralmente
utilizados em matemtica aplicada e complexa como clculos fsicos, qumicos,
astrolgicos, meteorolgicos, etc) utilizamos o tipo de dado double. Double o tipo de
dado mais complexo que h em Java e o maior valor possvel de se armazenar
1,797.693.134.862.315.7E+308. Muito mais do que qualquer programador precisa.
Para ilustra melhor essa explicao, abaixo est um pequeno algortmo com alguns
atributos e seus valores mnimos e mximos.
public class TiposDeDados {
public static void main(String[] args) {
System.out.println("Tipos de dados em Java: \n" +
"\nMenor Byte: " + Byte.MIN_VALUE +
"\nMaior Byte: " + Byte.MAX_VALUE +
"\nMenor Short Int: " + Short.MIN_VALUE +
"\nMaior Short Int: " + Short.MAX_VALUE +
"\nMenor Int: " + Integer.MIN_VALUE +
"\nMaior Int: " + Integer.MAX_VALUE +
"\nMenor Long: " + Long.MIN_VALUE +
"\nMaior Long:" + Long.MAX_VALUE +
"\nMenor Float: " + Float.MIN_VALUE +
"\nMaior Float: " + Float.MAX_VALUE +
"\nMenor Double: " + Double.MIN_VALUE +
"\nMaior Double: " + Double.MAX_VALUE);
}
}
www.primebean.com.br
www.primebean.com.br/joeydecurcio
22
www.primebean.com.br
www.primebean.com.br/joeydecurcio
23
www.primebean.com.br
www.primebean.com.br/joeydecurcio
24
Exemplo:
double var1 = 12045741359;
float var1 = 745621;
double var2 = 10.658745965;
float var2 = 0.5f;
Char deve ser inicializado com uma letra entre aspas simples. O importante
entender que em uma varivel do tipo char s pode ser colocada uma letra, no uma
frase. Alm do mais, neste caso h diferena entre maisculas e minsculas.
Exemplo:
char var1 = 'a';
char var2 = 'A';
Se quisermos criar uma frase devemos guarda-la em uma string. Apesar de String
no ser um tipo de dado em Java, mas sim uma classe, este com certeza o elemento
mais utilizado. Uma cadeia de caracteres (string) pode ser inicializada de trs formas: 1)
Como uma string inexistente, ou seja, sem valor algum. Para isso utilizamos a
palavra reservada null; 2) Como uma frase vazia; 3) Como uma string completa. Com
exceo da inexistente, toda string deve estar dentro de aspas duplas ( " " ). Se por
acaso, precisarmos digitar uma aspas dentro de uma string, estas aspas devem vir
precedidas de uma barra invertida (\).
Exemplo:
String var1 = null;
String var2 = "";
String var3 = "Cadeia de caracteres";
www.primebean.com.br
www.primebean.com.br/joeydecurcio
25
www.primebean.com.br
www.primebean.com.br/joeydecurcio
26
www.primebean.com.br
www.primebean.com.br/joeydecurcio
27
www.primebean.com.br
www.primebean.com.br/joeydecurcio
28
3.15. Concatenao
Concatenao o ato de unir duas ou mais cadeias de caracteres (strings). Por
muito tempo, operaes envolvendo strings eram os pesadelos de qualquer programador,
pois havia a necessidade de tratar o elemento pelo seu dado bruto, ou seja, carcter por
carcter. Ento, juntar por exemplo, duas frases era um trabalho rduo.
Com o surgimento da orientao a objeto e o advento do Java, as operaes
envolvendo strings foram muito simplificadas. A melhoria mais significativa nesse assunto,
sem sombra de dvidas, foi utilizar a concatenao de strings.
A concatenao de strings dada pelo operador +, mas no o confunda com o
operador de adio que utiliza o mesmo smbolo. Dessa forma, com apenas este smbolo,
podemos unir duas cadeias de caracteres diferentes em apenas uma.
Veja este exemplo, que apesar de bobo, ilustra exatamente o que acontece na
concatenao:
Joo + zinho = Joozinho; Passa + tempo = Passatempo; beija + - + flor = beija-flor.
Acredite, simples desse jeito.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
29
www.primebean.com.br
www.primebean.com.br/joeydecurcio
30
www.primebean.com.br
www.primebean.com.br/joeydecurcio
31
adio ou concatenao
Subtrao
Multiplicao
Diviso
++
Incremento de 1
--
Decremento de 1
Java segue a conveno de expresses matemticas. Por exemplo:
Se voc fizer 10-2/4, o resultado ser -9,5 e no 2, pois a diviso deve ser
calculada primeiro. Para esta conta dar 2 devemos indicar que a subtrao deve ser feita
antes da diviso. Ela ficaria assim, (10-2)/4.
O que est entre parnteses deve ser calculado primeiro. Em Java, podemos
facilmente simplificar operaes que envolvam a prpria varivel. Por exemplo, vamos
imaginar que o novo valor de var1 seja o valor da prpria varivel var1 mais o valor da
varivel var2.
Podemos construir, ento, a seguinte sentena -> var1 = var1 + var2, ou podemos
simplific-la em -> var1 += var2.
Veja abaixo a tabela de todas as operaes possveis:
Smbolo
www.primebean.com.br
www.primebean.com.br/joeydecurcio
Operao
32
+=
+=
-=
subtrao
*=
multiplicao
/=
diviso
%=
4. Controle de Fluxo
Controle de fluxo a habilidade de ajustar a maneira como um programa realiza
suas tarefas. Por meio de instrues especiais, chamadas comandos, essas tarefas
podem ser executadas seletivamente, repetidamente ou excepcionalmente. No fosse o
controle de fluxo, um programa poderia executar apenas uma nica seqncia de tarefas,
perdendo completamente uma das caractersticas mais interessantes da programao: a
dinmica. Podemos classificar os comandos aceitos pela linguagem Java em
basicamente quatro categorias:
Comando
Palavras-chave
Tomada de decises
If-else, switch-case
Laos ou repeties
Try-catch-finally, throw
Outros
break,continue,label:,return
www.primebean.com.br
www.primebean.com.br/joeydecurcio
33
4.2.1. Usando IF
Para usar o IF basta digitar entre parnteses o que deve ser comparado.
IMPORTANTE: IF uma palavra reservada que no aceita ponto-e-vrgula (;) no final. Se
for verdadeiro, o programa executar a primeira linha logo abaixo do if. Mas, e se
quisermos executar vrias linhas se if for verdadeiro?
Se o if tiver que executar vrias linhas, todas as linhas que devem ser enquadradas
dentro do bloco de dados - as chaves ({}).
www.primebean.com.br
www.primebean.com.br/joeydecurcio
34
www.primebean.com.br
www.primebean.com.br/joeydecurcio
35
www.primebean.com.br
www.primebean.com.br/joeydecurcio
36
seja, que no pode ser repetido no mesmo bloco de dados. Ento, marcamos cada case
com dois pontos ( : ). Aps os dois pontos colocamos todo cdigo que dever ser
executado que pode conter quantas linhas ns quisermos.
Dica importante: um bom costume sempre terminar um cdigo aps o case com um
comando break. Assim, ns evitamos que o resto do cdigo seja executado por acidente.
E vale tambm ressaltar que case no gera resultados booleanos, portanto, no h a
possibilidade de fazer comparaes (Ex. Isso est totalmente errado-> case var1 > var2:).
4.3.1. Default
Como switch pode receber vrias possibilidades, pode ocorrer de algum caso estar
fora do alcance ou no definido. Nesse momento, default faz seu papel. Default pega
qualquer resultado que no esteja definido no case. Ou seja, ele o bloco de cdigo
padro que deve ser executado quando nenhum case for satisfeito.
Podemos coloc-lo onde quisermos dentro de switch , mas, geralmente, o
colocamos no final. Para exemplificar, vamos ver o cdigo abaixo.
public class ExemploSwitch {
public static void main(String args[]) {
int diaDaSemana = 1;
switch (diaDaSemana) {
case 1:
System.out.println("Domingo");
break;
case 2:
System.out.println("Segunda-feira");
break;
case 3:
System.out.println("Tera-feira");
break;
case 4:
System.out.println("Quarta-feira");
www.primebean.com.br
www.primebean.com.br/joeydecurcio
37
break;
case 5:
System.out.println("Quinta-feira");
break;
case 6:
System.out.println("Sexta-feira");
break;
case 7:
System.out.println("Sbado");
break;
default:
System.out.println("Este no um dia vlido!");
}
}
}
Como podemos perceber, existe uma varivel inteira chamada diaDaSemana. Essa
varivel passada ao switch e dentro desse switch h 7 cases que correspondem aos
dias da semana. Como o valor inicial 1, ento, o bloco logo abaixo de case 1
executado, ou seja, ele imprimir Domingo no monitor. Para evitar que o cdigo dos
outros cases sejam executados, logo aps o mtodo println h um comando BREAK;
Se quiser, copie este cdigo e modifique o valor inicial de diaDaSemana para
verificar os possveis resultados e como este algoritmo funciona.
4.4. Break e Continue
Break e Continue so dois comandos de controle de estruturas largamente
utilizados em loops (repeties) como for e while.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
38
4.4.1. Break
O comando break serve para determinar uma quebra de estrutura, ou seja, ele faz
com que, por exemplo, um loop (repetio) pare. No comando switch, por exemplo, ele
determina que no pode ser executado o case seguinte, e assim por diante.
No exemplo abaixo, temos uma repetio que se inicia em 1 e deve terminar em
mil (1.000), mas dentro desta estrutura h uma condio: se a varivel for igual a 10 saia
da estrutura de repetio. Vejamos:
public class ExemploBreak {
public static void main (String args []){
for (int contador=1; contador<=1000; contador++){
System.out.println("Esta a repetio nr: "+contador);
if (contador==10)
break;
}
}
}
Como podemos observar, mesmo a estrutura de repetio for determinando que a
repetio deve ir at 1000, ao executarmos esse cdigo, apenas conseguimos chegar at
a repetio nmero 10. Isso ocorre porque quando if for verdadeiro ele executa o break.
Dessa forma, conseguimos sair do loop sem ele ter terminado.
4.4.2. Continue
Continue tambm muito utilizado em estruturas e repetio e sua funo
ignorar o cdigo, e no sair como acontece com o break.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
39
www.primebean.com.br
www.primebean.com.br/joeydecurcio
40
4.3.1. While
While uma estrutura de repetio. O mesmo executa uma comparao com a
varivel. Se a comparao for verdadeira, ele executa o bloco de instrues ( { } ) ou
apenas a prxima linha de cdigo logo abaixo.
Procedemos da seguinte maneira:
While(comparao)
O problema com estruturas de repetio, principalmente com while, o que
chamamos de looping infinito.
Damos esse nome ao fato de que o programa fica repetindo a mesma sequncia
de cdigos esperando por um resultado que nunca ir acontecer. Portanto,
imprescindvel que uma determinada varivel seja modificada de acordo com cda loop.
Veja o exemplo
public class ExemploWhile {
public static void main(String args[]) {
int contador = 0;
while (contador < 50) {
System.out.println("Repetio nr: " + contador);
contador++;
}
}
}
Como podemos ver, existe a varivel contador que iniciada valendo 0, a cada
www.primebean.com.br
www.primebean.com.br/joeydecurcio
41
4.3.2. Do While
Do While uma estrutura de repetio, tal como o prprio while. A principal
diferena entre os dois que Do While ir fazer a comparao apenas no final do bloco
de cdigo, sendo representado da seguinte forma:
DO { cdigo } WHILE (comparao);
Neste caso, devemos ter as mesmas precaues quanto while, no que diz respeito
a looping infinito. Mas no necessrio inicializar a varivel antes do bloco de cdigo
como acontece com while, pois a comparao s ser feita aps todo o cdigo ter sido
executado.
4.3.3. For
For uma estrutura de repetio que exerce a mesma funo que WHILE e DO
WHILE. A principal diferena entre eles a sintaxe e tambm a forma de trabalhar.
O For necessita de trs parmetros: a inicializao da varivel, a condio que ir
manter o looping (repetio) e o modificador da varivel inicializada que pode ser
incrementada ou decrementada, ou seja, pode aumentar seu valor ou diminuir. Um ponto
www.primebean.com.br
www.primebean.com.br/joeydecurcio
42
www.primebean.com.br
www.primebean.com.br/joeydecurcio
43
testes
condicionais
dentro
das
classes
que
criamos.
Isso dar uma idia do que so classes e objetos, e importante que se habitue a estas
idias.
Classes podem ser vistas como abstraes ou definies maiores das coisas , j
um objeto j algo mais real, mais concreto, um elemento ou tipo daquela classe.
Usando essas definies, realmente difcil entender os conceitos, por isso vamos usar
exemplos.
Por exemplo, podemos ver "Pessoa" como uma classe. uma classe que
representa seres humanos, que possuem cabea, corao, crebro etc. uma
generalizao maior.
Podemos declarar voc, caro leitor, como um objeto dessa classe, com seu nome e
caractersticas especficas de uma "Pessoa". Voc pertence a classe "Pessoa". Eu
tambm,
pois
possumos
cabea,
corao,
crebro
etc.
Ns temos essas caractersticas gerais, que todos da classe "Pessoa" possuem. Ou seja,
www.primebean.com.br
www.primebean.com.br/joeydecurcio
44
Esse tipo de representao vai nos ajudar muito em programao Java. Por
exemplo, imagine que voc foi contratado para criar um aplicativo Java para uma
empresa.
Voc
precisar
cadastrar
os
milhares
de
funcionrios
da
empresa.
claro que voc no vai declarar milhares de strings para armazenar o nome de cada
um, nem de inteiros para armazenar seus nmeros nem de floats para armazenar seus
salrios. Seria humanamente impossvel fazer isso.
outras
coisas
especficas
da
empresa.
Pronto.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
45
um
objeto,
automaticamente
esses
dados
estaro
criados!
A que reside a beleza do Java e da orientao a objetos. muito, mas muito til e
prtico. um novo jeito de pensar e ver o mundo.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
46
47
www.primebean.com.br
www.primebean.com.br/joeydecurcio
48
www.primebean.com.br
www.primebean.com.br/joeydecurcio
49
uma outra TV que tambm de 29" e est ligada no canal 15. Perceba que ambas as TVs
tm as mesmas caractersticas, mas continuam sendo duas TVs diferentes.
Sempre que criamos uma classe, Java automaticamente vincula um mtodo
construtor padro interno com o mesmo nome da classe, mas sem inicializar nenhum
atributo. Para demonstrar um mtodo construtor, criaremos um construtor padro sem
argumentos no qual j contm os valores dos atributos definidos por ns mesmos.
Ento, vamos imaginar que sempre que uma TV construda, o seu padro
tamanho 21", desligada e no canal 0. Ento, podemos defini-lo como:
public class TV {
int tamanho;
int canal;
boolean ligada;
TV(){
tamanho=21;
canal=0;
ligada=false;
}
}
6. Estrutura de Dados
Hoje em dia, a grande maioria das pessoas utilizam a agenda do celular para
armazenar seus contatos. As tarefas de uma agenda de contatos so basicamente duas:
1.Definir como as informaes dos contatos sero armazenadas. Uma informao
armazenada em algum lugar (pedao de papel, livro, computador, etc) um dado.
2.Disponibilizar operaes para criar, recuperar, ordenar, atualizar e remover
contatos. Alm de operaes para informar o estado da agenda (a quantidade de
contatos existentes na agenda ou a quantidade de espao disponvel para novos
www.primebean.com.br
www.primebean.com.br/joeydecurcio
50
contatos).
A primeira tarefa crucial para o desempenho. Se a agenda armazena as
informaes de uma forma desorganizada ento ser muito mais complicado manipular
os dados de forma eficiente. A escolha de como guardar as informaes deve levar em
considerao as operaes que sero disponibilizadas pela agenda. Por exemplo, seria
interessante manter os contatos em ordem alfabtica para facilitar a busca.
Mas, apesar da importncia de como os contatos so armazenados, a organizao
interna da agenda no precisa e no deve ser exposta ao usurio. Afinal de contas, o que
o usurio deseja usar a agenda atravs das operaes e que tudo seja feito o mais
rpido possvel.
A nica coisa que precisa ser mostrada para o usurio so as operaes que ele
pode fazer na agenda (inserir, recuperar, atualizar, remover contato, saber quantos
contatos esto na agenda, etc). Este conjunto de operaes interface que o usurio
tem com a agenda.
Cada celular pode implementar a sua agenda de contatos de uma forma totalmente
diferente um do outro, na tentativa de obter mais performance, ser mais confivel ou
gastar menos memria. Porm o conjunto bsico de operaes oferecidas pelas agendas
sempre o mesmo. Isso facilita a vida do usurio pois se ele tiver que trocar de celular
no vai ter que aprender novamente como usar uma agenda de contatos.
Essa a grande vantagem em se pensar em interface. Mantida a interface,
podemos trocar uma agenda que no to eficiente ou que j no atende mais as nossas
necessidades por outra mais eficiente ou adequada, sem problemas em ter de aprender a
usar a nova agenda: troca-se a implementao, mas no mudamos a interface.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
51
Uma agenda de celular pode ser vista como uma estrutura de dados. Uma
estrutura de dados mantm os dados organizados seguindo alguma lgica e disponibiliza
operaes para o usurio manipular os dados.
importante, quando programar, no misturar dado e estrutura de dados em uma
coisa s. Um dado uma informao armazenada e estrutura de dados quem
administra os dados. O ideal que a estrutura de dados seja o mais independente
possvel dos dados que ela vai armazenar. Desta forma pode-se aproveitar a mesma
estrutura de dados para diversos tipos de dados. Por exemplo, melhor ter uma agenda
genrica do que uma agenda de telefones. Uma agenda genrica pode ser utilizada para
guardar telefones, ou emails, ou at mesmo guardar uma outra estrutura dentro dela:
contatos, que seriam compostos por nome, telefone e email.
Algumas estruturas de dados so apenas agrupamentos de dados sem um objetivo
de aplicar algum algoritmo ou tirar proveito de sua estrutura. Um exemplo seria a estrutura
Contato. Algumas outras estruturas so mais espertas e trabalhosas, como a Agenda,
assim como Listas Ligadas, Vetores, Tabelas de Espalhamento e outras que veremos no
decorrer da apostila.
Estas estruturas, por sua caracterstica mais complexa e de poder ser reutilizada
em outros contextos, devem ser criadas da forma mais independente possvel dos dados
que estaro dentro dela. Em outras palavras, no devemos misturar a Agenda e o
Contato de maneira rgida, para que com isso possamos criar outras Agendas, como por
exemplo uma Agenda de Fornecedor.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
52
www.primebean.com.br
www.primebean.com.br/joeydecurcio
53
6.2. Vetor
Vetores, tambm muito conhecidos como arrays, so variveis que servem para
guardar vrios valores do mesmo tipo de forma uniforme na memria. Por exemplo, se
tivemos que criar 20 variveis do mesmo tipo que querem dizer a mesma coisa, ns no
criaramos -> int var1, var2, var3, var4, var5, ... ao invs disso, criaramos apenas uma
varivel de vetor para guardar todos os 20 nmeros de uma vez.
Como um vetor pode guardar vrios valores temos que definir quantos valores ele
deve guardar para que seja reservado o espao necessrio em memria. Primeiramente,
vamos aprender como declarar um vetor. Para declarar um vetor devemos especificar o
tipo ou classe de dado que ser armazenado nele. Aps isso, damos um nome a esse
vetor. E, para finalizar, indicamos que ele um vetor, simplesmente abrindo e fechando
colchetes ( [ ] ).
Portanto, se quisssemos um vetor de nmeros inteiros chamado meu vetor,
declararamos da seguinte forma:
int meuVetor [ ];
Agora que j declaramos o vetor, devemos dar um tamanho a ele, para que seja
reservado espao suficiente em memria. Para fazermos isso, utilizaremos um
instanciador chamado new.
New muito importante, pois ele ir criar de fato o vetor. Para indicarmos o
tamanho usamos o instanciador new, depois o tipo de dado do vetor e entre colchetes o
tamanho do vetor.
Tomando o exemplo acima, vamos indicar que meuVetor ter o tamanho 4. Ento,
a linha de cima ficaria:
int meuVetor[ ] = new int [4];
www.primebean.com.br
www.primebean.com.br/joeydecurcio
54
Uma nica varivel com 4 espaos nos quais podem ser guardados nmeros
inteiros. Acessando uma posio no Vetor Agora, para acessarmos um local especfico
dessa memria devemos indicar entre colchetes a posio desejada no vetor que
chamamos de index.
O importante mesmo saber que no importa o tamanho do vetor, o index (nmero
que indica a posio) sempre comea em 0. Ou seja, um vetor de tamanho 20 vai da
posio 0 a 19, um vetor de tamanho 180 vai da posio 0 a 179. Portanto, um vetor de
tamanho 4 vai da posio 0 a 3.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
55
No podemos nunca nos esquecer que o limite do vetor sempre seu tamanho
menos 1. Usando o exemplo: vetor de tamanho 4, posio mxima 3 (pois 4-1=3).
Ento, se atribuirmos um valor a posio 4 ocorrer um erro. Resumidamente, jamais
poderamos fazer meuVetor [4]=200.
6.3. Matrizes
Matrizes so vetores multidimensionais, ou seja, eles no so totalmente lineares,
e sim, geomtricos. Enquanto um vetor tem apenas uma linha com vrios valores, uma
matriz pode, por exemplo, tem vrias linhas com vrios valores, que comumente
chamamos de linhas e colunas.
Para criarmos um vetor multidimensional (ou matriz), procedemos da mesma forma
www.primebean.com.br
www.primebean.com.br/joeydecurcio
56
que um vetor normal, porm com mais um dimensionador (os colchetes). Ento, se
quisermos criar um vetor (matriz) bidimensional com 3 linha e 5 colunas, faramos:
int minhaMatriz [ ][ ] = new int [3][5];
Na memria representado como:
Isso tambm pode ser feito para adquirirmos o formato de matriz que quisermos.
Ou seja, se fosse uma matriz tridimensional, bastaria ter trs dimensionadores, se fosse
4D, ento, 4 dimensionadores, se fosse 5D (apesar de geometricamente difcil de
imaginar) seriam 5 dimensionadores. E assim por diante.
6.4. ArrayList
At o momento, nessa seo de Estrutura de Dados de nosso curso de Java,
vimos o quo til so os arrays e as operaes que podemos fazer com esses arrays,
tambm conhecidos por vetores.
Porm, h um grande problema neles: so estticos. Ou seja, tem tamanho
definido, no podemos adicionar nem excluir nada neles, o que bastante incmodo e faz
com que arrays em Java sejam limitados.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
57
O Java, por padro, possui uma srie de recursos prontos (APIs) para que
possamos tratar de estrutura de dados, tambm chamados de colees (collections).
Podemos dizer que ArrayList uma classe para colees. Uma classe genrica (generic
classes), para ser mais exato. Colees mesmo, de qualquer tipo de 'coisa' ou dado, no
somente de tipos primitivos.
Voc pode criar seus objetos - atravs de uma classe - e agrup-los atravs de
ArrayList e realizar, nessa coleo, vrias operaes, como: adicionar e retirar elementos,
orden-los, procurar por um elemento especfico, apagar um elemento especfico, limpar
o ArrayList dentre outras possibilidades.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
58
Importe:
import
java.util.ArrayList;
Por ser um tipo diferente, sua sintaxe um pouco diferente do que voc j viu at
ento:
ArrayList< Qualquer_Tipo > nomeDoArrayList = new ArrayList< Qualquer_Tipo >();
No exemplo a seguir, vamos usar um ArrayList de String para trabalhar com o
nome de vrias Bandas de msica:
ArrayList<String> bandas = new ArrayList<String> ();
Aps declarar a ArrayList 'bandas' que armazenar Strings, vamos adicionar alguns
nomes. Primeiro adicionamos a banda "Rush":
bandas.add("Rush");
Existe um mtodo do ArrayList chamado 'toArray()' que coloca todos os elementos
de um ArrayList em um Array.
Ou seja: bandas.toArray() um Array!
Porm, j vimos que existe um mtodo 'toString' da classe Arrays que retorna uma
String com os elementos de um Array. Vamos usar esse mtodo parar exibir todos os
elementos do ArrayList, que transformamos em Array atravs do mtodo 'toArray()':
www.primebean.com.br
www.primebean.com.br/joeydecurcio
59
Arrays.toString( bandas.toArray() );
Vamos adicionar a segunda banda, "Beatles" e imprimir, usando o mesmo mtodo.
Note que quando usamos 'add', sempre adicionamos o elemento pro fim da ArrayList.
Confirme isso agora, vendo que a banda "Iron Maiden" ficar depois de "Beatles".
Vamos pegar o primeiro elemento, o elemento '0', atravs do mtodo 'get':
bandas.get(0);
Note que a banda "Rush", pois ela foi a primeira a ser adicionada.
Vamos adicionar o "Tiririca" na posio do "Rush", ou seja, na posio '0':
bandas.add(0,"Tiririca");
ou
bandas.add( bandas.indexOf("Rush"), "Tiririca");
Pois o mtodo 'indexOf' retorna o ndice em que ocorre "Rush".
Para saber o tamanho que tem seu ArrayList, basta usar o mtodo 'size()':
bandas.size();
Feito isso, rapidamente remova o "Tiririca", pois algum pode ver.
Para tal, use o mtodo 'remove':
bandas.remove("Tiririca");
Ok. No quer mais brincar de ArrayList? Remova tudo
bandas.clear();
www.primebean.com.br
www.primebean.com.br/joeydecurcio
import java.util.ArrayList;
import java.util.Arrays;
public class arrayLists{
public static void main(String[] args){
ArrayList<String> bandas = new ArrayList<String> ();
bandas.add("Rush");
System.out.print( "Adicionando a banda Rush: " );
System.out.println( Arrays.toString( bandas.toArray() ) );
bandas.add("Beatles");
System.out.print( "Adicionando a banda Beatles: " );
System.out.println( Arrays.toString( bandas.toArray() ) );
bandas.add("Iron Maiden");
System.out.print( "Adicionando a banda Iron Maiden: " );
System.out.println( Arrays.toString( bandas.toArray() ) );
System.out.print( "Quem est na ndice 0: " );
System.out.println( bandas.get(0) );
System.out.print( "Adicionando Tiririca onde estava o Rush: " );
bandas.add( bandas.indexOf("Rush"), "Tiririca");
System.out.println( Arrays.toString( bandas.toArray() ) );
System.out.print( "Nmero de elementos na lista: " );
System.out.println( bandas.size() );
System.out.print( "Removendo o Tiririca: " );
bandas.remove("Tiririca");
System.out.println( Arrays.toString( bandas.toArray() ) );
System.out.print( "Removendo tudo: " );
bandas.clear();
System.out.println( Arrays.toString( bandas.toArray() ) );
}
}
Sada
www.primebean.com.br
www.primebean.com.br/joeydecurcio
60
61
7. Constantes
Constantes so o oposto das variveis. A diferena est em no podermos atribuir
um novo valor, pois ele recebe um valor final imutvel. Isso ajuda na hora que temos que
lembrar de algum nmero muito grande ou muito pequeno, ou at mesmo um valor que
aparentemente no nos diz nada, mas que significa alguma coisa.
Um exemplo bem simples seria 000000. Mas, o que 000000? difcil saber o que
ele significa, mas muito mais fcil entender que preto em Java Color.BLACK. Ou seja,
BLACK uma constante que guarda sempre o mesmo valor (000000).
Para criarmos uma constante em Java muito simples. Primero nos atemos ao fato
de que uma constante criada dentro de uma classe deve ser acessada por qualquer
membro da classe, ento, por definio, essa constante tambm global ou esttica
(static). Como uma constante no muda seu valor, ento, marcamos ela com a palavra
chave final, que far com que o valor nunca seja modificado.
Toda constante um dado, portanto, o seu tipo de dado tambm obrigatrio
declarar. Ento, para declarar uma constante faramos:
static final long CONST1 = 1L; ou final long CONST2 = 1L;
www.primebean.com.br
www.primebean.com.br/joeydecurcio
62
No qual, CONST1 seria uma constante global (ou seja, foi declarada no corpo da classe)
e CONST2 seria uma constante local (ou seja, foi declarada no corpo de alguma funo
ou mtodo, por exemplo, dentro de main)
Para ilustrar bem o uso de constantes, vamos calcular a rea e o comprimento de
um crculo. O porque deste clculo que necessitaremos de um nmero constante
chamado PI. PI um nmero irracional, ou seja, no h uma representao exata dele,
mas, para o nosso exemplo, usaremos ele com uma preciso de 8 casas decimais.
Portanto, nosso pi ser do tipo double que valer 3,14159265. Ento, perceba que
muito mais fcil se lembrar da palavra pi do que do nmero 3,14159265. Alm de,
obviamente, digitarmos bem menos.
Ento, s para esclarecer o que ir acontecer: O clculo da rea do crculo
equivale a raio2 pi, e o comprimento medido em 2 raio pi, no qual o raio a
distncia entre a borda do crculo e seu centro.
Vamos usar um raio de 25cm. Vejamos o resultado.
public class Constantes {
static final float PI = 3.14159265f;
public static void main(String args[]) {
float raio = 25f;
float comprimento = raio * 2 * PI;
float area = (raio * raio) * PI;
System.out.println("Dados de um crculo de " + raio + "cm:\n"
+ "comprimento: " + comprimento + "cm\n"
+ "rea: " + area + "cm2");
}
}
Exite uma infinidade de constantes que so implementadas em vrias classes
diferentes como por exemplo BLACK da classe Color, PLAIN_MESSAGE da classe
JOptionPane e at mesmo o PI da classe Math com muito mais preciso do que este que
www.primebean.com.br
www.primebean.com.br/joeydecurcio
63
usamos no exemplo.
8. Funes
Funes so rotinas ou sub-rotinas automatizadas. Sempre que pretendemos usar
a mesma codificao para algo especfico, criamos uma funo. Dessa forma, sempre
que quisermos utilizar aquela codificao, ao invs de ns a digitarmos inteira novamente,
simplesmente chamamos a funo. Funes so extremamente teis e adaptveis, e o
conceito de funes importante para mais a frente entendermos o funcionamento e
criao dos mtodos.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
64
www.primebean.com.br
www.primebean.com.br/joeydecurcio
65
Para demonstrar este tipo de funo criaremos uma funo que mostra na tela o
resultado fatorial de um nmero. Alm disso, colocaremos esta funo dentro de um loop
que ir de 1 a 10 para ele mostrar cada um desses fatoriais.
public class FatorialComFuncao {
public static void fatorar(int numero) {
int fator = 1;
for (int i = numero; i > 1; i--) {
fator *= i;
}
System.out.println(numero + "! = " + fator);
}
public static void main(String args[]) {
for (int x=1; x<=10; x++)
fatorar (x);
}
}
Simplificando, x que est sendo passado pelo main para fatorar() ser o valor int
numero da funo fatorar.
8.3. Funes que retornam valores
Aqui veremos a grande vantagem de se criar uma funo. Funes podem retornar
valores de um processo executado dentro delas e esse valor pode ser guardado dentro de
www.primebean.com.br
www.primebean.com.br/joeydecurcio
66
uma varivel no programa. Isso com certeza deixa nosso cdigo mais simples, pois
podemos destacar processos repetitivos e guardar em uma varivel apenas o resultado
daquele processo.
Para criar uma funo que retorna valores temos que nos ater ao fato retorno.
Como todas as outras funes no retornavam valores, ento, seu retorno era vazio void. Agora, temos que declarar que tipo de retorno vir da funo.
O retorno dado pelo comando return, que finaliza a funo e mostra o retorno. A
varivel ou valor que utilizarmos para return ser o tipo de retorno da funo.
Vamos imaginar que trs funes, sendo que a primeira ir retornar um inteiro, a
segunda um double e a terceira uma string. Ento, as criaramos da seguinte maneira:
www.primebean.com.br
www.primebean.com.br/joeydecurcio
67
}
public static void main(String[] args) {
long x = 5;
if (ehPrimo(x)) // se for primo
System.out.println(x + " primo");
else // se no for primo
System.out.println(x + " no primo");
}
}
O algoritmo utilizado acima muito solicitado em cursos de programao e
faculdades. O que a funo faz verificar se um nmero primo ou no.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
68
}
public String getNome(){
return nome;
}
public String getCpf() {
return cpf;
}
}
Como posso eu falar que duas pessoas so as mesmas pessoas ? a JVM (Java
Virutal Machine) por se s no tem como identificar como duas pessoas podem ser ditas
iguais, desta forma o teste abaixo, verifica apenas se estas so instancias de um mesmo
objeto.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
69
9.1. Equals:
Para resolver esse problema em java existe um mecanismo de igualdade que vem
em todo objeto, e descende da classe Object, onde voc pode testar a igualdade entre
objetos atravs de: este teste, quando no sobrescrito apenas testa se os 2 objetos so
referencia de uma mesma instancia.
Antes de implementar um equals em nossos objetos preciso saber de cinco
regras.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
70
Com essa ideia podemos pensar em como implementar o equals para nossa classe
Pessoa, sabemos que, duas Pessoas de mesmo nome podem ser diferente, portanto
esse no pode ser nosso parmetro para teste. Duas pessoas no podem ter o mesmo
nmero de CPF, ento este nmero nico, e pode identificar uma pessoa, sendo assim
nosso teste de igualdade entre duas pessoa pode ser.
Com essa ideia podemos pensar em como implementar o equals para nossa classe
Pessoa, sabemos que, duas Pessoas de mesmo nome podem ser diferente, portanto
esse no pode ser nosso parmetro para teste. Duas pessoas no podem ter o mesmo
nmero de CPF, ento este nmero nico, e pode identificar uma pessoa, sendo assim
nosso teste de igualdade entre duas pessoa pode ser:
@Override
public boolean equals(Object obj){
if(obj == null){
return false;//nenhum objeto pode ser igual a null
}
if(!obj instanceof Pessoa) {//uma pessoa s pode ser igual a outra pessoa
return false;
}
final Pessoa other = (Pessoa) obj;
if (getCpf() ==null)//se no houver CPF no h como testar as duas pessoas.
return false;
return getCpf().equals(other.getCpf()); //duas pessoas sero iguais...
//se seus CPFs forem iguais...
}
www.primebean.com.br
www.primebean.com.br/joeydecurcio
71
9.2. HashCode:
Assim como h um teste de igualdade, Java ainda dispem de outro teste, onde
possvel rapidamente, atravs de integer, restringir o campo de igualdade, atravs de
hashCode(). assim como equals, o hashCode segue um contrato descrito abaixo:
www.primebean.com.br
www.primebean.com.br/joeydecurcio
72
@Override
public int hashCode(){
return 0;
}
Este mtodo acima, funciona e respeita as regras de contrato de hashCode, porem
seu programa poder perder em velocidade. extremamente desaconselhvel o uso de
hashCode constante para qualquer objeto, pois vrias funcionalidade que otimizam
processos de busca no tero serventia com um hashCode mau projetado.
A melhor estratgia para hashCode olhar para equals, e verificar como a
igualdade exigida, e assim montar um hashCode, concatenando os hashCode dos
objetos que fazem a igualdade e designando um peso para as propriedades.
Por exemplo, para nossa classe Pessoa uma boa estrategia de hashCode seria:
@Override
public int hashCode() {
int hash = 7;
hash = 23 * hash + (getCpf() != null ? getCpf().hashCode() : 0);
return hash;
}
O nmero 7 contido nesse hashCode apenas um nmero randmico para startar
o hashCode, e diferenciar de outros objetos, por exemplo, um objeto empresa poderia
iniciar por 3. o nmero 23 outro nmero randmico, usado para quando h varias
propriedades e escalar o hashCode entre as varias propriedade que definem um objeto
igual.
Como no exemplo acima usamos o hashCode da string cpf, e como String tem seu
hashCode bem implementando, podemos assim garantir que sempre que os CPF forem
iguais os hashCode sero iguais.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
73
como
uma
forma
de
otimizar
os
processos
de
busca
(hashCode).
www.primebean.com.br
www.primebean.com.br/joeydecurcio
74
Exemplo:
public class Pessoa {
private final String nome;
private int idade;
public Pessoa(String oNome, int aIdade){
nome = oNome;
idade = aIdade;
}
public static void main(String[] args) {
Pessoa pessoa = new Pessoa("fulano", 21);
System.out.println(pessoa); //equivale a System.out.println(pessoa.toString());
}
}
vai imprimir algo como "Pessoa@1b533b0" (provavelemnte com outro nmero).
Esse formato normalmente no o que queremos! Por isso temos que sobrescrever o
mtodo
toString()
para
obter
representao
desejado.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
75
www.primebean.com.br
www.primebean.com.br/joeydecurcio
76
www.primebean.com.br
www.primebean.com.br/joeydecurcio
77
public class TV {
int tamanho;
int canal;
boolean ligada;
TV() {
tamanho = 21;
canal = 0;
ligada = false;
}
public static void main(String[] args) {
TV objeto1 = new TV();
TV objeto2;
objeto2 = new TV();
}
}
No cdigo acima, criamos uma classe chamada TV com os mesmos atributos do
exemplo da pgina Criao de Classes, e criamos um mtodo construtor que inicializa os
atributos da classe TV com alguns valores. Declaramos duas variveis chamadas objeto1
e objeto2 sendo do tipo TV. Depois, instanciamos o objeto usando new e o mtodo
construtor.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
78
www.primebean.com.br
www.primebean.com.br/joeydecurcio
79
www.primebean.com.br
www.primebean.com.br/joeydecurcio
80
volume = 25;
this.ligada = ligada;
}
Porm, o mesmo no pode ser aplicado aos atributos canal e volume. Porque no
possvel criar um mtodo que recebe um inteiro e criar um outro mtodo com o mesmo
nome que tambm recebe um inteiro, mesmo que estes dois inteiros sejam totalmente
diferentes. Se visualizarmos como Java interpreta o mtodo, veramos:
void ligar (int volume) = void ligar (int canal)
void ligar (int) = void ligar (int)
Por outro lado, perfeitamente possvel criarmos dois mtodos que recebam um
booleano e um inteiro, inclusive se forem os mesmos, mas em posies diferentes. Isso
acontece porque Java no verifica o nome do parmetro, mas apenas o tipo dele.
void ligar (boolean ligada, int canal) void ligar (int canal, boolean ligada)
void ligar (boolean, int) void ligar (int, boolean)
Portanto, podemos fazer muitas combinaes desde que essas combinaes no
sejam em nmeros iguais, de tipos iguais e nas mesmas posies.
Abaixo, est a classe com algumas combinaes possveis. um bom costume
sempre referenciar para o mtodo que recebe mais argumentos.
public class TV {
int canal;
int volume;
boolean ligada;
int tamanho;
void ligar() {
this.ligar(3, 25, true);
}
www.primebean.com.br
www.primebean.com.br/joeydecurcio
81
www.primebean.com.br
www.primebean.com.br/joeydecurcio
82
public TV(){
this.tamanho = 21;
this.ligada = true;
}
public static void main (String args []){
TV minhaTV = new TV();
minhaTV.canal = 3;
minhaTV.volume = 25;
}
}
Como percebemos construdo um objeto chamado minhaTV da classe TV com o
tamanho de 21" e j ligada. Durante a execuo do programa modificamos diretamente
seu canal e volume usando o objeto que instanciamos.
Da mesma forma que acessamos um atributo, tambm podemos acessar um
mtodo. No exemplo abaixo, criaremos o mtodo para aumentar volume da TV.
public class TV {
int canal;
int volume;
boolean ligada;
int tamanho;
public TV(){
this.tamanho = 21;
this.ligada = true;
this.canal = 3;
this.volume = 25;
}
public void aumentarVolume(){
this.volume += 5;
}
public static void main (String args []){
www.primebean.com.br
www.primebean.com.br/joeydecurcio
83
www.primebean.com.br
www.primebean.com.br/joeydecurcio
84
else
System.out.println ("no est ligada");
}
}
public static void main (String args []){
TV televisao1 = new TV();
TV televisao2 = new TV();
// chamando o mtodo ligar
televisao1.ligar(true);
televisao2.ligar(false);
System.out.print ("A televiso 1 ");
// chamando a funo estahLigada
estahLigada (televisao1);
System.out.print ("A televiso 2 ");
estahLigada (televisao2);
}
Observemos que chamamos o mtodo ligar() de cada objeto, portanto, existem
dois mtodos ligar distintos - o mtodo ligar() da televisao1 e o mtodo ligar() da
televisao2. A funo esttica, portanto, existe apenas uma funo estahLigada().
85
constantes. Isso porque membros pblicos tendem a nos ligar a uma implementao em
particular e limita a nossa flexibilidade em mudar o cdigo.
Basicamente, usamos quatro tipos de encapsulamento que so divididos em dois nveis:
Nvel de classe ou topo: Quando determinamos o acesso de uma classe inteira que
pode ser public ou package-private (padro);
Nvel de membro: Quando determinamos o acesso de atributos ou mtodos de uma
classe que podem ser public, private, protected ou package-private (padro).
Para utilizarmos estes modificadores de acesso, basta que ns os digitemos antes
do nome da varivel, atributo, mtodo, funo ou classe, com exceo de
package-private, que entendido como padro, portanto, qualquer membro ou classe
que no tenha modificador especificado.
Exemplo:
public class MinhaClasse { //classe public
private int inteiro; //atributo inteiro private
protected float decimal; //atributo float protected
boolean ativado; //atributo booleano package-private
}
15.1. Public
O modificador public deixar visvel a classe ou membro para todas as outras
classes, subclasses e pacotes do projeto Java.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
86
15.2. Private
O modificador private deixar visvel o atributo apenas para a classe em que este
atributo se encontra.
15.3. Protected
O modificador protected deixar visvel o atributo para todas as outras classes e
subclasses que pertencem ao mesmo pacote. A principal diferena que apenas as
classes do mesmo pacote tem acesso ao membro. O pacote da subclasse no tem
acesso ao membro.
Classe
Pacote
Subclasse
Globalmente
Public
sim
sim
sim
sim
Protected
sim
sim
sim
no
sim
sim
no
no
Private
sim
no
no
no
www.primebean.com.br
www.primebean.com.br/joeydecurcio
87
15.5.1. Set
Nomeamos um mtodo acessor com set toda vez que este mtodo for modificar
algum campo ou atributo de uma classe, ou seja, se no criarmos um mtodo acessor set
para algum atributo, isso quer dizer que este atributo no deve ser modificado.
Portanto, como o valor de um atributo da classe ser modificado, no necessrio
que este mtodo retorne nenhum valor, por isso, os mtodos setters so void. Porm,
obrigatoriamente, eles tem que receber um argumento que ser o novo valor do campo.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
88
15.5.2. Get
Nomeamos um mtodo acessor com get toda vez que este mtodo for verificar
algum campo ou atributo de uma classe. Como este mtodo ir verificar um valor, ele
sempre ter um retorno como String, int, float, etc. Mas no ter nenhum argumento.
15.5.3. Is
Nomeamos um mtodo acessor com is toda vez que este mtodo for verificar
algum campo ou atributo de uma classe que tenha retorno do tipo boolean. Levando em
considerao as informaes acima, nossa classe de exemplo TV ficaria:
public class TV {
private int tamanho;
private int canal;
private int volume;
private boolean ligada;
public TV(int tamanho, int canal, int volume, boolean ligada) {
this.tamanho = tamanho;
this.canal = canal;
this.volume = volume;
this.ligada = ligada;
}
public int getTamanho() {
return tamanho;
}
public void setTamanho(int tamanho) {
this.tamanho = tamanho;
}
www.primebean.com.br
www.primebean.com.br/joeydecurcio
89
16. Herana
Enquanto programamos em Java, h a necessidade de trabalharmos com vrias
classes. Muitas vezes, classes diferentes tem caractersticas comuns, ento, ao invs de
criarmos uma nova classe com todas essas caractersticas usamos as caractersticas de
um objeto ou classe j existente.
Ou seja, herana , na verdade, uma classe derivada de outra classe. Para
simplificar de uma forma mais direta, vejamos:
www.primebean.com.br
www.primebean.com.br/joeydecurcio
90
Vamos imaginar que exista uma classe chamada Eletrodomstico, e nela esto
definidos os seguintes atributos: ligado (boolean), voltagem (int) e consumo (int). Se
levarmos em conta a classe TV que estamos usando de exemplo at agora, podemos
dizer que TV deriva de Eletrodomstico. Ou seja, a classe TV possui todas as
caractersticas da classe Eletrodomstico, alm de ter suas prprias caractersticas.
Extends e Super Para fazermos uma classe herdar as caractersticas de uma outra,
usamos a palavra reservada extends logo aps a definio do nome da classe. Dessa
forma:
class NomeDaClasseASerCriada extends NomeDaClasseASerHerdada
Importante: Java permite que uma classe herde apenas as caractersticas de uma nica
classe, ou seja, no pode haver heranas mltiplas. Porm, permitido heranas em
cadeias, por exemplo: se a classe Mamifero herda a classe Animal, quando fizermos a
classe Cachorro herdar a classe Mamifero, a classe Cachorro tambm herdar as
caractersticas da classe Animal.
Como estamos tratando de herana de classes, toda classe tem seu mtodo
construtor. Portanto, se estamos trabalhando com duas classes, temos dois mtodos
construtores. Para acessarmos o mtodo construtor da classe que est sendo herdada
usamos o super().
www.primebean.com.br
www.primebean.com.br/joeydecurcio
91
Podemos usar o super para qualquer construtor da classe pai, pois o Java consegue
diferenciar os construtores por causa da sobrecarga de mtodos. Para finalizar, iremos
mostrar o exemplo citado mais acima da classe Eletrodomestico e TV.
Observe:
Classe 1: Eletrodomestico
package br.com.primebean;
public class Eletrodomestico {
private boolean ligado;
private int voltagem;
private int consumo;
public Eletrodomestico(boolean ligado, int voltagem, int consumo) {
this.ligado = ligado;
this.voltagem = voltagem;
this.consumo = consumo;
}
// (...)
}
Classe 2: TV
package br.com.primebean;
public class TV extends Eletrodomestico {
private int
private int
private int
public TV(int voltagem, int consumo, int canal, int volume, int tamanho) {
super(false, voltagem, consumo);
this.canal = canal;
this.volume = volume;
this.tamanho = tamanho;
}
www.primebean.com.br
www.primebean.com.br/joeydecurcio
//(...)
}
Classe que mostra a instanciao de TV.
package br.com.primebean;
public class ExemploHeranca {
public static void mostrarCaracteristicas(TV obj) {
System.out.print("Esta TV tem as seguintes caractersticas:\n"
+ "Tamanho: " + obj.getTamanho() + "\"\n"
+ "Voltagem Atual: "+ obj.getVoltagem() + "V\n"
+ "Consumo/h: " + obj.getConsumo() + "W\n");
if (obj.isLigado()) {
System.out.println("Ligado: Sim\n"
+ "Canal: " + obj.getCanal() + "\n"
+ "Volume: " + obj.getVolume()+"\n");
} else {
System.out.println("Ligado: No\n");
}
}
public static void main(String args[]) {
TV tv1 = new TV(110, 95, 0, 0, 21);
TV tv2 = new TV(220, 127, 0, 0, 29);
tv2.setLigado(true);
tv2.setCanal(3);
tv2.setVolume(25);
mostrarCaracteristicas(tv1);
mostrarCaracteristicas(tv2);
}
}
O cdigo acima ir mostrar o seguinte resultado:
Esta TV tem as seguintes caractersticas:
Tamanho: 21"
www.primebean.com.br
www.primebean.com.br/joeydecurcio
92
93
17. Enum
Java nos possibilita criar uma estrutura de dados enumarada. Essas estruturas de
dados enumeradas so conjuntos de constantes organizados em ordem de declarao,
ou seja, o que declarado primeiro vir primeiro. A funcionalidade principal de enum
agrupar valores com o mesmo sentido dentro de uma nica estrutura, como por exemplo,
meses, dias da semana, cores, tabela peridica, etc. e tambm limitar ou determinar
nmero de valores que podem ser usados na programao.
Embora sua funcionalidade totalmente diferente, a criao de uma estrutura
enumerada parecida com uma classe. Basta trocarmos a palavra-chave class pela
palavra-chave enum. Mas, devemos levar em considerao alguns fatores:
www.primebean.com.br
www.primebean.com.br/joeydecurcio
94
1. Uma estrutura enum deve ter seu prprio arquivo da mesma forma que acontece com
as classes pblicas. Por exemplo, se ns implementarmos uma classe pblica chamada
HelloWorld, ento, deve haver um arquivo chamado HelloWorld.java. Se criarmos um
enumerador chamado Cores, ento, deve haver um arquivo chamado Cores.java.
2. Estruturas enum no so instanciveis. Ou seja, estruturas enum no possuem um
mtodo construtor, portanto, no h como usar o instanciador new.
3. Estruturas enum so apenas declarveis. Portanto, toda a lista de constantes
declaradas dentro desta estruturas so acessados estaticamente. Ou seja, nome da
varivel, mais ponto (.) e o nome da constante (Suposio: mes.JANEIRO).
4. Toda estrutura enum possui um mtodo para acessar seus valores em forma de array
(vetor) chamado values().
www.primebean.com.br
www.primebean.com.br/joeydecurcio
95
this.volume = 25;
this.ligada = false;
this.cor = cor;
}
public int getTamanho() {
return tamanho;
}
public int getCanal() {
return canal;
}
public int getVolume() {
return volume;
}
public Cores getCor() {
return cor;
}
public static void main(String args[]) {
TV minhaTV = new TV(29, Cores.PRATA);
/**
* acessando estaticamente (diretamente)
* o valor PRATA do enum Cores
**/
System.out.println("Caractersticas da minha TV:" +
"\nTamanho:" + minhaTV.getTamanho() +
"\nCanal atual:" + minhaTV.getCanal() +
"\nVolume atual:" + minhaTV.getVolume() +
"\nCor: " + minhaTV.getCor());
}
}
Estruturas enum tambm podem ser determinadas. Dessa forma, podemos atribuir
mais valores a mesma constante. Por exemplo, podemos fazer uma estrutura enum da
tabela peridica com os smbolos qumicos tendo todos os valores possveis da tabela
(Nmero Atmico, Peso Atmico e Nome do Elemento). Para fazer isso, no final da
enumerao, temos que declarar as constantes que foram usadas, assim:
www.primebean.com.br
www.primebean.com.br/joeydecurcio
96
...
private final int numero; //constante para nmero atmico
private final double peso; //constante para peso atmico
private final String nome; //constante para nome do elemento
...
O fator do encapsulamento usando private aqui ser muito importante, pois dessa
forma no haver um meio de alterar o valor dessas constantes por acidente. Aps isso,
criamos mtodos para acessar esses valores.
...
private int numero();
private double peso();
private String nome();
...
Ento, criamos a definio usada nas constantes. Essas definies se parecem
muito com os construtores de classes, mas sua funo apenas indicar o que cada
uma das informaes contidas em cada constante.
...
NomeDoEnum (int numero, double peso, String nome){
this.numero = numero;
this.peso = peso;
this.nome = nome;
...
Relembrando: Todas estas definies sempre devem vir aps a definio das
constantes. No exemplo abaixo, est esta estrutura com apenas trs elementos qumicos.
public enum TabelaPeriodica {
// Declarao das constantes
H (1, 1.00794, "Hidrognio"),
HE (2, 4.002602, "Hlio"),
O (8, 15.9994, "Oxignio");
www.primebean.com.br
www.primebean.com.br/joeydecurcio
/**
* Por ser um exemplo,
* no foram colocados
* todos os elementos qumicos
* da Tabela Peridica
**/
// Definio das constantes
private final int numero;
private final double massa;
private final String nome;
// mtodos para acessar os valores
private int numero() {
return this.numero;
}
private double massa() {
return this.massa;
}
private String nome() {
return this.nome;
}
//mtodo que define as constantes
private TabelaPeriodica(int numero, double massa, String nome) {
this.numero = numero;
this.massa = massa;
this.nome = nome;
}
public static void main(String args[]) {
System.out.println("Dados do elemento qumico H:");
System.out.println("\nNmero: " + TabelaPeriodica.H.numero() +
"\nMassa: " + TabelaPeriodica.H.massa() +
"\nElemento: " + TabelaPeriodica.H.nome());
}
}
www.primebean.com.br
www.primebean.com.br/joeydecurcio
97
98
18. Interfaces
Interface um recurso da orientao a objeto utilizado em Java que define aes
que devem ser obrigatoriamente executadas, mas que cada classe pode executar de
forma diferente. Interfaces contm valores constantes ou assinaturas de mtodos que
devem ser implementados dentro de uma classe. E por que isso?
Isso se deve ao fato que muitos objetos (classes) podem possuir a mesma ao
(mtodo), porm, podem execut-la de maneira diferente.
Usando um exemplo bem drstico, podemos ter uma interface chamada areo que
possui a assinatura do mtodo voar(). Ou seja, toda classe que implementar areo deve
dizer como voar(). Portanto, se eu tenho uma classe chamada pssaro e outra chamada
avio, ambas implementando a interface areo, ento, nestas duas classes devemos
codificar a forma como cada um ir voar(). Uma interface criada da mesma forma que
uma classe, mas utilizando a palavra-chave interface no lugar de class.
interface nomeDaInterface { mtodoAbstrato (argumentos); }
www.primebean.com.br
www.primebean.com.br/joeydecurcio
99
ser feito em Java, pois uma classe apenas pode herdar as caractersticas de uma outra
classe. Trazendo ao exemplo j usado por ns, teramos o seguinte conceito.
1) Teramos a classe principal que caracteriza a TV.
public class TV {
private int tamanho;
private int canal;
private int volume;
private boolean ligada;
public TV(int tamanho) {
this.tamanho = tamanho;
this.canal = 0;
this.volume = 0;
this.ligada = false;
}
// abaixo teramos todos os mtodos construtores get e set...
}
2) Teramos as aes que comumente toda televiso executa, mas que cada modelo pode
executar de forma diferente. Como geralmente toda ao da TV executada pelo controle
remoto, ento chamaremos esta interface de controle remoto.
public interface ControleRemoto {
/*
* Perceba que apenas a assinatura dos mtodos esto aqui.
* E cada mtodo termina com um ponto-e-vrgula (;)
*/
void mudarCanal(int canal);
void aumentarVolume (int taxa);
void diminuirVolume (int taxa);
boolean ligar();
boolean desligar();
}
www.primebean.com.br
www.primebean.com.br/joeydecurcio
100
3) Agora que temos nossa interface e a definio do que a TV, vamos desenvolver duas
TVs diferentes, imaginando que fossem duas marcas completamente distintas e que uma
no tem nenhuma relao com a outra.
Como ambas as TVs iro implementar a interface ControleRemoto, ento, no corpo
das duas classes devem conter todos os mtodos da interface. No exemplo usado abaixo,
apenas implementaremos os mtodos ligar e desligar.
A TV modelo 001 uma TV simples, sem muitos recursos que quando acionarmos
o comando desligar ir simplesmente desligar.
public class ModeloTV001 extends TV implements ControleRemoto {
public final String MODELO = "TV001";
public ModeloTV001(int tamanho) {
super(tamanho);
}
public void desligar() {
super.setLigada(false);
}
public void ligar() {
super.setLigada(true);
}
public void aumentarVolume(int taxa) { }
public void diminuirVolume(int taxa) { }
public void mudarCanal(int canal) { }
}
O modelo SDX uma TV mais moderna, que quando acionarmos o comando
desligar ir apresentar uma mensagem dizendo "tchau!".
public class ModeloSDX extends TV implements ControleRemoto {
public final String MODELO = "TV-SDX";
public ModeloSDX(int tamanho) {
super(tamanho);
www.primebean.com.br
www.primebean.com.br/joeydecurcio
101
}
public void desligar() {
System.out.println("Tchau!");
super.setLigada(false);
}
public void ligar() {
super.setLigada(true);
}
public void aumentarVolume(int taxa) { }
public void diminuirVolume(int taxa) { }
public void mudarCanal(int canal) { }
}
Como pode ser visto, ambos possuem a mesma ao que desligar, porm cada
um executa de forma diferente.
public class ExemploInterfaceamento {
public static void main(String[] args) {
ModeloTV001 tv1 = new ModeloTV001(21);
ModeloSDX tv2 = new ModeloSDX (42);
tv1.ligar();
tv2.ligar();
System.out.print("TV1 - modelo " + tv1.MODELO + " est ");
System.out.println(tv1.isLigada() ? "ligada" : "desligada");
System.out.print("TV2 - modelo " + tv2.MODELO + " est ");
System.out.println(tv1.isLigada() ? "ligada" : "desligada");
}
// ambas as TVs esto ligadas e vamos deslig-las
System.out.println("Desligando modelo " + tv1.MODELO);
tv1.desligar();
System.out.println("Desligando modelo " + tv2.MODELO);
tv2.desligar();
}
Se prestarmos ateno, apenas a TV2 mostrar uma mensagem quando for
desligada. Para visualizar melhor este exemplo, baixe o cdigo exemplo e implemente os
www.primebean.com.br
www.primebean.com.br/joeydecurcio
102
19. Annotations
Annotations, traduzindo, quer dizer anotaes. Annotations do informaes sobre
o cdigo que est sendo escrito ou at mesmo do prprio programa, o que se assemelha
aos comentrios. Porm, annotations podem ser usados como objeto semntico de
compiladores, ou seja, compiladores podem interpretar as annotations.
Dessa forma possvel que compiladores entendam que, por exemplo, no para
mostrar mensagens de advertncias (Warnings), ou usar as annotations para detectar
erros de cdigo, criar documentaes usando XML, etc. Annotations podem possui
elementos ou no. Seus elementos so sempre pair values, ou seja, elemento tem um
nome e um valor.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
103
Exemplo: @Override.
Abaixo est uma lista com algumas das annotations mais utilizadas.
@Deprecated: Sempre que algum mtodo tem seu uso desencorajado por ser perigoso
ou por ter uma alternativa melhor desenvolvida, ento, ele recebe a anotao
@Deprecated.
@Override: Usado principalmente em casos de polimorfismo, sempre que formos
sobrescrever um mtodo da classe-pai (superclasse) devemos indicar ao compilador com
@Override. Mas, devemos tomar cuidado ao utilizar @Override, pois se marcarmos o
mtodo e ele no sobrescrever nenhum mtodo da classe-pai (superclasse), ento, o
compilador gerar uma mensagem erro.
@SuppressWarnings ("deprecation"): Todos os avisos da categoria "inadequado" so
ignorados.
@SuppressWarnings ("unchecked"): Todos os avisos da categoria "no verificado" so
ignorados.
@SuppressWarnings ({"unchecked", "deprecation"}): Todos os avisos de qualquer
categoria so ignorados.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
104
105
software = "JRC",
versao = 1.0f
)
public class AlgumaClasse {
//cdigo da classe
}
www.primebean.com.br
www.primebean.com.br/joeydecurcio
106
www.primebean.com.br
www.primebean.com.br/joeydecurcio
107
/*
* Uma classe abstrata pode possuir mtodos no abstratos
*/
public void setVoltagem(int voltagem) {
this.voltagem = voltagem;
}
public int getVoltagem() {
return this.voltagem;
}
public void setLigado(boolean ligado) {
this.ligado = ligado;
}
public boolean isLigado() {
return ligado;
}
}
Como podemos observar, criamos um modelo de classe que compreende a uma
gama enorme de outros objetos. Agora, qualquer objeto que derivar desse modelo deve
ter sua voltagem especificada e dizer se est ligado ou no.
Ento, vamos criar outras duas classes que herdam as caractersticas da classe
abstrata (modelo).
A primeira a classe TV:
package classeabstrata;
public class TV extends Eletrodomestico {
private int tamanho;
private int canal;
private int volume;
public TV(int tamanho, int voltagem) {
super (false, voltagem); // construtor classe abstrata
www.primebean.com.br
www.primebean.com.br/joeydecurcio
this.tamanho = tamanho;
this.canal = 0;
}
/* implementao dos mtodos abstratos */
public void desligar() {
super.setLigado(false);
setCanal(0);
setVolume(0);
}
public void ligar() {
super.setLigado(true);
setCanal(3);
setVolume(25);
}
//abaixo teramos todos os mtodos construtores get e set...
}
www.primebean.com.br
www.primebean.com.br/joeydecurcio
108
109
setSintonia(0);
setVolume(0);
}
public void ligar() {
super.setLigado(true);
setSintonia(88.1f);
setVolume(25);
}
// abaixo teramos todos os mtodos construtores get e set...
}
Pronto, como podemos ver, temos duas classes totalmente diferentes que tem
como base o mesmo modelo. Tambm perceptvel o fato de que em ambas as classes,
os mtodos abstratos ligar() e desligar() foram implementados, porm, no h a
implementao dos outros mtodos como setVoltagem() ou isLigado().
As classes abstratas servem de base para codificao de uma classe inteira,
diferentemente das interfaces que so apenas assinaturas dos mtodos. Sumarizando,
quando temos que definir variveis, constantes, regras, e pequenas aes definidas
devemos usar classes abstratas. Mas, se formos apenas criar a forma como objetos
devem realizar determinadas aes (mtodos) devemos optar por interfaces.
A boa combinao de heranas e implementaes de classes abstratas e
interfaces proporciona uma forma robusta de criao de softwares e uma tima alternativa
para heranas mltiplas comumente usadas em C++.
Abaixo est uma classe que testa a funcionalidade dessas classes.
package classeAbstrata;
public class Main {
public static void main(String[] args) {
TV tv1 = new TV(29, 110);
www.primebean.com.br
www.primebean.com.br/joeydecurcio
110
21. Polimorfismo
Polimorfismo, que vem do grego "muitas formas". o termo definido em linguagens
orientadas a objeto - como o Java - para a possibilidade de se usar o mesmo elemento de
forma diferente.
Especificamente em Java, polimorfismo se encontra no fato de podemos modificar
totalmente o cdigo de um mtodo herdado de uma classe diferente, ou seja,
sobrescrevemos o mtodo da classe pai.
Portanto, polimorfismo est intimamente ligado a herana de classes. Um pequeno
exemplo para simplificar essa caracterstica segue abaixo:
a. Classe 1 possui 2 mtodos: mtodoA() e mtodoB().
b. Classe 2 herda a classe 1.
c. Classe 2 reescreve todo o mtodoA() que pertence a classe 1.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
111
www.primebean.com.br
www.primebean.com.br/joeydecurcio
112
www.primebean.com.br
www.primebean.com.br/joeydecurcio
113
www.primebean.com.br
www.primebean.com.br/joeydecurcio
114
www.primebean.com.br
www.primebean.com.br/joeydecurcio
115
Agora, vamos instanciar uma varivel da classe genrica Object com a classe TV.
package primebean;
public class ExemploTypecast3 {
public static void main(String[] args) {
Object obj = new TV(29, 1, 0, false);
System.out.println("A varivel obj "
+ obj.getClass());
}
}
Como podemos perceber, o resultado de getClass da varivel obj no sua classe
original (Object), mas sua instncia: class primebean.TV. Agora, no ser possvel criar
uma cpia desse objeto para uma varivel do mesmo tipo de sua instncia. Neste caso,
devemos fazer o typecast explcito da classe.
package primebean;
public class ExemploTypecast4 {
public static void main(String[] args) {
Object obj = new TV(29, 1, 0, false);
TV tv = (TV) obj;
TV tv2 = new TV(29, 1, 0, false);
System.out.println("A varivel tv cpia de obj" +
"\nobj: " + obj.toString() +
"\ntv: " + tv.toString());
System.out.println("TV2 outro objeto: " + tv2.toString());
}
}
O resultado do cdigo acima seria algo como:
A varivel tv cpia de obj
obj: primebean.TV@12345f
www.primebean.com.br
www.primebean.com.br/joeydecurcio
116
tv: primebean.TV@12345f
TV2 outro objeto: primebean.TV@abcde1
23. Instanceof
No exemplo anterior, se tentssemos atribuir obj diretamente a tv ocorreria um erro
de tipos incompatveis (type mismatch). Quando lidamos com classes, podemos testar
qual seu tipo de instancia usando o operador instanceof. Instanceof indica se um objeto
(j instanciado) pertence a uma classe.
O uso de instanceof : objeto instanceof nomeDaClasse. Para melhorar o exemplo
anterior, usaremos instanceof antes de atribuirmos obj a tv.
package primebean;
public class ExemploTypecast {
public static void main(String[] args) {
Object obj = new TV(29, 1, 0, false);
TV tv = null;
if (obj instanceof TV) {
tv = (TV) obj;
}
TV tv2 = new TV(29, 1, 0, false);
System.out.println("A varivel tv cpia de obj" +
"\nobj: " + obj.toString() +
"\ntv: " + tv.toString());
System.out.println("TV2 outro objeto: " + tv2.toString());
}
}
www.primebean.com.br
www.primebean.com.br/joeydecurcio
117
24. Generics
No artigo anterior de Java, vimos como usar typecast e instanceof. Aqui, veremos
uma pequena introduo de Generics ou programao genrica, na qual ser muito
importante quando formos tratar de classes e interfaces de coleo como, por exemplo, a
classe Vector.
Generics, ou programao genrica, serve para determinar para o compilador, qual
tipo de classe deve ser interpretada. Por exemplo, vamos imaginar que ser criada uma
classe chamada Aparelho que ir conter um objeto de alguma outra classe.
Para que essa classe possa aceitar qualquer tipo de classe, devemos fazer uso de
generics. Generics indicado como um identificador entre os sinais de maior e menor
(<>).
Para criar uma classe usando generics, basta que logo aps o nome da classe
coloquemos o indicador genrico. Esse indicador genrico simplesmente uma letra na
qual ser substituda dentro da classe no momento da execuo.
package primebean;
public class Aparelho <T> {
T objeto;
public Aparelho(T objeto) {
this.objeto = objeto;
}
public T getObjeto() {
www.primebean.com.br
www.primebean.com.br/joeydecurcio
118
return objeto;
}
public void setObjeto(T objeto) {
this.objeto = objeto;
}
}
Como a letra T identifica um tipo genrico, ela ser substituda por qualquer classe.
Vamos imaginar agora que temos duas classes distintas. A classe TV:
package primebean;
public class TV {
int tamanho;
int canal;
int volume;
boolean ligada;
public TV(int tamanho, int canal, int volume, boolean ligada) {
this.tamanho = tamanho;
this.canal = canal;
this.volume = volume;
this.ligada = ligada;
}
//mtodos get e set
}
E a classe Radio:
package primebean;
public class Radio {
public static int AM = 1;
public static int FM = 2;
private float frequencia;
private int volume;
www.primebean.com.br
www.primebean.com.br/joeydecurcio
119
www.primebean.com.br
www.primebean.com.br/joeydecurcio
120
usar typecast toda vez que fossemos usar um aparelho, seria muito provvel que
erraramos em algum momento. Java usa uma pequena conveno de nomenclatura para
as letras de identificao de generics (que so vastamente utilizadas no Framework de
colees Java), sendo:
E - Elemento
K - Chave
N - Nmero
T - Tipo
V - Valor
Generics um assunto bastante extenso com vrios tpicos que podem ser
abordados, dentre os quais podemos citar:
Multiplos tipos genricos. Ex.: <T, E, N>;
Tipos genricos limitados. Ex.: <U extends Number>;
Wildcards;
e Subtipos;
O intuito desta apostila apenas introduzir um conceito geral de programao
genrica (generics) para compreenso de classes e mtodos que utilizam generics.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
121
25. Excees
As excees so, na verdade, instncias de classes. E como qualquer classe ou
objeto, podemos facilmente manipular. Existem mtodos comuns entre todas as classes
de Excees, dentre as quais podemos citar:
toString(): Converte os dados da exceo para String para visualizao.
printStackTrace(): Imprime na sada de erro padro (geralmente console) todos os
frames de onde foram detectados erros. til para depurao no desenvolvimento, pois
mostra todo o histrico do erro, alm das linhas onde foram ocasionados.
getCause(): Retorna a causa da Exceo, ou null se a causa for desconhecida ou no
existir.
getMessage(): Retorna uma string com o erro. uma forma simples e elegante de
mostrar a exceo causada, geralmente, utilizada como forma de apresentao ao
usurio.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
122
25.2. Finally
Finally o trecho de cdigo final. A funo bsica de finally sempre executar seu
bloco de dados mesmo que uma exceo seja lanada. muito til para liberar recursos
do sistema quando utilizamos, por exemplo, conexes de banco de dados e abertura de
buffer para leitura ou escrita de arquivos.
Finally vir aps os blocos de catch.
try {
// cdigo a ser executado
} catch (ClasseDeExceo instnciaDaExceo) {
// tratamento da exceo
} finally {
// cdigo a ser executado mesmo que uma exceo seja lanada
}
Abaixo est um exemplo de tratamento de erro ou exceo. Tentaremos atribuir
uma string de letras a um objeto inteiro. Como no possvel atribuir uma string de letras
a um objeto inteiro, uma exceo de formato de nmero lanada.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
123
www.primebean.com.br
www.primebean.com.br/joeydecurcio
124
www.primebean.com.br
www.primebean.com.br/joeydecurcio
125
www.primebean.com.br
www.primebean.com.br/joeydecurcio
126
Agora que temos a base de todas as classes numricas, iremos para a descrio
dos mtodos contidos nessas classes, que apesar de diferentes, mantem uma
similaridade muito grande.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
127
Integer.parseInt(): analisa uma String para tenta atribuir um dado do tipo primitivo inteiro.
Long.parseLong(): analisa uma String para tenta atribuir um dado do tipo inteiro primitivo
longo.
Float.parseFloat(): analisa uma String para tenta atribuir um dado do tipo primitivo float.
Double.parseDouble(): analisa uma String para tenta atribuir um dado do tipo primitivo
double.
Se quisermos que, ao invs de um tipo primitivo de nmero, seja retornado um
objeto, podemos trocar qualquer parse* por valueOf(). Em tipos inteiros, alm de
valueOf(), tambm podemos trocar parseInt, parseByte, parseShort e parseLong por
decode().
Importante: As classes que se baseiam em nmeros inteiros (Byte, Short, Long e Integer)
possuem um segundo argumento do tipo inteiro opcional nos mtodos parse* que indica a
base do nmero inteiro, fazendo com que dessa forma possa ser interpretado nmeros
Decimais (base 10), Binrios (base 2), Octais (base 8) e Hexadecimais (base 16). Decode
tambm pode fazer este tipo de interpretao, mas no necessrio um segundo
argumento desde que a String respeite algumas convenes:
No so aceitos espaos;
No so aceitos nmeros negativos;
Nmeros octais devem comear com um 0 (ex.: "0377", "0400", "0401");
Nmeros hexadecimais devem comear com 0x, 0X ou # (ex.: "0xFF", "0X100", "#101").
public class ParseEDecode {
public static void main(String[] args) {
String numero = "256";
www.primebean.com.br
www.primebean.com.br/joeydecurcio
128
www.primebean.com.br
www.primebean.com.br/joeydecurcio
129
Mximo e Mnimo;
Potncias e Razes;
Logaritmo;
Arredondamentos e Valores Absolutos;
Trigonometria;
Nmeros Randmicos.
26.8.1. Constantes
ou
neperianos)
cada
uma
com
valor
de
3,141592653589793
2.718281828459045, respectivamente.
Abaixo est um exemplo simples com o clculo do comprimento do crculo:
public class ComprimentoCirculo {
public static void main(String[] args) {
float raio = 2.4f;
double comprimento = 2 * raio * Math.PI;
System.out.println(comprimento);
}
}
www.primebean.com.br
www.primebean.com.br/joeydecurcio
130
www.primebean.com.br
www.primebean.com.br/joeydecurcio
131
26.8.4. Logaritmo
Na classe Math encontramos funes para clculo de logaritmo natual, na base de
10 e a soma do nmero mais 1. Tais mtodos so:
log (nmero) - logaritmo natural de um nmero.
log10 (nmero) - logaritmo natural de um nmero na base 10
log1p (nmero) - logaritmo natual de um nmero somado a 1. Esse mtodo retorna um
resultado mais confivel se o nmero em questo for muito prximo a 0 ou um nmero
fracionado. Ou seja, o resultado no o mesmo entre os mtodos log1p (0.1f) e log
(1+0.1f).
public class Exemplo {
public static void main(String[] args) {
float nr = 0.1f;
System.out.println("Resultado 1: " + Math.log(nr+1));
System.out.println("Resultado 2: " + Math.log1p(nr));
}
}
www.primebean.com.br
www.primebean.com.br/joeydecurcio
132
www.primebean.com.br
www.primebean.com.br/joeydecurcio
133
26.8.6. Trigonometria
A maior parte dos mtodos encontrados na classe Math so trigonomtricas, o que
ajuda muito em clculos mais complexos que envolvem figuras.
sin (graus) - este mtodo retorna o valor do seno de acordo com o nmero de
graus passado como parmetro.
cos (graus) - este mtodo retorna o valor do coseno de acordo com o nmero de
graus passado como parmetro.
tan (graus) - este mtodo retorna o valor da tangente de acordo com o nmero de
graus passado como parmetro.
asin (graus) - este mtodo retorna o valor do arco seno de acordo com o nmero
de graus passado como parmetro.
acos (graus) - este mtodo retorna o valor do arco coseno de acordo com o
nmero de graus passado como parmetro.
atan (graus) - este mtodo retorna o valor do arco tangente de acordo com o
nmero de graus passado como parmetro.
sinh (graus) - este mtodo retorna o valor hiperblico do seno de acordo com o
nmero de graus passado como parmetro.
cosh (graus) - este mtodo retorna o valor hiperblico do coseno de acordo com o
nmero de graus passado como parmetro.
tanh (graus) - este mtodo retorna o valor hiperblico da tangente de acordo com o
nmero de graus passado como parmetro.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
134
ngulomedido em graus.
O limite inferior, ou valor inicial (start value) ser sempre somado ao nmero
randmico.
Por exemplo, se quisermos que um nmero randmico sempre fique entre 5 e 10,
procederamos da seguinte maneira:
O menor nmero possvel 5, portanto ele ser nosso start value ou limite inferior.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
135
Como temos ambos os limites (inferior e superior) devemos criar um alcance (range).
Para obtermos isso, subtrairemos o limite superior com o limite inferior (10-5=5).
public class Exemplo {
public static void main(String[] args) {
int limiteInferior = 5;
int limiteSuperior = 10;
int alcance = limiteSuperior - limiteInferior;
double nrRandomico = Math.random();
System.out.println("O nmero randmico escolhido entre 5 e 10 foi "
+ Math.round(limiteInferior + nrRandomico * alcance));
}
}
27. String
Strings so utilizadas frequentemente em vrias linguagens de programao, no
apenas Java. Embora Strings sejam uma sequncia de caracteres em Java, e no um
array de caracteres.
Em Java, o importante entender que string no um tipo de dado, mas sim uma
classe. E suas variveis so, na verdade, objetos dessa classe. Em sntese, tanto um
array de caracteres como uma string se apresentam da mesma forma. Ento, qual a
vantagem de se usar uma classe e no um array de tipo primitivo?
A resposta se baseia exatamente no uso da orientao a objetos e no fato de que
existem muitos mtodos que podemos utilizar em um objeto instanciado da classe String,
mesmo sendo os objetos desta classe imutveis, ou seja, uma vez instanciados no
podemos mudar o que est guardado dentro do objeto String.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
136
Dentre as possibilidades oferecidas pela classe String podemos destacar algumas como:
Concatenao;
Tamanho da String;
com o operador new. Ou por meio de uma string literal. String literal qualquer sequncia
de caracteres que estiver entre aspas (").
public class ExemploCriarString {
public static void main(String[] args) {
char[] charArray = { 'T', 'I', ' ', 'E', 'x', 'p', 'e', 'r', 't'};
/* construindo uma string a partir de um array de char */
String string1 = new String(charArray);
/* construindo uma string a partir de uma string literal */
String string2 = "www.primebean.com.br";
System.out.println(string1);
System.out.println(string2);
}
}
www.primebean.com.br
www.primebean.com.br/joeydecurcio
137
www.primebean.com.br
www.primebean.com.br/joeydecurcio
138
ou
minscula
usando
os
mtodos
toUpperCase()
toLowerCase()
respectivamente.
24.4. Comparao
H vrias formas de se fazer comparaes com uma string, mas vale sempre
lembrar que Java case sensitive - diferencia letras maiscula de minsculas e
vice-versa. Embora haja mtodos prprios para comparaes em que no h importncia
em diferenciar letras maisculas e minsculas.
A comparao mais simples usando o prprio operador de igualdade (==), mas
por se tratar de um objeto prefervel que se use o mtodo especfico chamado equals().
O mtodo equals() compara o objeto string com outro objeto, se ambos possurem
contedos iguais, ento, retornado verdadeiro (true), caso contrrio falso (false). Isso
quer dizer que se, por exemplo, tiver um objeto da classe Integer que vale 15 e uma string
contendo os caracteres 1 e 5, a comparao de ambos resultar em verdadeiro.
A funo equals() case sensitive, para fazer uma comparao ignorando esta
www.primebean.com.br
www.primebean.com.br/joeydecurcio
139
www.primebean.com.br
www.primebean.com.br/joeydecurcio
140
www.primebean.com.br
www.primebean.com.br/joeydecurcio
141
www.primebean.com.br
www.primebean.com.br/joeydecurcio
142
www.primebean.com.br
www.primebean.com.br/joeydecurcio
143
www.primebean.com.br
www.primebean.com.br/joeydecurcio
144
separao conseguiremos um array com 3 posies que seriam: [0]->15, [1]->30, [2]->00.
public class Exemplo {
public static void main(String[] args) {
String string1 = "15:30:00";
String[] stringDividida = string1.split(":");
for (int i = 0; i < stringDividida.length; i++) {
System.out.println("stringDividida[" + i + "]=" +
stringDividida[i]);
}
}
}
24.11. Substring
Substring uma poro ou parte da string principal da qual pode formar outra
string, ou seja, uma substring uma string formada a partir de uma string principal.
Para obtermos uma substring usamos um mtodo homnimo (de mesmo nome)
com um ou dois parmetros.
O primeiro parmetro, obrigatrio, a posio que a substring deve iniciar
(lembrando-se que strings sempre comeam da posio 0). O segundo parmetro,
opcional, a posio final da substring, caso este parmetro no seja indicado, a
substring sempre ir at o ltimo carcter encontrado.
Nota: O carcter na posio inicial far parte da substring, porm o carcter na posio
final no faz parte da substring. Vejamos o exemplo: Se tivermos uma string de 9
caracteres, portanto, de 0 a 8 posies, se fizermos a substring da seguinte forma:
stringOriginal.substring(5,8);
www.primebean.com.br
www.primebean.com.br/joeydecurcio
145
O resultado ser BEA. Ento, se quisermos que a 8a posio entre, devemos usar
a posio seguinte 9, assim: stringOriginal.substring(3,9);
public class ExemploSubstring {
public static void main(String[] args) {
String url = "www.primebean.com.br";
String dominio = url.substring(4);
String site = url.substring(url.indexOf('.') + 1,url.lastIndexOf('.'));
System.out.println("Anlise da string:");
System.out.println("Domnio: " + dominio);
System.out.println("Site: " + site);
}
}
www.primebean.com.br
www.primebean.com.br/joeydecurcio
146
25.1. Date(java.util.Date)
A classe Date armazena uma data e hora, que internamente armazenada com
um inteiro long que o numero de milissegundos que se passou desde 01/01/1970. Esta
classe bem simples de se trabalhar, mas muitos de seus mtodos foram depreciados
por no trabalhar muito bem com internacionalizao e etc.
Date d = new Date();
25.2. Calendar(java.util.Calendar)
A classe Calendar sendo uma classe abstrata no pode ser instanciada com o
operador new, ela deve ser criada utilizando um operador esttico sobrecarregado
getInstance().
Na
maioria
das
vezes
voc
vai
receber
uma
instncia
de
Java.util.GregorianCalendar.
Calendar c = Calendar.getIntance();
Com a instncia de Calendar devemos configurar uma data e podemos fazer isso
de duas formas:
Mtodos set
c.set(ano,mes,dia);
c.set(ano,ms,dia,hora,minuto);
c.set(ano,ms,dia,hora,minuto,segundo);
Mtodo setTime
c.setTime(new Date() );
www.primebean.com.br
www.primebean.com.br/joeydecurcio
147
A classe Calendar tambm nos fornece vrias constantes que utilizaremos para
manipular uma data entre elas. Com a data devidamente configurada podemos realizar
diversas operaes com a data:
Para adicionar ou subtrair um dia, hora, ms ou ano utilizamos o mtodo add. O
mtodo add aceita dois parmetros, sendo o primeiro um constante inteira que representa
a unidade da data que queremos modificar(dia, ms , ano, etc) e o segundo quantas
vezes ser adicionada/subtrada esta unidade. A unidade informada utilizando
constantes fornecidas pela classe Calendar que pode ser:
Dia:
Calendar.DAY_OF_MONTH
Calendar.DAY_OF_WEEK
Calendar.DAY_OF_YEAR
Ms:
Calendar.MONTH
Ano:
Calendar.YEAR
Hora:
Calendar.HOUR
Calendar.HOUR_OF_DAY
www.primebean.com.br
www.primebean.com.br/joeydecurcio
148
Segundos:
Calendar.SECOND
25.3. DateFormat(java.text.DateFormat)
Bom agora sabemos como manipula datas, agora precisamos formatar a data para
apresentao. A classe DateFormat nos fornece uma maneira simples de format-la e
permite a internacionalizao a partir da classe Locale.
Date d = new Date();
Calendar c = Calendar.getInstance();
c.setTime(d);
DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
System.out.println( df.format(c.getTime()) );
Para obtermos uma String da data utilizamos o mtodo format que retorna uma
String no formato especificado no mtodo getDateInstance(). A sada do exemplo acima
ser algo como 03/04/14. A classe DateForma nos fornece vrios tipos de formato para
data como:
www.primebean.com.br
www.primebean.com.br/joeydecurcio
149
Dateformat.SHORT // 03/04/14
Dateformat.MEDIUM // 03/04/2014
Dateformat.LONG //3 de Abril de 2014
Dateformat.FULL //Quarta-feira, 3 de Abril de 2014
Embora para muitos casos estes formatos sero suficientes algumas vezes
necessitamos de uma formato vem personalizado. Isso pode ser feio atravs de um
subclasse de DateFormat a SimpleDateFormat..
Date hoje = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
System.out.println( sdf.format(hoje));
O construtor de SimpleDateFormat recebe uma String que representa o formato da
data. Os smbolos utilizados para cada campo da data pode ser visto na tabela abaixo
abaixo:
Smbolo
Significado
Apresentao
Exemplo
era designator
(Text)
AD
Year
(Number)
2014
Month in year
April & 04
Day in month
(Number)
14
(Number)
12
Hour in day (0 ~ 23 )
(Number)
Minute in hour
(Number)
30
Second in minute
(Number)
55
milisecond
(Number)
978
Day in week
(Text)
Tuesday
Day in year
(Number)
189
(Number)
Week in year
(Number)
27
Week in month
(Number)
www.primebean.com.br
www.primebean.com.br/joeydecurcio
150
Am/pm marker
(Text)
PM
(Number)
24
(Number)
Time zone
(Text)
Como vimos o dia da semana pode ser escrito por extenso, que lngua ele ser
utilizada? Normalmente o ingls, mas se quisermos que seja na lngua de um local
diferente?
Para isso utilizaremos a internacionalizao com a classe Locate que recebe em
seu construtor a lngua e o pas que queremos utilizar:
Locale brasil = new Locale("pt","br");//portugues do brasil
Locale japao = new Locale("ja");// japao
O objeto locale de Locale pode ser utilizado tanto com a classe DateFormat quanto
com a classe SimpleDateFormat.
Date hoje = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("E dd ",new Locale("pt","br"));
System.out.println( sdf.format(hoje));
DateFormat df = DateFormat.getDateInstance(DateFormat.FULL,new Locale("pt","br"));
System.out.println( df.format(hoje));
Para finalizar como covertermos uma String em um objeto Date
Date d = new Date();
SimpleDateFormat df = new SimpleDateFormat("DD/MM/yyyy");
try {
d = df.parse("25/03/2010");
} catch (ParseException ex) {
ex.printStackTrace();
www.primebean.com.br
www.primebean.com.br/joeydecurcio
151
}
System.out.println( df.format(d));
O mtdo parse da classe DateFormat e recebe uma string e convertepara um objeto Date
26.1. JoptionPane
Para introduzir esta nova fase, iniciaremos descrevendo um pouco sobre
JOptionPane do pacote visual Swing. A classe JOptionPane nos proporciona uma srie de
mtodos estticos que ao serem invocados criam caixas de dilogos simples e objetivas.
Para
usar
JOptionPane
javax.swing.JoptionPane primeiro.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
temos
sempre
que
importar
pacote
152
www.primebean.com.br
www.primebean.com.br/joeydecurcio
153
Nome da Constante
Equivale
YES_OPTION
NO_OPTION
CANCEL_OPTION
www.primebean.com.br
www.primebean.com.br/joeydecurcio
154
A caixa de dilogo de mensagem uma caixa que serve apenas para emitir uma
mensagem. Esta caixa tambm muito configurvel e verstil, pois serve para muitas
situaes distintas como uma mensagem de erro, um alerta, ou simplesmente uma
informao.
O mtodo showMessageDialog responsvel em trazer a caixa de mensagem, o
qual pode ter muitos argumentos, porm, vamos nos ater ao mais simples. Assim como o
mtodo showConfirmDialog, usaremos null como valor de nosso primeiro argumento,
pois, por enquanto, no h dependncia de outras janelas em nosso programa.
O segundo argumento a mensagem que desejamos emitir. Para finalizar nosso
exemplo, incluiremos as caixas de mensagem de acordo com as respostas.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
155
import javax.swing.JOptionPane;
public class CaixasDeDialogo {
public static void main(String[] args) {
String nome = null;
int resposta;
nome = JOptionPane.showInputDialog("Qual o seu nome?");
resposta = JOptionPane.showConfirmDialog(null, "O seu nome " + nome +
"?");
if (resposta == JOptionPane.YES_OPTION) {
// verifica se o usurio clicou no boto YES
JOptionPane.showMessageDialog(null, "Seu nome " + nome);
} else {
JOptionPane.showMessageDialog(null, "Seu nome no " + nome);
}
}
}
Abaixo est um exemplo de como ir ficar a caixa de mensagem caso clique no boto
YES.
www.primebean.com.br
www.primebean.com.br/joeydecurcio
156
Porm,
como
alterarmos
aparncia
dessa
www.primebean.com.br
www.primebean.com.br/joeydecurcio
caixa,
customizando-a
157
Uma das formas mais completas desse mtodo inclui alterar, inclusive, o ttulo da
caixa. Assim, usa-se 4 argumentos:
1. De qual frame a caixa de dilogo dependente, ou seja, qual a janela principal
que chamou a caixa Input Dialog. Caso a caixa de dilogo no dependa de nenhum frame
ou janela principal, basta utilizarmos o valor null para este argumento.
2. A mensagem que deve ser exibida ao usurio.
3. O ttulo da caixa de texto.
4. Que tipo de mensagem . O tipo de mensagem define qual o cone ser
utilizado, podendo ser utilizados os nmeros inteiros representados pelas constantes:
www.primebean.com.br
www.primebean.com.br/joeydecurcio
158
www.primebean.com.br
www.primebean.com.br/joeydecurcio
159
Outra forma de caixa de dilogo de entrada de dados a Input Dialog com lista de
opes. o mesmo mtodo showInputDialog, mas com mais argumentos, sendo um
deles uma lista de objetos. Esta lista de objetos far com que a caixa de dilogo venha
com um combo box ao invs de um campo de texto.
Para criar um Input Dialog com um combo box devemos usar os seguintes
argumentos na respectiva ordem:
1. De qual frame a caixa de dilogo dependente, ou seja, qual a janela principal
que chamou a caixa Input Dialog. Caso a caixa de dilogo no dependa de nenhum frame
ou janela principal, basta utilizarmos o valor null para este argumento.
2. A mensagem que deve ser exibida ao usurio.
3. O ttulo da caixa de texto.
4. Que tipo de mensagem . O tipo de mensagem define qual o cone ser
utilizado, podendo ser utilizados os nmeros inteiros representados pelas constantes da
www.primebean.com.br
www.primebean.com.br/joeydecurcio
160
www.primebean.com.br
www.primebean.com.br/joeydecurcio
161
"Finalizao",
JoptionPane.PLAIN_MESSAGE,
null, opcoes, "no");
} while (resposta == null || resposta.equals("no"));
}
}
No exemplo acima, criamos uma lista com dois objetos: "sim" e "no". E j
definimos "no" como opo pr-selecionada. Removemos qualquer cone com as opes
PLAIN_MESSAGE e cone null.
Criamos um lao (loop) com while que sempre ir repetir a mesma caixa enquanto
o boto Cancel ou a opo "no" forem selecionados. Abaixo est um exemplo mais
funcional, divertido e simples de fazer e entender.
Trata-se de um jogo de adivinhar onde um nmero escolhido e temos que
adivinhar qual nmero foi sorteado. No exemplo, sero usados elementos j estudados no
site como a classe Math e Integer.
import javax.swing.JOptionPane;
public class JogoDeAdivinhar {
public static void main(String[] args) {
// define um nmero qualquer entre 0 e 10
int rndNr = (int) Math.ceil(Math.random() * 10);
// lista de opes para o combo box da caixa de dilogo
Object[] opcoes = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9","10" };
// string onde ser retornado o resultado
String resposta;
while (true) {
// loop para evitar que o jogo feche depois da primeira resposta
resposta = (String) JOptionPane.showInputDialog(null,
"Em que nmero estou pensando?",
"Jogo de Advinhar",
JoptionPane.QUESTION_MESSAGE,
null, opcoes, null);
www.primebean.com.br
www.primebean.com.br/joeydecurcio
162
if (resposta == null) {
/*
* se clicar no boto Cancel, mostrar uma mensagem de Game Over
* e sair do loop para finalizar o programa
*/
JOptionPane.showMessageDialog(null,
"Game Over!\nVoc desistiu do jogo!");
break;
}
if (Integer.valueOf(resposta) > rndNr) {
/*
* Interpreta string como inteiro e compara com o nmero sorteado
* para ver se maior
*/
JOptionPane.showMessageDialog(null,
"Errado!\nO nmero que eu pensei menor.");
} else if (Integer.valueOf(resposta) < rndNr) {
/*
* Interpreta string como inteiro e compara com o nmero sorteado
* para ver se maior
*/
JOptionPane.showMessageDialog(null,
"Errado!\nO nmero que eu pensei maior.");
} else {
/*
* se no for nem maior e nem menor, ento igual.
* Finaliza o jogo saindo do loop
*/
JOptionPane.showMessageDialog(null,
"Parabns\nVoc adivinhou!\n"
+ "Eu realmente pensei no nmero " + rndNr);
break;
}
}
}
}
www.primebean.com.br
www.primebean.com.br/joeydecurcio