Sunteți pe pagina 1din 191

Curso Java Starter

www.t2ti.com
1
Curso Java Starter

Apresentao

O Curso Java Starter foi projetado com o objetivo de ajudar quelas pessoas
que tm uma base de lgica de programao e desejam entrar no mercado de
trabalho sabendo Java,

A estrutura do curso formada por mdulos em PDF e por mini-cursos em


vdeo. O aluno deve baixar esse material e estud-lo. Deve realizar os exerccios
propostos. Todas as dvidas devem ser enviadas para a lista de discusso que est
disponvel para inscrio na pgina do Curso Java Starter no site www.t2ti.com. As
dvidas sero respondidas pelos instrutores Albert Eije, Cludio de Barros e Miguel
Kojiio, alm dos demais participantes da lista.

Nosso objetivo que aps o estudo do Curso Java Starter o aluno no tenha
dificuldades para acompanhar um curso avanado onde poder aprender a
desenvolver aplicativos para Web, utilizando tecnologias como Servlets e JSP e
frameworks como Struts e JSF, alm do desenvolvimento para dispositivos mveis.

Albert Eije trabalha com informtica desde 1993. Durante esse perodo j
trabalhou com vrias linguagens de programao: Clipper, PHP, Delphi, C, Java, etc.
Atualmente mantm o site www.alberteije.com.

Cludio de Barros Tecnlogo em Processamento de Dados.

Miguel Kojiio bacharel em Sistemas de Informao, profissional certificado


Java (SCJP 1.5).

O curso Java Starter surgiu da idia dos trs amigos que trabalham juntos em
uma instituio financeira de grande porte.

www.t2ti.com
2
Curso Java Starter

Mdulo

01
Introduo ao
Java
Histrico

A linguagem de programao Java foi criada em 1991 por James Gosling,


ela iniciou-se como parte do projeto Green da Sun Microsystems. Inicialmente a
linguagem iria chamar-se Oak (Carvalho) em referncia a rvore que era visvel pela
janela de James Gosling.
A mudana de nome ocorreu pois j existia uma linguagem de programao
com este nome, ento a linguagem foi rebatizada para Java.
O termo Java utilizado, geralmente, quando nos referimos a:

Linguagem de programao orientada a objetos;


Ambiente de desenvolvimento composto pelo compilador, interpretador,
gerador de documentao e etc.;
Ambiente de execuo que pode ser praticamente qualquer mquina que
possua Java Runtime Environment (JRE) instalado;

A linguagem de programao Java uma linguagem de alto-nvel com as


seguintes caractersticas:

Simples: O aprendizado da linguagem de programao Java pode ser feito em


um curto perodo de tempo;

Orientada a objetos: Desde o incio do seu desenvolvimento esta linguagem


foi projetada para ser orientada a objetos;

Familiar: A linguagem Java muito familiar para os programadores C/C++ ;

Robusta: Ela foi pensada para o desenvolvimento de softwares confiveis,

www.t2ti.com
3
Curso Java Starter

provendo verificaes tanto em tempo de execuo quanto compilao, o


coletor de lixo responsabiliza-se pela limpeza da memria quando houver
necessidade;

Segura: Aplicaes Java so executadas em ambiente prprio (JRE) o que


inviabiliza a intruso de cdigo malicioso;

Portvel: Programas desenvolvidos nesta linguagem podem ser executados


em praticamente qualquer mquina desde que esta possua o JRE instalado;

etc.

Mquina Virtual Java - JVM

A mquina virtual java (JVM) uma mquina imaginria que emula uma
aplicao em uma mquina real. a JVM que permite a portabilidade do cdigo Java,
isto ocorre porque todo cdigo Java compilada para um formato intermedirio,
bytecode, este formato ento interpretado pela JVM.
Existem diversas JVMs cada uma delas destinada a um tipo de sistema
operacional (Windows, Linux, Mac e etc.), desta forma sendo o cdigo da aplicao
Java, bytecode, um cdigo interpretado pela JVM, podemos desenvolver uma
aplicao sem nos preocuparmos onde ela ser executada pois sabemos que existindo
a JVM instalada nosso cdigo ser executvel.

Coletor de Lixo Garbage Collection

Muitas linguagens de programao nos permitem alocar espao na memria


em tempo de execuo, uma vez encerrado o programa deve haver uma maneira de
liberar este espao para que outras aplicaes possam utiliz-lo.
Em muitas das linguagens de programao, inclusive C e C++, a
responsabilidade pela liberao do espao que no mais ser utilizado do
programador, no entanto, nem sempre fcil gerenciar o que est e o que no est
sendo utilizado, a m gerncia da memria ocasiona muitas vezes o estouro de pilha
(stack overflow) entre outros problemas.
Na linguagem de programao Java a responsabilidade pela gerncia da

www.t2ti.com
4
Curso Java Starter

memria do Coletor de lixo (Garbage Collector), desta forma, programadores Java


ficam livres da preocupao de alocao e desalocao da memria.
O Coletor de lixo um processo que roda em segundo plano e
responsvel pela liberao de memria alocada por variveis que no mais sero
utilizadas pela aplicao.

Fases de um programa Java

As fases pelo qual passam um programa Java relacionam-se da seguinte


forma:

1. Criao do cdigo fonte (Programa.java);


2. Compilao do cdigo fonte e gerao do bytecode (Programa.class);
3. Interpretao do bytecode pela mquina virtual;
4. Converso do bytecode em linguagem de mquina.

Hotspot

Hotspot a mquina virtual Java, ela prov algumas funcionalidades muito


importantes. Ao contrrio de outras aplicaes, que so compiladas diretamente para
cdigo da mquina em que sero executadas, em Java estas somente so
transformadas em cdigo de mquina em tempo de execuo quando necessrio.
No princpio esta abordagem trouxe problemas de sobrecarga e lentido dos
sistemas, no entanto, a JVM vem se aprimorando e, em muitas situaes, as
aplicaes Java tem desempenho similar as aplicaes que so previamente
compiladas.
Este desempenho vem melhorando muito devido a otimizao que a
mquina virtual consegue fazer a medida que o cdigo executado. Perceba que
quando programamos em C, por exemplo, o cdigo fonte transformado em cdigo
de mquina imediatamente.

www.t2ti.com
5
Curso Java Starter

Em princpio podemos pensar que o fato do programa no precisar passar


por uma etapa a mais, interpretao, ir torn-lo mais eficiente, mas muitas vezes a
compilao esttica no consegue prever situaes que iro ocorrer durante a
execuo do cdigo: trechos da aplicao mais utilizados, carga do sistema,
quantidade de usurios simultneos, memria disponvel e etc..
Estas informaes, relativas ao ambiente no qual a aplicao est sendo
executada, so utilizadas pela JVM para fazer otimizaes em tempo de execuo e
havendo necessidade o cdigo que est sendo interpretado transformado em
instrues nativas do sistema operacional (cdigo de mquina) em um processo de
compilao dinmica.
Esta transformao em tempo de execuo realizada pelo JIT, Just-in-time
compiler. O fato do cdigo (bytecode) ser transformado, em tempo de execuo, em
cdigo de mquina permite que a JVM mude a estratgia de compilao em busca de
um melhor desempenho, em um ciclo de aprendizado contnuo.

JRE e JDK

JRE: O Java Runtime Environment contm tudo aquilo que um usurio


comum precisa para executar uma aplicao Java (JVM e bibliotecas), como
o prprio nome diz o Ambiente de execuo Java;

JDK: O Java Development Kit composto pelo JRE e um conjunto de


ferramentas teis ao desenvolvedor Java.

Verses do Java:

Abaixo temos uma sntese das verses do Java e as principais alteraes


nas nomenclaturas e no seu contedo.

1. JDK 1.0 (1996): Primeira verso;


2. JDK 1.1 (1997): Adio das bibliotecas JDBC, RMI e etc;
3. J2SE 1.2 (1998) Playground: A partir daqui todas as verses Java foram
denominadas de Java 2 Standard Edition, passaram a ter apelidos (Playground)
e foi adicionado o Framework Collections e etc.;
4. J2SE 1.3 (2000) Kestrel: Incluso das bibliotecas JNDI, JavaSound e etc.;

www.t2ti.com
6
Curso Java Starter

5. J2SE 1.4 (2002) Merlin: Palavra reservada assert, biblioteca NIO e etc.;
6. J2SE 5.0 (2004) Tiger: Apesar da verso ser 1.5, agora chamada apenas
de 5. Adies importantes como: Enumerao, Autoboxing, Generics, for-each e
etc;
7. JSE 6 (2006) Mustang: Entre outras alteraes houveram mudana na
nomenclatura (remoo do 2 J2SE) e melhora significativa na performance.

Ferramentas do JDK

A seguir temos uma breve descrio das principais ferramentas que fazem
parte do JDK:

javac: Compilador da linguagem Java;


java: Interpretador Java;
jdb: Debugador Java;
java -prof: Interpretador com opo para gerar estatsticas sobre o uso dos
mtodos;
javadoc: Gerador de documentao;
jar: Ferramenta que comprime, lista e expande;
appletviewer: Permite a execuo e debug de applets sem browser;
javap: Permite ler a interface pblica das classes;
extcheck: Detecta conflitos em arquivos Jar.

Primeiro contato com o Java - Definies

Classe: a estrutura que, quando construda, produzir um objeto, dizemos


todo objeto instncia de alguma classe;
Objeto: Em tempo de execuo, quando a JVM encontra a palavra
reservada new criada uma instncia da classe apropriada;
Estado: definido pelo conjunto de atributos de uma classe, isto , cada
instncia da classe possuir um estado independente dos demais objetos.
Comportamento: So os mtodos da classe, comportamento aquilo que
uma classe faz (algoritmos), muitas vezes, um determinado comportamento
(mtodo) muda o estado do objeto, isto , aps a execuo do mtodo um
ou mais atributos mudaram de valor;

www.t2ti.com
7
Curso Java Starter

Primeiro contato com o Java - Nomenclatura

Existem trs aspectos importantes, em relao a nomenclatura, que


devemos considerar quando estamos programando Java.

Identificadores vlidos: Definem as regras para que o compilador


identifique o nome como vlido.
I. Devem iniciar com uma letra, cifro ($) ou sublinhado/underscore (_);
II. Aps o primeiro caracter podem ter qualquer combinao de letras,
caracteres e nmeros;
III.No possuem limite de tamanho;
IV. No podem ser palavras reservadas;
V. Identificadores so case-sensitive isto , Nome e nome so
identificadores diferentes.

Exemplos:

Identificadores vlidos Identificadores invlidos


_codigo 5ident
$turma -idade
$$_5A %valor

Conveno de nomenclatura da SUN: So recomendaes da SUN para


nomenclatura de classes, mtodos e variveis. Seu programa ir funcionar
mesmo que voc no siga estas convenes.
I. Classes e interfaces: A primeira letra deve ser maiscula e, caso o nome
seja formado por mais de uma palavra, as demais palavras devem ter
sua primeira letra maiscula tambm (camelCase);
II. Mtodos: A primeira letra deve ser minscula e aps devemos aplicar o
camelCase;
III.Variveis: Da mesma forma que mtodos;
IV. Constantes: Todas as letras do nome devem ser maisculas e caso seja
formada por mais de uma palavra separada por underscore.

www.t2ti.com
8
Curso Java Starter

Exemplos:

Classes Mtodos Variveis Constantes


Carro desligar motor COMBUSTIVEL
CursoJavaIniciante iniciarModulo quantidadeModulos NOME_CURSO
Hotel reservarSuiteMaster nomeReservaSuite TAXA_SERVICO

Conveno JavaBeans: Requisitos para que os nomes atendam a


especificao para JavaBeans.
I. Se o atributo no for um booleano o mtodo getter (utilizado para obter
a varivel) deve iniciar por get;
I. Se o atributo for um booleano o mtodo getter pode iniciar por get ou
is;
II. O mtodo setter (atribuio) da propriedade sempre deve iniciar por
set;
III.O restante do nome deve ser o nome do atributo concatenado ao prefixo
(is, get ou set) em letra maiscula;
IV. O mtodo setter e getter sempre devem ser pblicos.

Exemplos:

Setters atributo nome Getters atributo valor


public void setNome(argumento) public boolean getValor()
public boolean isValor()

Instalao do JDK

A seguir veremos os passos necessrios para a instalao do JDK no


Windows porm, antes de iniciarmos, vamos dar uma olhada nas variveis de
ambiente que devem ser atualizadas e criadas quando instalamos o JDK:

JAVA_HOME: Indica o diretrio onde foi instalado o JDK, muito utilizado


por frameworks e por outros programas para localizar o JDK;

www.t2ti.com
9
Curso Java Starter

PATH: Identifica o local onde encontram-se as ferramentas de


desenvolvimento (compilador, interpretador, gerador de documentao e
etc.), devemos adicionar o diretrio JAVA_HOME\bin;

CLASSPATH: Identifica diretrio onde o ClassLoader pode encontrar classes


que so utilizadas pela sua aplicao.

Windows

Faa o download do JDK no site da SUN e execute o instalador.


*Muitos estudantes tm tido dificuldade para escolher o instalador. O instalador correto sempre conter
o termo JDK no seu nome, se contiver o termo JRE o incorreto.

www.t2ti.com
10
Curso Java Starter

Este diretrio ser utilizado na configurao do ambiente.

A seguir clique em Next> at que a instalao seja iniciada.

www.t2ti.com
11
Curso Java Starter

Neste momento inicia-se a instalao do JRE, continue clicando em Next>.

Nesta tela selecione todos os navegadores disponves.

www.t2ti.com
12
Curso Java Starter

Aguarde a concluso da instalao.

Clique em Finish para terminar o processo.

www.t2ti.com
13
Curso Java Starter

Aps a instalao do Java ns devemos iniciar a configurao das variveis


de ambiente.
1. Clique com o boto direito em cima do cone Meu Computador;
2. V em Propriedades;
3. Selecione a aba Avanado;
4. Clique no boto Variveis de ambiente;
5. Clique no boto Nova em Variveis do sistema;
5.1. Nome da varivel: JAVA_HOME
5.2. Valor da varivel: Coloque aqui o endereo de instalao neste caso =
C:\Arquivos de programas\Java\jdk1.5.0_05
5.3. Clique em OK
6. Clique novamente no boto Nova em Variveis do sistema;
6.1. Nome da varivel: CLASSPATH
6.2. Valor da varivel:
.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME
%\lib\dt.jar;%JAVA_HOME%\lib\htmlconverter.jar;%JAVA_HOME%\
jre\lib;%JAVA_HOME%\jre\lib\rt.jar
6.3. Clique em OK
7. Selecione a vriavel PATH em Variveis do sistema;
7.1. Adicione o seguinte endereo ao campo Valor da varivel:
7.2.%JAVA_HOME%\bin
7.3. Clique em OK;
8. Clique em OK;
9. Clique em OK.

Agora vamos testar a instalao. Clique no boto Iniciar, v em Executar


e digite cmd.

www.t2ti.com
14
Curso Java Starter

No prompt do MS-DOS vamos testar o interpretador, digite java -version,


dever aparecer algo parecido com isto:

Agora vamos testar o compilador, digite javac -version, dever aparecer


algo parecido com isto:

Nos dois casos se apareceram textos semelhantes aos apresentados

www.t2ti.com
15
Curso Java Starter

significa que a instalao foi bem sucedida.

Primeira aplicao Java

Vamos criar a nossa primeira aplicao Java utilizando o editor do MS-DOS,


para isto dirija-se ao prompt e digite edit Teste.java.

Dentro do editor digite o texto conforme abaixo:

www.t2ti.com
16
Curso Java Starter

Saia do editor pressionando ALT + F e X, se a verso do MS-DOS for em


portugus a combinao de teclas ser diferente (provavelmente ALT + A e R), ao
sair, o editor perguntar se voc deseja salvar. Escolha a opo afirmativa.
Retorne ao console e digite: javac Teste.java. Este comando ir compilar a
nossa classe e gerar o bytecode (Teste.class).
Aps a gerao do arquivo compilado (.class) digite: java Teste. Este
comando invoca o interpretador que ir transformar o nosso bytecode em cdigo de
mquina.

Pronto, temos nossa primeira aplicao Java sendo executada1. Agora


vamos entender um pouco de cada trecho do cdigo digitado.

1. public class Teste


2. {
3. public static void main(String[] parametros)
4. {
5. System.out.println("Curso Java Iniciante!!");
6. }
7. }

Linha:
1. Declarao da classe pblica de nome Teste;
2. Incio do corpo da classe;
3. Declarao do mtodo main (pblico, esttico, sem retorno e parametrizado);

1 A instalao do JDK e a criao da aplicao so demonstradas no mini-curso Instalao do JDK

www.t2ti.com
17
Curso Java Starter

4. Incio do corpo do mtodo;


5. Comando para impresso na tela;
6. Fechamento do corpo do mtodo main;
7. Fechamento da classe.

Mtodo main

Antes de iniciar o mtodo main, vamos abrir um breve parnteses para


introduzir a forma como comentamos o cdigo em Java. Basicamente existem duas
formas:

1. // texto: Esta a forma de comentar apenas uma linha de cdigo


2. /* texto */: Esta declarao utilizada quando desejamos comentar mais
de uma linha de cdigo

Vejamos a classe anterior agora com comentrios:

//Este o comentrio de uma linha


public class Teste {

/*
Este o comentrio
de mais de
uma linha
*/

public static void main(String[] parametros) {


System.out.println("Curso Java Iniciante!!");
}
}

Retornando ao main, temos o seguinte:

public static void main(String[] parametros)

O main o mtodo que inicia as aplicaes Java, quando solicitamos ao


interpretador que execute uma determinada classe compilada ele procura o mtodo
main, se este mtodo no existir ir ser gerada uma exceo informando que o
mtodo no foi localizado.
A JVM s ir reconhecer o mtodo main se ele possuir as seguintes
caractersticas:

www.t2ti.com
18
Curso Java Starter

1. Ser pblico (public);


2. Esttico (static);
3. No retornar nenhum valor (void);
4. O nome deve ser main;
5. Receber como parmetro um array de String.

Exerccios

Aprenda com quem tambm est aprendendo, veja e compartilhe as suas


respostas no nosso Frum:
Exerccios Mdulo 01 Introduo ao Java

1. Qual a diferena entre JRE e JDK?


2. Quais so os componentes da JDK?
3. Instale o JDK na sua mquina.
4. Crie uma classe que imprima o seguinte texto Terminei o mdulo 3 com um
programa Java!.
5. Compile e execute a classe desenvolvida no exerccio anterior.
6. Comente o trecho de cdigo responsvel pela execuo da impresso, compile e
execute.
7. Mude o nome do mtodo main para start, compile e execute. O que
aconteceu?
8. Mude novamente o nome do mtodo main, agora para #main, compile e
execute. O que aconteceu?
9. Qual dos exerccios, 7 ou 8, gerou uma exceo durante a compilao? E
durante a execuo?

www.t2ti.com
19
Curso Java Starter

Mdulo

02
Tipos Primitivos, Operadores
e Controle de Fluxo

Introduo

Se voc est achando essa parte do curso muito terica, no se preocupe com
isso. Voc vai usar quase tudo que est sendo visto aqui quando for criar uma
aplicao Java, seja ela desktop, para web ou mobile.
Assista aos mini-cursos NetBeans e Eclipe para observar como instalar e
utilizar essas IDEs. Voc pode escolher qualquer umas das duas para desenvolver os
seus projetos Java.

Tipos de Dados

Observe a tabela a seguir, sobre os tipos de dados. Esses tipos so conhecidos


como Tipos de Dados Primitivos. Como podemos observar a linguagem Java oferece
diversos tipos de dados com os quais podemos trabalhar. H basicamente duas
categorias em que se encaixam os tipos de dados: tipos primitivos e tipos de
referncias. Os tipos primitivos correspondem a dados mais simples ou escalares,
enquanto os tipos de referncias consistem em arrays, classes e interfaces. Estes
sero vistos nos mdulos subseqentes.
Vamos a uma descrio curta sobre cada um dos tipos:

Tipo Descrio
Pode ser contido em 1 bit, porm o seu tamanho no precisamente
boolean
definido. Assume os valores true ou false.
Caractere em notao Unicode de 16 bits. Serve para armazenar dados
char alfanumricos. Tambm pode ser usado como um dado inteiro com valores
na faixa entre 0 e 65535.
Inteiro de 8 bits em notao de complemento de dois. Pode assumir valores
byte
entre -27=-128 e 27-1=127.
short Inteiro de 16 bits em notao de complemento de dois. Os valores possveis

www.t2ti.com
3
Curso Java Starter

cobrem a faixa de -2-15=-32.768 a 215-1=32.767


Inteiro de 32 bits em notao de complemento de dois. Pode assumir
int
valores entre -231=2.147.483.648 e 231-1=2.147.483.647.
Inteiro de 64 bits em notao de complemento de dois. Pode assumir
long
valores entre -263 e 263-1.
Representa nmeros em notao de ponto flutuante normalizada em
preciso simples de 32 bits em conformidade com a norma IEEE 754-1985.
float O menor valor positivo representvel por esse tipo 1.40239846e-46 e o
maior 3.40282347e+38. 4 bytes de tamanho e 23 dgitos binrios de
preciso.
Representa nmeros em notao de ponto flutuante normalizada em
preciso dupla de 64 bits em conformidade com a norma IEEE 754-1985. O
double menor valor positivo representvel 4.94065645841246544e-324 e o
maior 1.7976931348623157e+308. 8 bytes de tamanho e 52 dgitos
binrios de preciso.

Para entendermos o comportamento dos tipos acima vamos analis-los em um


programa. Observe atentamente o programa abaixo. No passe adiante sem
compreender cada linha desse programa. Ele est todo comentado. Essa classe est
em anexo para que voc a abra e teste sua execuo no Netbeans ou no Eclipse.

public class TiposPrimitivos {

public static void main(String[] args) {

/*
Declaramos 8 variveis. Exatamente o mesmo nmero
dos tipos primitivos do Java. Cada varivel de
um dos tipos.
*/
boolean bo;
char c;
byte b;
short s;
int i;
long l;
float f;
double d;

/*
Atribumos o valor 65 varivel c, que do tipo
char.

OBS Importante: O tipo char tambm um inteiro!


No entanto um inteiro que faz referncia a tabela
Unicode, que contm 65535 simbolos.
*/
c = 65;
System.out.println("=============================");
System.out.println("char");

/*

www.t2ti.com
4
Curso Java Starter

Note a diferena entre a impresso das duas linhas


abaixo:
*/
System.out.println("=============================");
System.out.println("valor de c como char = " + c);
System.out.printf("valor de c como numero = %d \n",(int)c);
System.out.println("-----------------------------");

/*

Sada da impresso:

=============================
char
=============================
valor de c como char = A
valor de c como numero = 65
-----------------------------

Interessante notar que alm do println voc tambm


pode usar o printf que aprendemos l no C. Vale
aqui tudo que aprendemos no Mdulo 1 em relao
funo printf.
*/

/*
Agora vamos trabalhar com os outros tipos inteiros:
byte, short e int.

Veja que estamos trabalhando com o valor 10 e que


atribumos esse valor varivel b, que do tipo
byte. Como esse valor "cabe" em um short e em um int
no h problema nenhum quando atribumos o valor de b
varivel s (short) e o valor de s varivel i (int)
*/

b = 10;
s = b;
i = s;
System.out.println("=============================");
System.out.println("inteiros");
System.out.println("=============================");
System.out.println("i = s = b = "+i);

/*

Sada da impresso:

=============================
inteiros
=============================
i = s = b = 10
*/

/*
Agora multiplicamos i por 100 e atribuimos o total
dessa multiplicao ao prprio i.
*/
i *= 100;

System.out.println("novo valor de i = "+i);

www.t2ti.com
5
Curso Java Starter

/*

Sada da impresso:

novo valor de i = 1000


*/

/*
Olhe para a linha de cdigo abaixo com muita
ateno. Eu tento colocar o valor de i em b, mas o
Java no deixa. Preciso ento fazer um casting
(converso) explcito. Antes da varivel i eu insiro
entre parnteses o tipo de dado para o qual eu
quero convert-la. Lembre-se que acima eu converti
de byte para short e de short para int e isso no
foi necessrio. No entanto, essa converso acima
tambm foi um casting, s que foi um casting implcito.

Quando eu realizo a converso abaixo algo vai dar errado.

Imagine que voc pegasse 10 copos de suco de laranja


e jogasse o cotedo dos 10 copos em uma jarra. Tranquilo,
sem problemas! Agora imagine voc pegando o contedo da
jarra e jogando em apenas um dos copos. Haver uma
perda considervel de suco!

Depois da converso de int para byte abaixo, onde atualmente


o valor de i 1000, o valor de b ser -24! Veja mais abaixo
porque isso acontece.
*/

b = (byte)i;

System.out.println("novo valor de b = "+b);

/*

Sada da impresso:

novo valor de b = -24


*/

/*
O que ocorre que no lugar de o Java lanar uma exceo
ou converter para zero ele retira a parte binria do int
e deixa apenas a do byte e apresenta o que restou.

Observe o esquema abaixo:

i = 1000 em binrio --> 00000000 00000000 00000011 11101000


b = 1000 em binrio --> -------- -------- -------- 11101000

Veja que boa parte do nmero perdido. Se voc pegar o que


sobrou no b e fizer uma converso de binrio para decimal
usando complemento de dois vai chegar ao nmero -24.

Portanto, saiba que o Java vai deixar voc fazer esse tipo
de converso porque ele acha que voc, programador, sabe
que poder perder bits nessa converso!
*/

www.t2ti.com
6
Curso Java Starter

/*
Abaixo simplesmente inserimos o valor do int em um long
que o dobro de um int. Ou seja, sem problemas!
*/
l = i;

System.out.println("valor de l = "+l);
System.out.println("-----------------------------");

/*

Sada da impresso:

valor de l = 1000
-----------------------------
*/

/*
Chegamos aos nmeros com ponto flutuante (casas decimais).
*/
System.out.println("=============================");
System.out.println("ponto flutuante");
System.out.println("=============================");

d = 125.32;
System.out.println("valor de d = " + d);
d = 125.32d;
System.out.println("valor de d = " + d);
d = 125.32f;
System.out.println("valor de d = " + d);

/*
no primeiro caso atribuimos 125.32 variavel d.
sem problemas. funciona legal, como podemos ver
na Sada da impresso.

Logo depois atribuimos 125.32d. Mas pra que serve


esse "d" depois do valor? Indica que estou afirmando
para o Java que a constante (125.32) um double.

Os dois casos acima so idnticos. Como assim? Para


o Java, o tipo padro de um literal com ponto
flutuante double. Portanto, no precisa colocar o
"d" depois do literal se quiser que ela seja double.

literal --> 125.32

Mas o terceiro caso interessante. Atribuimos


varivel d o seguinte valor: 125.32f. Dessa vez estamos
inserindo um float num double. problema nenhum, pois
o float 32 bit e o double 64 bit. Mas, observe a Sada
da impresso. Por que o nmero depois da casa decimal
ficou to quebrado? Investigue e comente na lista.

Sada da impresso:

=============================
ponto flutuante

www.t2ti.com
7
Curso Java Starter

=============================
valor de d = 125.32
valor de d = 125.32
valor de d = 125.31999969482422
*/

f = (float)125.32;
System.out.println("valor de f = " + d);
f = 125.32f;
System.out.println("valor de f = " + d);
f = (float)125.32d;
System.out.println("valor de f = " + d);
System.out.println("-----------------------------");

/*
Mesma coisa que foi feita com o Double, mas dessa
vez com o float.

Logo no primeiro caso j necessrio fazer um casting.


Lembre-se: o tipo padro de um nmero literal em
ponto flutuante double.

No segundo caso nada preciso.

No terceiro caso novamente a presena no casting


j que estamos informando explicitamente que o literal
do tipo double.

bom lembrar que ao converter de double para float


pode haver perda de bits.

Pergunta: por que todos os valores saram to quebrados,


em contraste com o double? Investigue e comente na lista.

Sada da impresso:

valor de f = 125.31999969482422
valor de f = 125.31999969482422
valor de f = 125.31999969482422
-----------------------------
*/

/*
Abordaremos agora o tipo booleano.
*/
System.out.println("=============================");
System.out.println("booleano");
System.out.println("=============================");

bo = true;
System.out.println("valor de bo = " + bo);

bo = (1 > 2);
System.out.println("valor de bo = " + bo);

bo = (f == d);
System.out.println("valor de bo = " + bo);
System.out.println("-----------------------------");

/*

www.t2ti.com
8
Curso Java Starter

O valor true ou false pode ser atribuido sem problemas.

Se atribuirmos uma operao varivel. Essa operao


ser avaliada e seu valor ser armazenado na varivel.
No caso de (1>2) sabemos que o resultado ser false.

Depois testamos se f igual a d. Observe que o operador


de teste de igualdade o == (igual duas vezes), semelhante
linguagem C. Falaremos sobre operadores mais a frente.

Sada da impresso:

=============================
booleano
=============================
valor de bo = true
valor de bo = false
valor de bo = true
-----------------------------
*/

System.out.println("=============================");
System.out.println("brincando com os tipos");
System.out.println("=============================");

System.out.println("posso converter int para float?");


System.out.println("i antes da conversao = " + i);
System.out.println("f antes da conversao = " + f);
f = i;
System.out.println("i depois da conversao = " + i);
System.out.println("f depois da conversao = " + f);

System.out.println("--");

/*
Em nossa primeira "brincadeira" com os tipos tentamos
converter de int para float. Observe atentamente o
resultado na sada de impresso.

Sada de impresso:

=============================
brincando com os tipos
=============================
posso converter int para float?
i antes da conversao = 1000
f antes da conversao = 125.32
i depois da conversao = 1000
f depois da conversao = 1000.0
--
*/

f = (float)d;

System.out.println("posso converter float para int?");


System.out.println("i antes da conversao = " + i);
System.out.println("f antes da conversao = " + f);
i = (int)f;
System.out.println("i depois da conversao = " + i);
System.out.println("f depois da conversao = " + f);
System.out.println("-----------------------------");

www.t2ti.com
9
Curso Java Starter

/*
Depois de nossa primeira "brincadeira" o valor de
f ficou igual ao valor de i. Por isso atribumos o
valor de d novamente varivel f.

Agora o que queremos saber se possvel atribuir


o valor de um float a um inteiro. O contrrio foi
possvel sem casting. Mas dessa vez o casting ser
necessrio. Mas, alm desse detalhe, outra coisa
vai ocorrer. Pode ser desejvel ou no. Comente na
lista o que ocorreu nessa converso de float para int
e em que situao isso seria desejavel.

Sada de impresso:

posso converter float para int?


i antes da conversao = 1000
f antes da conversao = 125.32
i depois da conversao = 125
f depois da conversao = 125.32
-----------------------------
*/
}
}

Pelo que podemos observar no programa anterior, as converses em Java


ocorrem da seguinte maneira, sem perda de informao:

Um byte pode ser convertido em um short, int, long, float ou double

Um short pode ser convertido em um int, long, float ou double

Um char pode ser convertido em um int, long, float ou double

Um int pode ser convertido em um long, float ou double

Um long pode ser convertido em um float ou double

Um float pode ser convertido em um double

Obseve a imagem seguir:

www.t2ti.com
10
Curso Java Starter

J as converses explcitas, o casting, permitido em todos os tipos (exceto o


boolean), mas o programador deve estar ciente que poder haver perda de bits.

Operadores

Os operadores em Java so muito parecidos com os da linguagem C. No


entanto, existe alguns operadores novos. Analise cuidadosamente a tabela abaixo e
faa diversos testes com esses operadores para se acostumar com eles. Durante o
desenvolvimento de seus sistemas voc utilizar, e muito, a maioria desses
operadores.

Grupo = operadores organizados em grupos;


Operador = cada um dos operadores;
Precedncia = ordem de precedncia dos operadores;
A = associatividade do operador (esquerda ou direita);
Operando = operandos do operador;
Descrio = descrio da operao.

Alguns operadores relacionados abaixo no sero comentados agora porque


so utilizados com objetos ou tipos referncias, assunto que ser estudado mais a
frente. Eles esto com a cor da linha diferente. Os demais j podem ser
implementados nos exerccios deste mdulo.
importante frisar que voc deve praticar bastante o uso desses operadores.
Crie uma classe com um mtodo Main, similar a que fizemos no programa anterior e
implemente diversas situaes onde voc possa analisar o uso de cada um dos

www.t2ti.com
11
Curso Java Starter

operadores.
Comente seus resultados e observaes na lista de discusso. Alm disso, se
surgirem dvidas, envie-as para a lista.

Grupo Operador Precedncia A Operando Descrio


acesso a um membro
Delimitador . 1 E objeto,membro
de um objeto ou classe.
acesso ao elemento de
Delimitador [] vetor
um vetor
mtodo, lista de acesso a elemento do
(argumentos)
argumentos vetor
ps-incremento, ps-
aritmtico ++ e -- varivel
decremento
pr-incremento, pr-
aritmtico ++ e -- 2 D varivel
decremento
aritmtico +e- varivel mais e menos unrio
complemento de 1
binrio ~ inteiro
(binrio)
Negao cujo resultado
binrio ! booleana
lgico (true/false)
classe, lista de
classe new 3 D criao de objeto
argumentos
tipo, qualquer
converso (tipo) converso de tipo
coero
multiplicao, diviso e
aritmtico */% 4 E nmero, nmero
mdulo (resto)
aritmtico +- 5 E nmero, nmero adio e subtrao
String + += String, qualquer concatenao
binrio << 6 E inteiro, inteiro desl. a esquerda
deslocamento a direita
binrio >> inteiro, inteiro
com sinal
deslocamento a direita
binrio >>> inteiro, inteiro
com zeros
menor que, menor ou
condicional < <= 7 E nmero, nmero
igual a
maior que, maior ou
condicional > >= nmero, nmero
igual a
condicional instanceof referncia, tipo verificao de tipo

www.t2ti.com
12
Curso Java Starter

condicional == 8 E primitivo,primitivo igualdade de valores


condicional != primitivo,primitivo diferena de valores
referncia, igualdade, endereo
condicional ==
referncia dos objetos
referncia, diferena, endereo de
condicional !=
referncia objetos
binrio & 9 E inteiro, inteiro E sobre bits
booleana,
lgico & E booleano
booleana
binrio ^ 10 E inteiro, inteiro XOR sobre bits
Grupo Operador Precedncia A Operando Descrio
booleana, XOR (OU exclusivo)
lgico ^
booleana booleano
binrio | 11 E inteiro, inteiro OU sobre bits
booleana,
lgico | OU booleano
booleana
booleana,
lgico && 12 E E condicional
booleana
booleana,
lgico || 13 E OU condicional
booleana
booleana, operador ternrio,
condicional ?: 14 D
qualquer condicional
atribuio = 15 D varivel, qualquer atribuio
atribuio com
*= /= %= varivel, qualquer
operao
+= -= <<=
>>= >>>=
&= ^= |=

Em se tratando de precedncia bom lembrar que os parnteses podem ser


usados para modific-la.

2 + 6 * 5 = 32
(2 + 6) * 5 = 40

Controle de Fluxo

O controle de fluxo efetuado atravs do uso de condicionais, que so

www.t2ti.com
13
Curso Java Starter

estruturas que modificam o fluxo de execuo normal do programa.

if-else

Sintaxe:
if (expresso booleana) if (expresso booleana) {
instruo_simples; instrues
} else if (expresso booleana) {
if (expresso booleana) { instrues
instrues } else {
} instrues
}

Quando existe apenas uma instruo aps o if no precisamos abrir um bloco


com as chaves. Se existirem mais instrues a abertura do bloco necessria.
Se houver mais de uma condio usa-se o else como podemos observar na
segunda coluna acima.
Veja o exemplo abaixo e comente o mesmo na lista de discusso.

if ( ano < 0) {
System.out.println("No um ano!");
} else if ( (ano%4==0 && ano%100!=0) || (ano%400==0) ) {
System.out.println(" bissexto!");
} else {
System.out.println("No bissexto!");
}

while e do-while

Sintaxe:
while (expreso booleana) do
{ {
instrues; instrues;
} } while (expreso booleana );

No caso do while as instrues sero executadas enquanto a expresso


booleana for verdadeira.
O do-while executa a instruo pelo menos uma vez e continua executando
enquanto a expresso booleana for verdadeira.

Observe os exemplos seguintes.

www.t2ti.com
14
Curso Java Starter

//exemplo com while


int x = 0;
while (x < 10) {
System.out.println ("item " + x);
x++;
}

//exemplo com do-while


int x = 0;
do {
System.out.println ("item " + x);
x++;
} while (x < 10);

//esse um lao infinito. Pra que ele serve?


while ( true ) {
if (obj.z == 0) {
break;
}
}

for

Sintaxe:
for ( inicializao; for ( inicializao;
expresses booleanas; expresses booleanas;
passo da repetio ) passo da repetio )
instruo_simples; {
instrues;
}

O for pode conter apenas uma instruo no seu corpo. Neste caso no
necessrio abrir um bloco. Isso assim porque o for j implementa alguns comandos
na sua assinatura, ou seja, no seu cabealho, como a inicializao da varivel e o
passo da repetio, ou seja, o incremento/decremento da varivel.
Veja os exemplos:

//esse t bem fcil.


for ( int x = 0; x < 10; x++ ) {
System.out.println ("item " + x);
}

//esse j no to simples s de olhar.


for ( int x = 0, int y = 25; x < 10 && (y % 2 == 0); x++, y = y - 1 ) {
System.out.println (x + y);
}

//tambm podemos fazer um lao infinito com o for


for ( ; ; ) {
if (obj.z == 0) {
break;
}
}

www.t2ti.com
15
Curso Java Starter

break e continue

Voc deve ter observado que quando fizemos os laos infinitos com o while e
com o for utilizamos um comando break. Para que ele serve? Este comando serve
para quebrar o lao, ou seja, ele far com que o lao seja interrompido.
O comando continue tambm influi dentro de um lao. Mas ele no vai quebrar
o lao. Ele interrompe aquela iterao do lao e reinicia o bloco com a prxima
iterao.

Rtulos (break e continue)

E se tivermos com um lao dentro de outro e quisermos quebrar o lao mais


externo? O break ou continue agem no lao mais interno. Existe uma maneira: rotular
nossos laos. Observe a imagem a seguir:

www.t2ti.com
16
Curso Java Starter

switch (case)

Sintaxe:

switch(seletor_inteiro) { switch(letra) {
case valor_inteiro_1 : case 'A' :
instrues; System.out.println("A");
break; break;
case valor_inteiro_2 : case 'B' :
instrues; System.out.println("B");
break; break;
... ...
default: default:
instrues; System.out.println("?");
} }

Switch s trabalha com valores inteiros, incluindo o char.

Palavras Reservadas

Toda linguagem possui palavras reservadas e isso no seria diferente em Java.


Uma verso mais recente do Java pode ter mais palavras reservadas que uma
anterior. A seguir voc pode ver uma imagem com boa parte das palavras reservadas
em Java. Pesquise e descubra quais palavras reservadas no esto na lista abaixo.
Comente na lista.

www.t2ti.com
17
Curso Java Starter

Tente utilizar algumas dessas palavras como nome de variveis e veja como o
compilador Java se comporta.
Voc deve ter percebido que no utilizamos um tipo String neste mdulo. O
Java possui um tipo String, no entanto, String no Java no um tipo primitivo.
Falaremos sobre String em um mdulo posterior.

Entrada de Dados

Como eu fao para ler algo que o usurio digita no prompt?


Observe o programa abaixo:

//importe a classe Scanner para utilizar a leitura pelo teclado


//Similar ao #include do C
import java.util.Scanner;

public class Leitura {

public static void main(String[] args) {


// crie a varivel de leitura dos dados
Scanner s = new Scanner(System.in);
// use os mtodos de leitura especficos do tipo desejado
System.out.print("digite uma linha: ");
String linha = s.nextLine(); // le a linha
System.out.print("digite um numero: ");
int i = s.nextInt(); // le um inteiro
System.out.print("digite um numero: ");
double d = s.nextDouble(); // le um ponto-flutuante
}

Com o estudo do programa acima j d para voc solicitar que o usurio digite
alguma coisa e utilizar o que o mesmo est digitando.

www.t2ti.com
18
Curso Java Starter

Vamos aos to aguardados exerccios.

Exerccios
Aprenda com quem tambm est aprendendo, veja e compartilhe as suas respostas
no nosso Frum:

Exerccios Mdulo 02 Tipos Primitivos, Operadores e Controle de Fluxo

01 - Escreva um programa que imprima o resultado das expresses abaixo:


321+2+1+3
2x34x5
2+63/7x9
3 % 4 8

02 - Escreva um programa que declare, inicialize e imprima as seguintes


variveis:
Inteiro i de 32 bits com valor 1
Inteiro j de 64 bits com valor 2
Ponto-flutuante p de 32 bits com valor 20.0
Ponto-flutuante q de 64 bits com valor 30.0
Boolean b com valor verdadeiro
Caracter c com valor k

03 - Implemente um programa que recebe um nmero de 1 a 7 e imprime o


dia da semana correspondente.

04 - Altere o programa do exerccio anterior para ficar recebendo o nmero


dentro de um lao enquanto o nmero for diferente de 0 (zero).

05 - Implemente um programa que recebe repetidamente um nmero de 1 a


12, enquanto esse nmero for diferente de 0 (zero), e imprime o ms correspondente.
Quando o nmero estiver fora do intervalo permitido, a mensagem ms invlido
dever ser exibida.

06 - Escreva um lao while que execute 20 vezes, imprimindo o valor da


varivel x que inicialmente est com valor 10. Converta este lao para um do-while.

07 - Escreva um programa que imprima na tela a soma dos nmeros mpares


entre 1 e 30 e a multiplicao dos nmeros pares entre 1 e 30.

08 - Escreva um programa que percorra dois laos de 0 a 10, um interno ao


outro, imprimindo os contadores, e quando estes forem iguais, o programa deve
passar prxima interao do lao mais externo, caso contrrio, deve imprimir os
valores dos contadores dos dois laos.

09 - Desenvolva um programa que solicita ao usurio um nmero inteiro de no


mximo 4 dgitos. Inverta esse nmero.

10 Desenvolva um programa que dado um nmero inteiro o programa


informe se o mesmo um nmero primo.

www.t2ti.com
19
Curso Java Starter

11 - Escreva um programa em Java que calcula e imprime na tela o salrio


proporcional de um funcionrio que trabalhou apenas N dias num ms de 22 dias
teis. O nmero de dias trabalhados bem como o salrio integral do funcionrio
devem ser lidos do teclado. O resultado deve ser um nmero ponto-flutuante.

12 - Escreva um programa em Java que leia repetidamente um nmero do


teclado at que seja digitado o nmero zero (0) e determine se o nmero lido
perfeito ou no, imprimindo o resultado. Um nmero dito perfeito quando igual a
soma dos seus divisores menores do que ele, por exemplo, 6 perfeito, uma vez que
6 = 3 + 2 + 1.

13 Faa um programa que contenha um menu com 4 opes:


1 calcular o fatorial de um nmero dado
2 calcular a raiz quadrada de 3 nmeros dados
3 imprimir a tabuada completa de 1 a 10
4 sair do programa

14 - Escreva quatro instrues em Java diferentes para adicionar 1 a uma


varivel inteira x.

15 - Escreva instrues Java para realizar a seguinte tarefa: atribuir soma de


x e y a z e incrementar x por 1 depois do calculo. Use somente uma instruo;

16 - Escreva instrues Java para realizar a seguinte tarefa: decrementar a


varivel x por 1, depois subtrair o resultado da varivel total com somente uma
instruo.

17 - Implemente um programa para calcular a rea de um trapzio, onde:


h = altura
b = base menor
B = base maior
rea = (h.(b+B))/2

18 - Fulano aplicou R$ 100,00 com rendimento de 5% ao ms. Quantos meses


sero necessrios para o capital investido ultrapasse a R$ 200,00. Desenvolva um
programa que realize essa operao.

19 Faa um programa que imprima os quadrados dos nmeros inteiros


mpares entre 15 e 35.

www.t2ti.com
20
Curso Java Starter

20 - Escreva um aplicativo que imprime as seguintes formas. Voc pode


utilizar instrues de sada que imprimem um nico asterisco (*), um nico caractere
de espao ou uma nova linha. Maximize a utilizao de estruturas de repetio(com
estruturas aninhadas for) e minimize o nmero de instrues de sada.

* ******** ******** *
** ******* ******* **
*** ****** ****** ***
**** ***** ***** ****
***** **** **** *****
****** *** *** ******
******* ** ** *******
******** * * ********

www.t2ti.com
21
Curso Java Starter

Mdulo

03
Arrays e
entrada de dados

Introduo

Antes de iniciarmos vale relembrar que o seu aprendizado depende muito


da qualidade do seu estudo, com isto ns queremos dizer que: Os exerccios so
parte importante da sedimentao do seu conhecimento.
Durante o texto as palavras array e vetores sero utilizadas sempre com o
mesmo significado (estruturas de dados seqenciais).
Uma coleo nada mais do que um conjunto de elementos contidos em
uma nica estrutura em Java um objeto cuja funo oferecer meios de
armazenar, disponibilizar, remover, localizar e percorrer o seu contedo.
Colees so estruturas de dados que agrupam elementos que formam um
grupo natural como por exemplo: baralho (conjunto de cartas), time (conjunto de
jogadores), turma (conjunto de alunos) e etc.
A seguir conceituaremos superficialmente1 os tipos de colees mais
comuns:

Vetor: formado por um grupo de elementos acessados atravs do seu


ndice;
Pilha: Estrutura de dados onde o ltimo elemento a ser inserido na coleo
o primeiro a ser retirado (Baseado no princpio LIFO, Last in, first out);
Fila: Coleo onde a ordem de insero representa a ordem de sada dos
elementos (Baseado no princpio FIFO, First in, first out);
rvores: Estrutura de dados que garante a ordenao dos elementos que a
compe;

1Para saber saber mais sobre estruturas de dados visite: http://pt.wikipedia.org/wiki/Estrutura_de_dados

www.t2ti.com
3
Curso Java Starter

Cada uma das estruturas de dados apresentadas possui caractersticas que


as diferenciam quanto a:

Eficincia de busca;
Eficincia de insero;
Organizao;
Ordenao;
Forma de acesso;
Forma de busca e;
Forma de insero.

Arrays unidimensionais:

A forma mais eficiente de trabalhar com colees de elementos em Java


atravs da construo de vetores (arrays). Em Java, arrays so objetos que
armazenam mltiplas variveis do mesmo tipo ou do mesmo sub-tipo (sub-tipo? No
se preocupe por enquanto com isto).
Observe que apesar da sua eficincia, normalmente, para armazenar dados
ns utilizamos estruturas de dados mais flexveis j existentes na linguagem, mais
especificamente, no Framework Collections (assunto a ser abordado em mais detalhes
durante este curso) ao invs de arrays.
Um array um objeto que armazena um nmero pr-definido de
elementos, isto , o seu tamanho definido no momento da sua construo. Seus
elementos so acessados atravs de ndices que iniciam-se sempre por 0 (zero), ou
seja, um array de tamanho quatro ter ndices 0, 1, 2 e 3.
Em Java existem diversas formas de declarar, construir e inicializar arrays e
a melhor forma de utilizar estas estruturas de dados conhecendo como so
realizadas cada uma destas etapas.
A seguir apresentaremos cada uma destas etapas e a forma como elas
acontecem na prtica:

1. Declarao: Etapa em que a referncia do array declarada;

2. Construo: Aqui definido o tamanho e instanciado o array;

3. Inicializao: Os elementos so inseridos no array.

www.t2ti.com
4
Curso Java Starter

Abaixo temos um exemplo com todas as etapas bem definidas:

1. int[] jogoSena; //Declarao


2.
3. jogoSena = new int[6]; //Criao
4.
5. jogoSena[0] = 23; //Inicializao da posio 0
6. jogoSena[1] = 12; //Inicializao da posio 1
7. jogoSena[2] = 55; //Inicializao da posio 2
8. jogoSena[3] = 02; //Inicializao da posio 3
9. jogoSena[4] = 07; //Inicializao da posio 4
10.jogoSena[5] = 19; //Inicializao da posio 5

Neste caso estamos criando um vetor de inteiros (int), perceba que a


declarao da varivel ocorre na linha 1, na seqencia temos a criao do vetor
(linha 3) e por ltimo a inicializao de cada uma das suas posies.
Existem formas mais enxutas de efetuarmos as mesmas etapas mostradas
no exemplo anterior. Podemos declarar, construir e inicializar em apenas uma linha da
seguinte forma:
int[] outroJogoSena = {23, 12, 55, 02, 07, 19};

No exemplo acima, acontecem quatro coisas em apenas uma linha:

I. Declarao de uma referncia a um array de inteiros chamado


outroJogoSena;
II. Criao de um array com seis posies;
III.Inicializao das posies com os valores 23, 12, 55, 02, 07 e 19;
IV. Atribuio do novo objeto (array) a referncia outroJogoSena;

O outro atalho que a linguagem Java nos permite o seguinte:

int[] outroJogoSena = new int[]{23, 12, 55, 02, 07, 19};

Em ambos os casos todas as etapas continuam sendo executadas


(declarao, construo e inicializao).
Certo, mas qual o tamanho destes arrays? Quando criamos arrays desta
maneira a quantidade mxima de elementos que o array ir armazenar ser igual a
quantidade de elementos com que ele foi inicializado, isto , em ambos os casos os
arrays seriam suficientes para armazenar at 6 elementos. Caso haja necessidade de

www.t2ti.com
5
Curso Java Starter

mais espao um novo array deve ser construdo.


Para conhecer o tamanho total de um array basta voc acessar o atributo
length. Este atributo retorna um valor inteiro (int) que indica qual a capacidade
mxima de armazenamento deste array.
Lembretes:
Primeira posio (ndice): de qualquer array sempre 0;
ltima posio (ndice): sempre o seu tamanho 1 (length - 1).

Exerccio Resolvido

Implemente a lgica para realizao de saques em um caixa eletrnico


considerando que o mesmo armazena cdulas de R$100,00, R$50,00, R$20,00, R
$10,00, R$5,00, R$2,00 e R$1,00 e devem ser entregues ao cliente o menor
nmero possvel de cdulas.

public class CaixaEletronico {


public static void main(String[] args) {
//Cedulas disponiveis no caixa eletronico
int[] cedulas = {100, 50, 20, 10, 5, 2, 1};
//Quantidade total de cedulas entregues ao cliente
int quantidadeTotal = 0;
//valor a ser sacado pelo cliente
int valorReais = 163;
//Percorrendo todas as cedulas disponiveis no caixa eletronico
for(int i = 0; i < cedulas.length; i++)
{
//Quantidade de cedulas para o valor cedulas[i]
int quantidadeCedulas = valorReais/cedulas[i];
//Impressao da quantidade de cedulas
System.out.println("Quantidadde de cedulas de "+ cedulas[i] +
": " +quantidadeCedulas );
//Resto da divisao
valorReais %= cedulas[i];
//Quantidade total de cedulas entregues ao cliente
quantidadeTotal += quantidadeCedulas;
}
//Impressao
System.out.println("Quantidade total: "+quantidadeTotal);
}
}

Resultado obtido durante a execuo deste cdigo:

Quantidadde de cedulas de 100: 1


Quantidadde de cedulas de 50: 1
Quantidadde de cedulas de 20: 0
Quantidadde de cedulas de 10: 1
Quantidadde de cedulas de 5: 0
Quantidadde de cedulas de 2: 1
Quantidadde de cedulas de 1: 1
Quantidade total: 5

www.t2ti.com
6
Curso Java Starter

Exerccio Resolvido

Implemente um algoritmo que ordene um array com 10 nmeros inteiros. O


algoritmo deve efetuar uma comparao de cada elemento com o seu sucessor e se a
ordem no for crescente os elementos devem ter suas posies trocadas, este
processo deve se repetir at que o array esteja ordenado.

public class OrdenarArray {


public static void main(String[] args) {
int[] arrayInteiros = {55, 27, 33, 45, 92, 100, 3, 8, 11, 70};
boolean estaOrdenado = false;
while(!estaOrdenado)
{
estaOrdenado = true;
for(int i = 1; i < arrayInteiros.length; i++)
{
if(arrayInteiros[i-1] > arrayInteiros[i])
{
estaOrdenado = false;
int aux = arrayInteiros[i];
arrayInteiros[i] = arrayInteiros[i-1];
arrayInteiros[i-1] = aux;
System.out. println("Ordem atual: "+
arrayInteiros[0]+ " " + arrayInteiros[1]+" "+
arrayInteiros[2]+ " " + arrayInteiros[3]+" "+
arrayInteiros[4]+ " " + arrayInteiros[5]+" "+
arrayInteiros[6]+ " " + arrayInteiros[7]+" "+
arrayInteiros[8]+ " " + arrayInteiros[9]);
}
}
}
}
}

Resultado da execuo deste cdigo:

Ordem atual: 27 55 33 45 92 100 3 8 11 70


Ordem atual: 27 33 55 45 92 100 3 8 11 70
Ordem atual: 27 33 45 55 92 100 3 8 11 70
Ordem atual: 27 33 45 55 92 3 100 8 11 70
Ordem atual: 27 33 45 55 92 3 8 100 11 70
Ordem atual: 27 33 45 55 92 3 8 11 100 70
Ordem atual: 27 33 45 55 92 3 8 11 70 100
Ordem atual: 27 33 45 55 3 92 8 11 70 100
Ordem atual: 27 33 45 55 3 8 92 11 70 100
Ordem atual: 27 33 45 55 3 8 11 92 70 100
Ordem atual: 27 33 45 55 3 8 11 70 92 100
Ordem atual: 27 33 45 3 55 8 11 70 92 100
Ordem atual: 27 33 45 3 8 55 11 70 92 100
Ordem atual: 27 33 45 3 8 11 55 70 92 100
Ordem atual: 27 33 3 45 8 11 55 70 92 100
Ordem atual: 27 33 3 8 45 11 55 70 92 100
Ordem atual: 27 33 3 8 11 45 55 70 92 100
Ordem atual: 27 3 33 8 11 45 55 70 92 100
Ordem atual: 27 3 8 33 11 45 55 70 92 100
Ordem atual: 27 3 8 11 33 45 55 70 92 100

www.t2ti.com
7
Curso Java Starter

Ordem atual: 3 27 8 11 33 45 55 70 92 100


Ordem atual: 3 8 27 11 33 45 55 70 92 100
Ordem atual: 3 8 11 27 33 45 55 70 92 100

Arrays Multi-dimensionais

Arrays unidimensionais so estruturas de dados bastante simples. Uma


estrutura um pouco mais complexa so os arrays multi-dimensionais ou n-
dimensionais.
A funo destes arrays a mesma dos seus irmos unidimensionais porm
arrays multi-dimensionais permitem a construo de estruturas de dados mais ricas.
No caso de arrays multi-dimensionais a declarao, construo e
inicializao realizada conforme exemplos a seguir, observe que os trechos de
cdigos so substituveis entre si, isto , equivalentes:

Java permite a construo de arrays com qualquer nmero de dimenses,


contudo dificilmente encontram-se arrays com mais de trs dimenses.

Exerccio Resolvido

Implemente um programa que construa uma matriz de double 4x4 e para


cada clula atribua o valor correspondente a i*j.

www.t2ti.com
8
Curso Java Starter

Resoluo:
1. A matriz ser de double;

2. A classe dever manipular um array bidimensional;

3. O valor de cada clula corresponder ao valor dos respectivos ndices


multiplicados.

public class Matriz


{
public static void main(String[] args)
{
double matriz[][] = new double[4][4];//declaracao e construcao da matriz
for(int i = 0; i < matriz.length; i++)//percorre a matriz no eixo i
{
for(int j = 0; j < matriz[i].length; j++)//percorre a matriz no eixo j
{
matriz[i][j] = i*j;//atribui o valor a celula
}
}

for(int i = 0; i < matriz.length; i++) //percorre a matriz no eixo i


{
for(int j = 0; j < matriz[i].length; j++) //percorre a matriz no eixo j
{
//imprime o resultado
System.out.println("Valor da posio ["+i+","+j+"]: "+
matriz[i][j]);
}
}
}
}

Sada console:

Valor da posio [0,0]: 0.0


Valor da posio [0,1]: 0.0
Valor da posio [0,2]: 0.0
Valor da posio [0,3]: 0.0
Valor da posio [1,0]: 0.0
Valor da posio [1,1]: 1.0
Valor da posio [1,2]: 2.0
Valor da posio [1,3]: 3.0
Valor da posio [2,0]: 0.0
Valor da posio [2,1]: 2.0
Valor da posio [2,2]: 4.0
Valor da posio [2,3]: 6.0
Valor da posio [3,0]: 0.0
Valor da posio [3,1]: 3.0
Valor da posio [3,2]: 6.0
Valor da posio [3,3]: 9.0

Manipulando vetores utilizando a classe Arrays

A classe Arrays, disponvel no pacote java.util, fornece uma grande

www.t2ti.com
9
Curso Java Starter

quantidade de mtodos utilitrios, como por exemplo mtodos para ordenao,


procura, comparao e etc.. Estes mtodos so muito teis quando manipulamos
arrays. A seguir sero apresentados os principais mtodos e a as respectivas
funcionalidades oferecidas.

Ordenao: Realizada utilizando-se o mtodo sort cujo parmetro o vetor


a ser ordenado;
Pesquisa: A localizao de um determinado elemento em um array realizada
utilizando-se o mtodo binarySearch que retorna a posio que o elemento foi
encontrado no array. Caso o elemento no seja encontrado retorna um valor
negativo;
Preenchimento: Utilizando-se o mtodo fill da classe utilitria Arrays
possvel preencher um determinado array com o elemento desejado;
Comparao: Dados dois arrays o mtodo equals compara valor a valor e
retorna true se os vetores so idnticos em valores e ndices.

Agora que conhecemos, superficialmente, a forma como a classe Arrays


fornece mtodos utilitrios vamos ver na prtica como algumas destas funcionalidades
so utilizadas.

Exerccio Resolvido - Ordenao

Implemente um programa que construa um array de inteiros (int) de


tamanho 10.000 com valores atribudos da seguinte forma, cada posio do array
conter o resultado da operao 10.000 ndice da posio, isto , a posio 0 ter o
valor 10.000, a posio 1 ter o valor 9.999 e assim por diante. Ordene utilizando o
algoritmo de ordenao implementado no exerccio resolvido pag. 6 e na seqencia
utilizando a classe utilitria Arrays. Compare os tempos de ordenao.

import java.util.Arrays;

public class OrdenacaoArray {

public static void main(String[] args)


{
//Criacao do array de 10.000 posicoes
int[] arrayInteiros = new int[10000];
//Atribuindo os valores a cada posicao
for(int i = 10000; i > 0; i--)
{
arrayInteiros[arrayInteiros.length - i] = i;

www.t2ti.com
10
Curso Java Starter

}
//inicio do algoritmo de ordenacao - implementado
boolean estaOrdenado = false;
//armazena o tempo de inicio da ordenacao
long inicio = System.currentTimeMillis();
while(!estaOrdenado)
{
estaOrdenado = true;
for(int i = 1; i < arrayInteiros.length; i++)
{
if(arrayInteiros[i-1] > arrayInteiros[i])
{
estaOrdenado = false;
int aux = arrayInteiros[i];
arrayInteiros[i] = arrayInteiros[i-1];
arrayInteiros[i-1] = aux;
}
}
}
//armazena o tempo fim da ordenacao
long fim = System.currentTimeMillis();
//Imprime o tempo total de ordenacao
System.out.println("Tempo ordenar 1: "+(fim-inicio)+" ms");
//Atribuindo os valores a cada posicao
for(int i = 10000; i > 0; i--)
{
arrayInteiros[arrayInteiros.length - i] = i;
}
//armazena o tempo de inicio da ordenacao
inicio = System.currentTimeMillis();
//Ordena utilizando a classe Arrays
Arrays.sort(arrayInteiros);
//armazena o tempo fim da ordenacao
fim = System.currentTimeMillis();
//Imprime o tempo total de ordenacao
System.out.println("Tempo ordenar 2: "+(fim-inicio)+" ms");
}

Resultado da execuo:
Tempo ordenar 1: 1013 ms
Tempo ordenar 2: 9 ms

O resultado desta execuo mostra que o mtodo de ordenao


implementado pela classe Arrays foi, aproximadamente, 100 vezes mais eficiente que
a implementao feita no exerccio referenciado.
Exerccio Resolvido - Pesquisa

Implemente um programa que construa um array de inteiros (int) de


tamanho 1.000.000 com valores atribudos de acordo com o seu ndice, procure o
valor 555.000, entre os valores armazenados no vetor. Compare o tempo gasto
utilizando o mtodo binarySearch da classe Arrays e uma procura simples
percorrendo todos os elementos do array at encontrar o valor desejado.

import java.util.Arrays;
public class PesquisarArray {
public static void main(String[] args) {
//Criacao do array de 1.000.000 de posicoes
int[] numerosInteiros = new int[1000000];

www.t2ti.com
11
Curso Java Starter

//Definicao do numero a ser pesquisado


int numeroPesquisado = 555000;
//Preenchimento do Array
for(int i = 0; i < 1000000; i++)
numerosInteiros[i] = i;
//Inicio da contagem do tempo
long inicio = System.currentTimeMillis();
//Percorrendo o array em busca do numero
for(int i = 0; i < 1000000; i++)
{
if(numerosInteiros[i] == numeroPesquisado)
break;
}
//fim da contagem do tempo
long fim = System.currentTimeMillis();
//Imprime o tempo total de pesquisa
System.out.println("Pesquisa 1: "+(fim-inicio)+" ms");
//Inicia a contagem do tempo
inicio = System.currentTimeMillis();
//Faz a pesquisa utilizando a classe Arrays
Arrays.binarySearch(numerosInteiros, numeroPesquisado);
//Fim da contagem do tempo
fim = System.currentTimeMillis();
//Imprime o tempo total de pesquisa
System.out.println("Pesquisa 2: "+(fim-inicio)+" ms");
}
}

Possvel sada no console:

Pesquisa 1: 94 ms
Pesquisa 2: 1 ms

Como era esperado, a pesquisa utilizando a classe Arrays foi muito mais
eficiente que a pesquisa percorrendo todos os elementos.

Entrada de dados linha de comando

Da mesma forma que outras linguagens de programao, em Java


possvel passar argumentos atravs da linha de comando. Nestes casos ns
invocamos o interpretador e na seqencia passamos os parmetros para nossa
aplicao.

No exemplo a seguir a classe Teste est recebendo 3 parmetros (param1,


param2 e param3) durante a execuo.

www.t2ti.com
12
Curso Java Starter

Estes parmetros so recebidos atravs do mtodo main. Observe abaixo a


assinatura do mtodo, os parmetros so agrupados em um vetor de String, ou seja,
uma das portas de entrada de informao externa para programas Java o prprio
mtodo main.

public static void main(String[] args)

importante compreender que todos os parmetros so recebidos pelo


mtodo main como String, para serem tratados como nmeros eles devem ser
convertidos, esta converso ser abordada no Mdulo 7.

Exerccio Resolvido

Implemente um programa Java que imprima e conte quantos parmetros


foram passados durante a sua interpretao, execute este programa passando 6
parmetros quaisquer e , aps, execute novamente sem passar parmetros.

www.t2ti.com
13
Curso Java Starter

public class mainParametros {


public static void main(String[] parametros) {
if(parametros != null)
{
System.out.println("Foram passados: "+parametros.length+" parametros");
for(int i = 0; i < parametros.length; i++)
System.out.println("parametro "+i+": "+parametros[i]);
}
}
}

Abaixo temos a imagem com a execuo deste programa, primeiro foram


passados 6 parmetros e na seqencia nenhum.

Agora ns j sabemos como enviar parmetros atravs do prompt de duas


formas, uma atravs do mtodo main e outra, apresentada no Mdulo 4, atravs do
uso de um Scanner. Mas ns podemos fazer estas mesmas funes de forma um
pouco mais elaborada utilizando interfaces grficas. A prxima seo ir descrever
como isto pode ser realizado.

www.t2ti.com
14
Curso Java Starter

Entrada de dados interface grfica

Aqui ns iremos utilizar a biblioteca Swing que responsvel pela gerao


dos artefatos grficos em Java mas ns no iremos nos aprofundar nesta biblioteca
pois este assunto ser abordado em um mdulo dedicado apenas a isto.
A entrada de dados utilizando prompt pode, dependendo da situao, deixar
o seu programa menos palatvel para usurios iniciantes. Para evitar esta situao
podemos efetuar a entrada de dados utilizando a classe JOptionPane.
A classe JOptionPane torna simples a implementao de dilogos que
solicitam a entrada de dados ou mesmo apenas informam alguma coisa. Os principais
mtodos desta classe esto relacionados a seguir.

Mtodo Descrio
showConfirmDialog Utilizado para confirmaes, dilogos cuja resposta seja do tipo
sim, no ou cancela.
showInputDialog Utilizado para entrada de dados pelo usurio.
showMessageDialog Informa ao usurio alguma coisa
showOptionDialog Uma mistura dos trs outros mtodos, ou seja, pode ser
utilizado para informar, para entrada de dados e ainda
confirmaes.

Vamos ao exemplo prtico para melhor compreenso, neste exemplo sero


utilizados os mtodos showInputDialog e showMessageDialog.

//Importando classe do Swing


import javax.swing.JOptionPane;

public class Dialogo {


public static void main(String[] args) {
String nome;
//Este comando mostra um dialogo que solicita entrada de dados
nome = JOptionPane.showInputDialog("Digite o seu nome: ");
String mensagem = nome+" est fazendo o curso Java Iniciante";
//Este comando mostra um dialogo que apenas exibe a mensagem
JOptionPane.showMessageDialog(null, mensagem);
}
}

A seguir temos as telas demonstrando a execuo deste programa no


prompt.

www.t2ti.com
15
Curso Java Starter

Entrada de dados no dilogo.

Exibio da mensagem de concluso do programa.

www.t2ti.com
16
Curso Java Starter

Exerccios

Aprenda com quem tambm est aprendendo, veja e compartilhe as suas


respostas no nosso Frum:
Exerccios Mdulo 03 Vetores (Arrays) e Entrada de Dados

1) Crie um programa que percorra um array de 10 posies e imprima o seu


contedo.
2) Escreva um programa que some todos os valores contidos em um array de
inteiros e calcule a mdia.
3) Desenvolva um programa que dado um array de 10 nmeros inteiros
multiplique o primeiro elemento pelo seguinte, o resultado deve ento ser
multiplicado pelo prximo elemento at que todos os elementos sejam
percorridos. Imprima o valor final.
4) Faa um programa que inverta as posies de um array com 10 elementos.
5) Dados dois vetores quaisquer de booleanos compare-os e informe se ambos so
idnticos, para serem idnticos os vetores devem possuir o mesmo tamanho e
os mesmos elementos em cada posio.
6) Faa um programa que calcule o produto escalar de dois vetores de double, isto
, multiplique cada elemento pelo seu respectivo no outro vetor e some os
resultados.
7) Utilizando a classe Scanner, j apresentada em mdulos anteriores, faa um
programa que permita o usurio efetuar a entrada de 10 nmeros quaisquer.
Ordene estes nmeros utilizando a classe Arrays e imprima o resultado.
8) Faa um programa que receba um parmetro qualquer atravs do mtodo main
e informe ao usurio atravs de uma caixa de dilogo qual foi o parmetro
passado.
9) Crie um programa que mostre um dilogo, informando que no existem
parmetros, caso no seja passado nenhum parmetro atravs da linha de
comando.
10)Utilizando a classe Scanner faa um programa que solicite a entrada de 10
nmeros inteiros, logo aps solicite a entrada de mais 5 nmeros inteiros
compare os nmeros obtidos e verifique se o segundo vetor est contido dentro

www.t2ti.com
17
Curso Java Starter

do primeiro.
11)Utilizando a classe Scanner faa um programa que solicite a entrada de 10
nmeros inteiros, verifique a freqncia de ocorrncia de cada nmero no vetor.
12)Crie um programa que receba como parmetro de entrada 16 valores, coloque
os em uma matriz 4x4 e faa a transposio dos valores.
13)Desenvolva um programa que receba 10 parmetros por linha de comando,
inverta todas as posies e imprima o resultado.
14)Desenvolva um programa, utilizando a classe Scanner, que obtenha 10 valores
de entrada e verifique se eles formam uma progresso aritmtica.
15)Desenvolva um programa, utilizando a classe Scanner, que obtenha 10 valores
de entrada e identifique o maior valor, o menor e a diferena entre os valores.
16)Faa um algoritmo para ordenar um vetor da seguinte forma, o algoritmo
identifica o maior valor e o coloca na ltima posio livre de um outro vetor. Na
prxima iterao este valor descartado, repetindo at no sobrarem mais
valores.

www.t2ti.com
18
Curso Java Starter

Mdulo
Orientao a Objetos
04 Classes, Objetos e
Encapsulamento

Introduo

Apesar de no termos sido apresentados formalmente, j estamos


utilizando orientao a objetos nos programas que fizemos at agora, pois algumas
das classes e tipos que utilizamos so verdadeiramente objetos. claro que no
estamos fazendo isto da forma correta ou melhor forma.
Mas porque Programao Orientada a Objetos ao invs da tradicional
Programao Estruturada?
Antes de conhecermos a resposta devemos compreender que em algum
momento o cdigo Orientado a Objetos utiliza-se do paradigma Estruturado, a grande
diferena a forma como a aplicao idealizada.
Um paradigma de programao, seja ele Estruturado ou Orientado a
Objetos a forma como a soluo para um determinado problema desenvolvida. Por
exemplo, em Orientao a Objetos os problemas so resolvidos pensando-se em
interaes entre diferentes objetos, j no paradigma Estruturado procura-se resolver
os problemas decompondo-os em funes e dados que somados formaro um
programa.
Retornando a nossa pergunta, durante muito tempo a programao
Estruturada foi o paradigma mais difundido porm, a medida que os programas foram
tornando-se mais complexos, surgiu a necessidade de resolver os problemas de uma
maneira diferente. Neste contexto surge o paradigma da Programao Orientada a
Objetos.
Em Orientao a Objetos os dados e as operaes que sero realizadas
sobre estes formam um conjunto nico (objeto), e a resoluo de um problema
dada em termos de interaes realizadas entre estes objetos.
Dizemos que um objeto encapsula a lgica de negcios, concentrando a
responsabilidade em pontos nicos do sistema, viabilizando um maior reuso do cdigo
pela modularidade desta abordagem.

www.t2ti.com
3
Curso Java Starter

Benefcios da abordagem orientada a objetos:

Modularidade: Uma vez criado um objeto pode ser passado por todo o
sistema;
Encapsulamento: Detalhes de implementao ficam ocultos
externamente ao objeto;
Reuso: Uma vez criado um objeto pode ser utilizado em outros
programas;
Manutenibilidade: Manuteno realizada em pontos especficos do
seu programa (objetos).

Classes e Objetos

Objetos so coisas que temos no mundo real e abstramos no mundo


virtual para que possamos manipul-los na resoluo de problemas. Um objeto no
mundo real sempre possui estado e comportamento, isto , ele possui caractersticas
e aes que so pertinentes a sua natureza. Para clarificar nada melhor do que alguns
exemplos:

Objeto Estado Comportamento


Pessoa Nome, idade, RG Falar, andar, cumprimentar
Cachorro Nome, raa Latir, correr
Conta bancria Saldo, agncia, nmero Creditar, debitar
Carro Cor, marca, modelo Acelerar, frear, abastecer

Observe que estado e comportamento, respectivamente, so transformados


em dados e procedimentos quando programamos de forma estruturada e atributos
e mtodos quando utilizamos orientao a objetos.
Algum pode perguntar: Legal, mas eu sou uma pessoa e possuo mais
atributos (estado) do que os que foram apresentados! Cad o restante (peso, altura e
etc.)? Certamente, todos os objetos apresentados possuem estado e comportamento
muito mais complexos do que os apresentados, no entanto, iremos criar um modelo
para apenas aquilo o que nos interessa, ou melhor, interessa a resoluo do problema.
Seu programa no deve ter nada mais do que o necessrio, fuja dos Sistemas

www.t2ti.com
4
Curso Java Starter

Mundo - no meu trabalho utilizamos esta expresso para identificar sistemas cujo
escopo no est bem definido (limitado) que so interminveis.
Objetos so oriundos (instncias) das classes. Uma classe uma
especificao para um determinado tipo de objeto, isto , para que o objeto seja de
determinada classe ele, obrigatoriamente, ter que respeitar a especificao. Por
exemplo, vamos especificar que todo documento deve possuir, ao menos, foto, cdigo,
nome e data de nascimento.
Agora vamos criar um documento para o Alfredo e um para a Juliana:

Documento Documento 1 Documento 2


Foto: Img1.png Img4.png
Cdigo: 123456 789012
Nome: Alfredo Juliana
Data de nascimento: 20/05/1990 30/09/1987

Perceba que, nesta tabela a coluna Documento define a classe


(especificao) enqanto as colunas Documento 1 e Documento 2 so os objetos
desta forma, cada documento particular ter um valor diferente para os atributos
definidos na especificao. A compreenso desta diferena, entre classes e objetos,
parte fundamental do paradigma orientado a objetos.
Esta especificao em Java poderia ser da seguinte forma:

class Documento {

//Estado
String foto; //Nome do arquivo de imagem
String nome; //Nome da pessoa
Integer codigo; //Codigo deste documento
String dataNascimento; //Data de nascimento

Perceba que ns acabamos de definir um novo tipo, Documento, e


especificamos que para um objeto ser deste tipo ele deve necessariamente ter os
atributos foto, nome, cdigo e data de nascimento. Agora vamos implementar um
programa que crie o documento do Alfredo (Documento 1 - tabela):

class Programa {
public static void main(String[] args) {

www.t2ti.com
5
Curso Java Starter

//Declarando meu objeto documento1


Documento documento1;

//Criando objeto documento1


documento1 = new Documento();

//Atribuindo os valores para o documento1


documento1.codigo = 123456;
documento1.nome = "Alfredo";
documento1.foto = "Img1.png";
documento1.dataNascimento = "20/05/1990";

System.out.println("Cdigo do documento: "+documento1.codigo);


}
}

A algoritmo apresentado pode ser lido da seguinte forma: Declaramos uma


varivel do tipo Documento denominada documento1, atribumos a varivel
documento1 uma instncia da classe Documento e para cada atributo do nosso objeto
documento1 atribumos os respectivos valores. Ao final o valor do cdigo impresso
Perceba que os atributos do documento1 so acessados utilizando
. (ponto) sobre o nome da varivel (documento1).

Objetos na memria

Observe o seguinte programa:

class Programa {
public static void main(String[] args) { 253 Documento
Documento doc1 = new Documento(); nome = Alfredo
doc1.nome = "Alfredo";

Documento doc2 = new Documento(); 254


doc2.nome = "Juliana";

System.out.println("doc1: "+doc1.nome);
System.out.println("doc2: "+doc2.nome); 255
}
}

256
O resultado da execuo deste programa imprime:
257
doc1: Alfredo
doc2: Juliana
258
Na memria o que acontece o seguinte:
259

doc1 = 253
260 Documento
nome = Juliana
doc2 = 260
261

As minhas variveis doc1 e doc2 no contm objetos, na verdade elas

www.t2ti.com
6
Curso Java Starter

indicam a posio (endereo) onde o objeto encontra-se na memria, e o Java


procura nestes endereos os objetos. Os endereos so obtidos atravs da palavra
reservada new que cria o novo objeto, aloca-o na memria e retorna o endereo de
acesso.
Agora observe este outro programa muito similar:

class Programa {
public static void main(String[] args) {
Documento doc1 = new Documento();
doc1.nome = "Alfredo";

Documento doc2 = doc1;


doc2.nome = "Juliana";

System.out.println("doc1: "+doc1.nome);
System.out.println("doc2: "+doc2.nome);
253 Documento
} nome = Juliana
}
254

Perceba que agora eu no estou mais


criando um novo doc2, estou passando a referncia 255

(endereo) armazenado no meu doc1. Veja o resultado


256
desta execuo:
doc1: Juliana 257
doc2: Juliana

258
Desta vez o que aconteceu na memria foi o
seguinte: 259

doc1 = 253
260

doc2 = 253
261

A varivel doc1 tem como referncia um objeto do tipo Documento


armazenado na posio 253 da memria. A esta referncia atribudo o valor
Alfredo ao campo nome, a seguir declarada uma nova varivel (doc2) cuja
referncia atribuda a mesma de doc1, ou seja, o endereo 253, logo aps,
utilizando a varivel de referncia doc2, modificamos o valor do campo nome para
Juliana.
O resultado disto que modificamos o campo nome sempre no mesmo
objeto e no qual as duas variveis (doc1 e doc2) esto referenciando. Devemos
compreender que apesar das variveis serem diferentes o valor contido nelas

www.t2ti.com
7
Curso Java Starter

(endereo) o mesmo, logo o objeto que estas variveis fazem referncia tambm
ser o mesmo.

Mtodos

Ok, dentro de um objeto temos seu estado definido pelo conjunto de


atributos. Mas cad o comportamento? As aes que so realizadas sobre os atributos
so os mtodos, o conjunto de mtodos define o comportamento de um objeto.
Imagine que agora o sistema a ser modelado o de uma corrida de carros.
O principal objeto de uma corrida de carros so os prprios carros nenhuma
novidade at aqui para os quais ns devemos criar uma especificao (classe) para
ser utilizada neste sistema imaginrio.
O nosso carro de corrida ter seu estado definido pelo conjunto de atributos
nmero de identificao, velocidade atual e velocidade mxima. O comportamento
ser definido pelo conjunto de mtodos acelerar, frear, ligar e desligar.
Vamos criar a nossa classe apenas com a definio do estado, inicialmente:

class CarroCorrida {

//Estado
Integer numeroIdentificacao;
Double velocidadeAtual;
Double velocidadeMaxima;

//Comportamento...
}

Pronto! Agora temos o nosso carro de corrida que no faz nada por
enqanto. Vamos adicionar os primeiros comportamentos, ligar e desligar. Estas aes
(ligar e desligar) no retornam nenhum tipo de informao, o carro apenas emite um
som, sendo assim, estes comportamentos podem ser implementados da seguinte
forma:

void ligar()
{
System.out.println("VRUUUMmmmmmmmmm");
}

void desligar()
{
System.out.println("MMMmmmm......");
}
Observe que os dois mtodos no retornam nenhuma informao para
quem os aciona (invoca) isto informado atravs da palavra reservada void.

www.t2ti.com
8
Curso Java Starter

Agora vamos implementar o mtodo acelerar:

void acelerar()
{
velocidadeAtual += 10;
if(velocidadeAtual > velocidadeMaxima)
{
velocidadeAtual = velocidadeMaxima;
}
}

Em acelerar() ns temos a primeira regra de negcio, cada acionamento


deste comportamento adiciona 10 unidades de velocidade a nossa velocidade atual
at o mximo permitido (atributo velocidade mxima), se a velocidade atual aps a
acelerao extrapolar o valor da velocidade mxima do carro ento a velocidade atual
ser igual a velocidade mxima.
Vamos implementar o mtodo frear:

void frear(Integer intensidadeFreada)


{
if(intensidadeFreada > 100)
{
intensidadeFreada = 100;
}else if(intensidadeFreada < 0)
{
intensidadeFreada = 0;
}

velocidadeAtual -= intensidadeFreada*0.25;

if(velocidadeAtual < 0)
{
velocidadeAtual = 0.0;
}
}

O mtodo frear recebe um parmetro que significa a intensidade com que o


pedal de freio foi acionado. Esta intensidade pode ser um valor entre 0 e 100, a
velocidade aps a freada o resultado da intensidade da freada multiplicada pelo
fator 0.25 tudo isto diminudo da velocidade atual, caso o resultado desta operao
seja menor do que 0 (zero) ento o valor final ser zero.
A nossa classe aps a adio destes comportamento ficou da seguinte
forma:

class CarroCorrida {

//Estado
Integer numeroIdentificacao;
Double velocidadeAtual;
Double velocidadeMaxima;

//Comportamento...

void ligar()

www.t2ti.com
9
Curso Java Starter

{
System.out.println("VRUUUMmmmmmmmmm");
}

void desligar()
{
System.out.println("MMMmmmm......");
}

void acelerar()
{
velocidadeAtual += 10;
if(velocidadeAtual > velocidadeMaxima)
{
velocidadeAtual = velocidadeMaxima;
}
}

void frear(Integer intensidadeFreada)


{
if(intensidadeFreada > 100)
{
intensidadeFreada = 100;
}else if(intensidadeFreada < 0)
{
intensidadeFreada = 0;
}

velocidadeAtual -= intensidadeFreada*0.25;

if(velocidadeAtual < 0)
{
velocidadeAtual = 0.0;
}
}
}

Podemos melhorar um pouco mais a nossa classe atribuindo valores


default para alguns atributos. Por exemplo, ns sabemos que a velocidade inicial de
qualquer veculo zero, sendo assim vamos definir o nosso atributo velocidadeAtual
inicialmente como zero e ao mesmo tempo vamos definir que a velocidade mxima
destes carros ser, inicialmente, 100. Para isto basta declarar estes atributos como
mostrado:

public class CarroCorrida {

//Estado
Integer numeroIdentificacao;
Double velocidadeAtual = 0.0;
Double velocidadeMaxima = 100.0;

//...

Desta forma toda vez que um carro for instanciado o valor destas variveis
estar previamente atribudo.
Mas, observando novamente o nosso modelo de carro de corrida
percebemos que faltam algumas caractersticas importantes. No nosso caso o piloto
com seus atributos so fundamentais para uma corrida de automveis.
Isto fcil de resolver, primeiro identificamos os atributos que desejamos e

www.t2ti.com
10
Curso Java Starter

adicionamos na nossa classe CarroCorrida. Estes atributos so nome, idade e


habilidade. Nossa nova classe fica da seguinte forma:

class CarroCorrida {

//Estado
Integer numeroIdentificacao;
Double velocidadeAtual = 0.0;
Double velocidadeMaxima = 100.0;
String nomePiloto;
Integer idadePiloto;
Integer habilidadePiloto;

//...

Em uma anlise mais refinada e crtica possvel perceber que os atributos


nomePiloto, idadePiloto e habilidadePiloto no fazem parte de um carro de corrida, na
verdade quem tem estes atributos o piloto. Neste caso ns podemos mudar a
implementao e adicionar mais uma classe ao nosso modelo. O novo modelo ficaria
da seguinte forma:

class Piloto {

String nome;
Integer habilidade;
Integer idade;

class CarroCorrida {

//Estado
Integer numeroIdentificacao;
Double velocidadeAtual = 0.0;
Double velocidadeMaxima = 100.0;
Piloto piloto;

//...

Agora a classe CarroCorrida possui um atributo do tipo Piloto ou seja, a


classe Piloto compe a classe CarroCorrida. J que temos um piloto com uma
determinada habilidade, podemos alterar o nosso mtodo acelerar() de forma que a
habilidade do piloto seja levada em conta quando aceleramos, ou seja, quanto mais
habilidoso for o piloto maior ser a acelerao que ele ir imprimir ao veculo.
O novo mtodo acelerar ser da seguinte forma:

void acelerar()
{
velocidadeAtual += 10 + piloto.habilidade*0.1;
if(velocidadeAtual > velocidadeMaxima)
{
velocidadeAtual = velocidadeMaxima;
}
}

www.t2ti.com
11
Curso Java Starter

Temos o nosso carro de corrida com piloto. Agora chegada a hora de


criarmos o nosso programa que simula uma corrida de carros entre duas equipes, a
equipe Velocidade e a equipe Trapaceiros:

class Corrida {

public static void main(String[] args) {


//Criacao dos carros que irao correr
CarroCorrida carroEquipeVelocidade = new CarroCorrida();
CarroCorrida carroEquipeTrapaceiros = new CarroCorrida();

//Criacao dos pilotos de cada equipe


Piloto pilotoEquipeVelocidade = new Piloto();
Piloto pilotoEquipeTrapaceiros = new Piloto();

//Atributos do piloto da equipe Velocidade


pilotoEquipeVelocidade.nome = "Piloto 1";
pilotoEquipeVelocidade.idade = 25;
pilotoEquipeVelocidade.habilidade = 75;

//Atributos do piloto da equipe Trapaceiros


pilotoEquipeTrapaceiros.nome = "Piloto 2";
pilotoEquipeTrapaceiros.idade = 27;
pilotoEquipeTrapaceiros.habilidade = 65;

//Os pilotos sao colocados nos seus carros


carroEquipeVelocidade.piloto = pilotoEquipeVelocidade;
carroEquipeTrapaceiros.piloto = pilotoEquipeTrapaceiros;

//Identificao dos carros


carroEquipeVelocidade.numeroIdentificacao = 1;
carroEquipeTrapaceiros.numeroIdentificacao = 2;

//Carros sao ligados


carroEquipeVelocidade.ligar();
carroEquipeTrapaceiros.ligar();

//Inicia a corrida
carroEquipeVelocidade.acelerar();
carroEquipeTrapaceiros.acelerar();

carroEquipeVelocidade.acelerar();
carroEquipeTrapaceiros.acelerar();

carroEquipeVelocidade.acelerar();
carroEquipeTrapaceiros.velocidadeAtual = 200.0;

}
}

Tudo estava acontecendo conforme planejado ambos os carros foram


ligados, partiram com velocidade zero e possuem a mesma velocidade mxima (100)
no entanto em um determinado momento, um dos carros corrompeu a integridade
do meu programa de duas formas:

1. A velocidade atual ficou maior que a velocidade mxima do carro (padro


100);

www.t2ti.com
12
Curso Java Starter

2. No respeitou o algoritmo de acelerao do veculo que permite o


aumento de velocidade em intervalos de 10 unidades mais um adicional
de acordo com a habilidade do piloto.

Diagnosticamos corretamente o problema e agora que o problema foi


descoberto ns precisamos resolv-lo, e para isto ns iremos entrar em um dos
conceitos fundamentais do paradigma Orientado a objetos, o encapsulamento.

ENCAPSULAMENTO

Apesar do nome relativamente esquisito o conceito simples.


Encapsulamento refere-se ao isolamento entre as partes do programa. Uma das
principais formas de fazer isso proibindo o acesso direto as variveis de um objeto
por objetos externos.
Para limitar o acesso aos membros do objeto (mtodos e atributos),
utilizamos os modificadores de acesso existentes em java (public, private,
protected e default).
Estes modificadores funcionam da seguinte forma:

public: Qualquer objeto pode acessar o membro;


default: Qualquer objeto do mesmo pacote pode acessar o membro e
subclasses de outros pacotes;
protected: O membro acessvel apenas por objetos do mesmo pacote;
private: O membro acessvel apenas internamente (prprio objeto);

Os dois modificadores de acesso mais utilizados desta lista so o public e o


private, e so com estes que ns iremos nos preocupar. Normalmente, os mtodos
so pblicos (public) e os atributos private (privados), isto ocorre pois ns desejamos
que os atributos de um objeto s possam ser alterados por ele mesmo, desta forma
ns inviabilizamos situaes imprevistas.
Vamos entender isto voltando ao nosso programa de corrida de carros.
Observe que na linha identificada pela seta vermelha existe uma violao da
integridade.
Em um determinado momento do programa um valor atribudo de forma
aleatria, sem respeitar a regra de negcio. Observe novamente o trecho de cdigo a

www.t2ti.com
13
Curso Java Starter

seguir:
...
carroEquipeVelocidade.acelerar();
carroEquipeTrapaceiros.acelerar();

carroEquipeVelocidade.acelerar();
carroEquipeTrapaceiros.velocidadeAtual = 200.0;

}...
Compreendeu o problema? A equipe trapaceiros simplesmente apelou e
atribuiu o valor 200 ao campo velocidadeAtual, desconsiderando que a velocidade
mxima do carro 100 e sem respeitar o algoritmo (regra de negcio) implementado
no mtodo acelerar.
Para resolver isto ns iremos limitar o acesso aos atributos da classe
CarroCorrida de forma que estes s possam ser acessado internamente. Observe
como fica a nova classe:

class CarroCorrida {

//Estado
private Integer numeroIdentificacao;
private Double velocidadeAtual = 0.0;
private Double velocidadeMaxima = 100.0;
private Piloto piloto;

Pronto! Agora os meus atributos s podero ser acessados pela prprio


objeto. Muito bem, mas criamos um outro problema... Como o meu programa ir
saber a velocidade de cada carro e determinar quem est na frente ou atrs durante a
corrida?
Vamos entrar em uma outra importante conveno quando programamos
em Java. So os mtodos getters e setters. Este mtodos so responsveis por
fornecer meios modificarmos o estado - lembra-se? - de um objeto, isto , meios de
acessarmos e modificarmos valores dos atributos de um objeto.
Mas claro que ns iremos criar estes mtodos apenas se forem realmente
necessrios, ou seja, ns no damos acesso aos atributos que no interessam a
outros objetos, ou seja, interessam apenas ao prprio objeto.
A conveno para estes mtodos a seguinte:

Getters: Mtodo que retorna o atributo, sempre composto pela palavra


get[nome do atributo]. Ex: getIdade(), getSalario().
Setters: Mtodo que atribui/modifica o valor de um atributo, sempre
composto pela palavra set[nome do atributo] e o parmetro do mesmo
tipo do atributo. Ex: setIdade(Integer idade), setSalario(Double salario).

www.t2ti.com
14
Curso Java Starter

A nossa classe com estes mtodos fica da seguinte forma:

class CarroCorrida {

//Estado
private Integer numeroIdentificacao;
private Double velocidadeAtual = 0.0;
private Double velocidadeMaxima = 100.0;
private Piloto piloto;

//Comportamento...
//Demais mtodos foram suprimidos apenas para melhorar a visualizao
//...

public Integer getNumeroIdentificacao() {


return numeroIdentificacao;
}

public void setNumeroIdentificacao(Integer numeroIdentificacao) {


this.numeroIdentificacao = numeroIdentificacao;
}

public Piloto getPiloto() {


return piloto;
}

public void setPiloto(Piloto piloto) {


this.piloto = piloto;
}

public Double getVelocidadeAtual() {


return velocidadeAtual;
}
}

Percebeu que eu no criei getter e setter para todos os atributos? Isto


acontece pois no h necessidade de fornecer meios de acesso e/ou modificao a
todos os atributos (observe o uso dos modificadores de acesso antes da declarao de
cada varivel e cada mtodo public e private).
Vamos observar atributo a atributo e enteder o pensamento Orientado a
objetos:

numeroIdentificacao: Este atributo deve ser acessado e


atribudo/modificado (getter e setter foram criados) por qualquer
objeto, pensando no mundo real (no caso a corrida que estou
modelando) o nmero de identificao varivel, isto , a direo do
campeonato pode mudar aleatriamente entre corridas, ou seja,
necessrio fornecer meios de modific-lo e acess-lo a outros objetos;

velocidadeAtual: Este atributo pode apenas ser acessado (getter), isto


ocorre pois desejo que a velocidade dos meus carros de corrida sejam
modificadas apenas atravs dos mtodos frear() e acelerar()

www.t2ti.com
15
Curso Java Starter

respeitando os algoritmos implementados;

velocidadeMaxima: Ningum pode acessar ou modificar/atribuir valores


para este atributo (sem getter ou setter) pois, no meu modelo de
corrida de carros, a velocidade mxima de cada um pr-definida e no
ser alterada. O carro j criado sabendo que pode alcanar a
velocidade mxima de 100 unidades de velocidade (Km/h, velocidade da
luz e etc.), observe que o meu modelo de carro de corrida assim para
fins didticos, mas normalmente ns iremos implementar o atributo
velocidadeMaxima de forma que seja funo de outras variveis como
motor, potncia, chassis e etc;

piloto: Este atributo pode ser acessado e modificado/atribudo (getter e


setter) por outros objetos do programa. Pensando no modelo seria o
seguinte: Ns podemos trocar de piloto do carro entre corridas, durante
as corridas e ainda deix-lo sem piloto quando estiver parado, logo eu
preciso de meios para que isto seja possvel.

Antes de continuar, vamos abordar um outro assunto o Construtor.


O construtor no um mtodo, um bloco responsvel pela criao da
classe. Ele executado toda a vez que utilizamos a palavra reservada new, e sua
nica funo criar uma instncia (objeto) da classe. Quando o construtor no
explicitamente declarado o compilador insere o construtor default, isto , um
construtor sem parmetros e com o corpo vazio.
No nosso caso, a classe CarroCorrida tem o seguinte construtor declarado
implicitamente (default), ou seja, colocado pelo compilador:

public CarroCorrida()
{

Para mostrar uma implementao do construtor ns iremos definir que a


velocidade maxima de um veiculo e o seu nmero de identificao so definidos
durante a sua construo atravs de dois parmetros portanto ns no iremos
utilizar o construtor default. O nosso novo construtor fica da seguinte forma:

www.t2ti.com
16
Curso Java Starter

public CarroCorrida(Integer numeroIdentificacao, Double velocidadeMaxima) {


this.numeroIdentificacao = numeroIdentificacao;
this.velocidadeMaxima = velocidadeMaxima;
}

A palavra reservada this, no corpo do nosso novo construtor, significa que


ns estamos acessando o membro, neste caso o atributo, do prprio objeto que est
sendo instanciado.
Agora toda a vez que uma instncia da classe CarroCorrida for criada
necessariamente dever ser definida a velocidade mxima do carro, desta forma
garantimos que a velocidade mxima do veculo atribuda no momento da sua
criao. Portanto para criar um novo carro de corrida ns devemos proceder conforme
trecho de cdigo abaixo:

class Corrida {

public static void main(String[] args) {


//Criacao dos carros que irao correr
CarroCorrida carroEquipeVelocidade = new CarroCorrida(1, 100.0);
CarroCorrida carroEquipeTrapaceiros = new CarroCorrida(2, 100.0);
//...

O mais interessante que posso ter carros com diferentes velocidades


mximas, definidas no momento da construo.
Observe que at agora ns nos preocupamos apenas com a classe
CarroCorrida, mas a classe piloto tambm deve seguir ser modificada a fim de
encapsularmos os seus atributos. O resultado o seguinte:

class Piloto {

private String nome;


private Integer habilidade;
private Integer idade;

public String getNome() {


return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public Integer getHabilidade() {
return habilidade;
}
public void setHabilidade(Integer habilidade) {
this.habilidade = habilidade;
}
public Integer getIdade() {
return idade;
}
public void setIdade(Integer idade) {
this.idade = idade;
}

www.t2ti.com
17
Curso Java Starter

Ao aplicarmos os conceitos apresentados a nossa classe Corrida fica da


seguinte forma:

class Corrida {

public static void main(String[] args) {


//Criacao dos carros que irao correr
CarroCorrida carroEquipeVelocidade = new CarroCorrida(1, 100.0);
CarroCorrida carroEquipeTrapaceiros = new CarroCorrida(2, 100.0);

//Criacao dos pilotos de cada equipe


Piloto pilotoEquipeVelocidade = new Piloto();
Piloto pilotoEquipeTrapaceiros = new Piloto();

//Atributos do piloto da equipe Velocidade


pilotoEquipeVelocidade.setNome("Piloto 1");
pilotoEquipeVelocidade.setIdade(25);
pilotoEquipeVelocidade.setHabilidade(75);

//Atributos do piloto da equipe Trapaceiros


pilotoEquipeTrapaceiros.setNome("Piloto 2");
pilotoEquipeTrapaceiros.setIdade(27);
pilotoEquipeTrapaceiros.setHabilidade(65);

//Os pilotos sao colocados nos seus carros


carroEquipeVelocidade.setPiloto(pilotoEquipeVelocidade);
carroEquipeTrapaceiros.setPiloto(pilotoEquipeTrapaceiros);

//Identificao dos carros


carroEquipeVelocidade.setNumeroIdentificacao(1);
carroEquipeTrapaceiros.setNumeroIdentificacao(2);

//Carros sao ligados


carroEquipeVelocidade.ligar();
carroEquipeTrapaceiros.ligar();

//Inicia a corrida
carroEquipeVelocidade.acelerar();
carroEquipeTrapaceiros.acelerar();

carroEquipeVelocidade.acelerar();
carroEquipeTrapaceiros.acelerar();

carroEquipeVelocidade.acelerar();
carroEquipeTrapaceiros.acelerar();

}
}

Preste ateno neste novo cdigo e compare-o com o que foi implementado
anteriormente, veja que agora no acessamos/modificamos nenhum atributo de forma
direta, somos obrigados a utilizar os mtodos de cada uma das classes.

Exerccios
*Respeite o encapsulamento em todos os exerccios.

www.t2ti.com
18
Curso Java Starter

Aprenda com quem tambm est aprendendo, veja e compartilhe as suas


respostas no nosso Frum:
Exerccios Mdulo 04 OO, Classes e Objetos, Modificadores de Acesso

1. Modifique a classe CarroCorrida, vista durante este mdulo. Adicione um outro


construtor que receba apenas um parmetro (velocidade mxima).
2. Crie uma classe Motor com o atributo potncia (inteiro que varia entre 1 e 100),
implemente um construtor que receba o parmetro potncia e verifique se o
valor encontra-se dentro dos limites estabelecidos (1 - 100). Caso o valor
extrapole o limite superior ou inferior o valor da potncia deve ser o valor do
limite extrapolado.
3. Adicione a classe CarroCorrida o atributo motor (utilize classe Motor do
exerccio 2). Altere o mtodo acelerar() de forma que ao resultado da
acelerao j implementado sejam adicionados 10% do valor da potncia do
motor.
4. Escreva uma classe Contador, que apresente mtodos para informar o valor
inicial, incrementar, decrementar e imprimir o valor atual.
5. Crie uma classe que represente um ponto no plano cartesiano, lembrando que
um ponto no plano cartesiano representado pelas coordenadas no eixo x e no
eixo y.
6. Crie uma classe que represente um tringulo, utilize a classe desenvolvida no
exerccio anterior para identificar os vrtices do tringulo.
7. Implemente uma classe Pessoa com os seguintes atributos: Nome, idade e CPF.
8. Utilizando a classe implementada no exerccio anterior crie um programa que
instancie 2 pessoas com todos os atributos e imprima os valores.
9. Implemente uma classe que represente uma sala de aula, esta sala pode ter o
mximo de 10 alunos, se extrapolar este limite deve ser impressa uma
mensagem avisando que o nmero mximo de alunos foi atingido.
10.Implemente uma classe de Endereo com os seguintes atributos: Estado,
Cidade, Bairro, Rua, CEP e telefone.
11.Adicione a classe Pessoa desenvolvida no exerccio 7 um atributo de endereo
utilizando a classe desenvolvida no exerccio 10.
12.Implemente um mtodo construtor para a classe Pessoa de forma que uma
instncia desta classe seja criada apenas se possuir nome, idade e cpf.

www.t2ti.com
19
Curso Java Starter

13.Implemente uma classe que simule um cadastro de pessoal. Esta classe deve
armazenar at 100 pessoas (utilize a classe Pessoa) com seus respectivos
endereos. Esta classe deve ter os seguintes comportamentos: permitir o
cadastramento e excluso de pessoas do cadastro.
14.Faa uma classe Calculadora que realize as 4 operaes matemticas bsicas
(soma, diviso, multiplicao e subtrao) sobre dois valores (double) passados
como parmetros e retorne o resultado. Crie um programa que realize as 4
operaes e imprima os resultados obtidos.
15.Faa uma classe CalculadoraComercial, esta classe deve realizar, alm das 4
operaes bsicas, o clculo de porcentagens. O clculo da porcentagem deve
ser efetuado sobre 2 parmetros o valor total (double) e a porcentagem a ser
obtida (inteiro) retornando o resultado. Ateno, a classe CalculadoraComercial
deve ter um atributo Calculadora e transferir a responsabilidade pela realizao
das 4 operaes matemticas bsicas para o objeto Calculadora, ou seja, a
nica implementao nova ser o cculo da porcentagem.
16.Faca uma classe Conta que contenha o cliente (utilize a classe Pessoa
desenvolvida nos exerccios anteriores), o numero da conta, o saldo e o limite.
Estes valores deverao ser informados no construtor. Faa um mtodo depositar
e um mtodo sacar. O mtodo sacar ir devolver true ou false, em razo da
disponibilidade ou no de saldo. Faa um mtodo saldo que retorne o saldo do
cliente.
17.Utilize a classe Pessoa e a classe Sala, desenvolvidas nos exerccios anteriores,
e mais uma classe Escola com atributos nome, CNPJ e salas (mximo de 20
salas ocupadas). Faa um programa que:
Crie uma escola;
Adicione a esta escola algumas salas;
Adicione as salas pessoas (alunos);
Transfira um aluno de uma sala para outra.

www.t2ti.com
20
Curso Java Starter

Mdulo

05
Pacotes java.lang e java.util

Definio de Pacotes

O que so pacotes em Java? Um pacote (package) em Java um diretrio em


que est armazenada uma ou mais classes. Os pacotes costumam agrupar classes de
mesmas afinidades, por exemplo, observe a classe Aluno, ela est no pacote
javainiciante e deve ser declarada da seguinte maneira:

package javainiciante;

public class Aluno {


//Estrutura da classe
}

A palavra reservada package define em qual pacote se encontra a classe.


Para utilizar classes de um pacote, usada a palavra reservada import do
seguinte modo:

import nome-do-pacote.nome-da-classe

Ex1.: classe Teste importando a classe Aluno:

import javainiciante.Aluno;

public class Teste {


Aluno aluno = new Aluno();
//Estrutura da classe
}

Ex2.: import java.util.Date; --> indica que ser usada a classe Date do pacote
java.util que est no diretrio \java\util.

Ex3.: import java.util.*; --> Neste exemplo, est sendo usado o smbolo * ao

www.t2ti.com
3
Curso Java Starter

invs do nome da classe. Isto significa que estaremos importando todas as classes
que pertencem ao pacote java.util.
A utilizao do import s necessria, caso a classe que est utilizando as
funcionalidades de outra classe estiver em um pacote diferente. Ex.: classe Professor
que est no mesmo pacote da classe Aluno:

package javainiciante;

public class Professor {


Aluno aluno = new Aluno(); //no necessrio importar a classe Aluno
//Estrutura da classe
}

Uma classe est somente em um package e pode ter vrios imports.

O pacote java.lang

Por padro, o pacote java.lang importado automaticamente pelo Java. o


nico pacote que possui esta caracterstica. Isso explica o fato de, nos exemplos que
utilizamos nos mdulos anteriores, no precisarmos utilizar imports em nossas
classes.
As principais classes que fazem parte deste pacote so:
Boolean, Byte, Character, Double, Float, Integer, Long, Math, Number, Object,
Short, String, System, Thread, etc.

java.lang.String

String uma classe em Java. Instncias de uma String correspondem unio


de um conjunto de caracteres. Essas strings podem ser manipuladas de diversas
maneiras. Apresentaremos aqui, alguns mtodos desta classe:

Mtodo lenght()

O mtodo length() utilizado para retornar o tamanho de uma determinada


string, incluindo tambm os espaos em branco. Este mtodo sempre retorna um
valor do tipo int. Tem a seguinte sintaxe:
nome-da-string.length()

www.t2ti.com
4
Curso Java Starter

Segue um exemplo e o resultado de execuo da classe:

class JavaIniciante {

public static void main (String args[]){


String s = "Java Iniciante";
System.out.println("Tamanho da string: " + s.length());
}
}

Mtodo charAt()

O mtodo charAt() utilizado para retornar um caractere de uma determinada


string de acordo com um ndice especificado entre parnteses (parmetro), sendo que
o primeiro caractere tem o ndice 0, o segundo tem o ndice 1 e assim por diante. Tem
a seguinte sintaxe:
nome-da-string.charAt(indice)
Observe que no exemplo a seguir, o ndice informado no parmetro 6,
retornando o 7 caractere da string.

class JavaIniciante {

public static void main (String args[]){


String s = "Java Iniciante";
System.out.println("Caracter da posio 7: " + s.charAt(6));
}
}

www.t2ti.com
5
Curso Java Starter

Mtodos toUpperCase() e toLowerCase()

Os mtodos toUpperCase() e toLowerCase() so utilizados para transformar


todas as letras de uma determinada string em maisculas ou minsculas,
respectivamente. Tem a seguinte sintaxe:
nome-da-string.toUpperCase()
nome-da-string.toLowerCase()
Veja no exemplo a seguir:

class JavaIniciante {

public static void main (String args[]){


String s = "Java Iniciante";
System.out.println("String s em maiscula: " + s.toUpperCase());
System.out.println("String s em minscula: " + s.toLowerCase());
}
}

Mtodo substring()

O mtodo substring() utilizado para retornar uma cpia de caracteres de


uma string a partir de dois ndices inteiros especificados. Tem a seguinte sintaxe:

nome-da-string.substring(indice1, indice2)

O primeiro parmetro especifica o ndice a partir do qual se inicia a cpia dos


caracteres. O segundo parmetro opcional (se no for inserido ser considerado
como o comprimento mximo da string) e especifica o ndice final em que termina a
cpia dos caracteres, porm o ndice final deve especificar um ndice alm do ltimo
caractere. Caso queira uma cpia do 1 ao 5 caracteres, o ndice inicial deve ser 0 e
o ndice final 6. Veja no exemplo a seguir:

www.t2ti.com
6
Curso Java Starter

class JavaIniciante {
public static void main (String args[]){
String s = "Java Iniciante";
System.out.println("Do 3 caratere at o fim: " + s.substring(2));
System.out.println("Do 1 caratere at o 6: " + s.substring(0, 6));
System.out.println("Do 4 caratere at o 13: " + s.substring(3, 13));
}
}

Mtodo trim()

O mtodo trim() tem por objetivo remover todos os espaos em branco que
aparecem no incio e no final de uma determinada string. Observe que sero
removidos apenas os espaos do incio e do fim da string no sero removidos os
espaos entre as palavras. Tem a seguinte sintaxe:

nome-da-string.trim()

class JavaIniciante {
public static void main (String args[]){
String s = " Java Iniciante ";
System.out.println("Com espaos: *" + s + "*");
System.out.println("Sem espaos: *" + s.trim() + "*");
}
}

Mtodo replace()

O mtodo replace() utilizado para substituio de caracteres individuais de

www.t2ti.com
7
Curso Java Starter

uma string. Devero ser informados como parmetros, o caracter a ser substitudo e
por qual caractere ser substitudo. Tem a seguinte sintaxe:
nome-da-string.replace(caracter-a-ser-substitudo, substituio)

class JavaIniciante {
public static void main (String args[]){
String s = "Java Iniciante";
System.out.println("Trocar caracter 'a' por 'u': " + s.replace("a", "u"));
System.out.println("Trocar caracter 'a' por 'A': " + s.replace("a", "A"));
System.out.println("Trocar caracter espao por '_': " + s.replace(" ", "_"));
}
}

Mtodo String.valueOf()

O mtodo String.valueOf() usado para converter diversos tipos de dados em


strings. Para isso, esse mtodo aceita vrios tipos de argumento e tranforma-os em
strings. Tem a seguinte sintaxe:
String.valueOf(nome-da-varivel)

class JavaIniciante {

public static void main (String args[]){


int a = 1;
double b = 1.2;
String s = String.valueOf(a) + " " + String.valueOf(b);
System.out.println("Contedo de s: " + s);
}
}

www.t2ti.com
8
Curso Java Starter

Mtodo split()

O mtodo split() usado para dividir uma string em um array de strings.


passado como parmetro qual o caractere ou caracteres que delimitam a diviso. Tem
a seguinte sintaxe:

nome-da-string.split(caractere);

class JavaIniciante {

public static void main (String args[]){


String s = "Curso Java Iniciante";
String[] palavras = s.split(" ");
for (int i = 0; i < palavras.length; i++){
System.out.println("Palavra " + (i + 1) + ": " + palavras[i]);
}
System.out.println("****************************************");
palavras = s.split("cia");
for (int i = 0; i < palavras.length; i++){
System.out.println("Palavra " + (i + 1) + ": " + palavras[i]);
}
}
}

Comparando Strings

Veja o exemplo seguinte:

www.t2ti.com
9
Curso Java Starter

class JavaIniciante {

public static void main (String args[]){


String s1 = new String("Curso Java Iniciante");
String s2 = new String("Curso Java Iniciante");
if (s1 == s2){
System.out.println("As duas strings so iguais!");
}
else{
System.out.println("As duas strings so diferentes!");
}
}
}

O que h de errado neste resultado? Declaramos duas strings e a instanciamos


com o mesmo contedo, e ao compar-las temos como resultado que elas so
diferentes.
Quando quisermos comparar duas strings, no devemos utilizar == e sim o
mtodo equals() que possui a seguinte sintaxe:

string1.equals(string2)

Agora vamos utilizar este mtodo e ver o que acontece:

class JavaIniciante {

public static void main (String args[]){


String s1 = new String("Curso Java Iniciante");
String s2 = new String("Curso Java Iniciante");
if (s1.equals(s2)){
System.out.println("As duas strings so iguais!");
}
else{
System.out.println("As duas strings so diferentes!");
}
}
}

www.t2ti.com
10
Curso Java Starter

Agora sim, temos o resultado esperado!


A classse java.lang.String possui vrios mtodos. uma boa prtica consultar
o javadoc (esse assunto ser abordado no prximo mdulo) desta classe para
aprender mais sobre a mesma.

java.lang.Math

A classe java.lang.Math possui vrios mtodos que permitem efetuar diversos


tipos de clculos matemticos. Para utilizar os mtodos desta classe basta chamar o
mtodo precedido do nome Math. Ela no pode ser estendida ( uma classe final) e
possui o construtor private (no pode ser instanciada);

Mtodos max() e min()

O mtodo max() utilizado para verificar o maior valor entre dois nmeros, e
o mtodo min() utilizado para verificar o menor valor entre dois nmeros, que
podem ser do tipo double, float, int ou long. Observe a seguir a sintaxe destes
mtodos:

Math.max(valor1, valor2);
Math.min(valor1, valor2);

class JavaIniciante {

public static void main (String args[]){


int a = 10;
double b = 5.4;
int c = -4;
System.out.println("Qual o maior valor? 10 ou 5.4: " + Math.max(a, b));
System.out.println("Qual o maior valor? 5.4 ou -4: " + Math.max(b, c));
System.out.println("Qual o menor valor? 5.4 ou -4: " + Math.min(b, c));
}
}

www.t2ti.com
11
Curso Java Starter

Mtodo random()

O mtodo random() utilizado para gerar valores de forma aleatria. Toda vez
que este mtodo chamado, ser gerado um valor do tipo double entre 0.0 e 1.0 (o
valor 1.0 nunca gerado). Veja a sintaxe deste mtodo:

Math.random()

class JavaIniciante {

public static void main (String args[]){


System.out.println("Nmero aleatrio: " + Math.random());
System.out.println("Nmero aleatrio: " + Math.random());
System.out.println("Nmero aleatrio: " + Math.random());
}
}

Execute a aplicao vrias vezes e perceba que o resultado ser sempre


diferente.
Agora, se quisermos gerar nmeros aleatrios inteiros? Por exemplo, minha
aplicao precisa de nmeros entre 0 e 99. O exemplo seguinte mostra como
implementar isto.

class JavaIniciante {

public static void main (String args[]){


System.out.println("Nmero aleatrio: " + (int) (Math.random() * 100));
System.out.println("Nmero aleatrio: " + (int) (Math.random() * 100));
System.out.println("Nmero aleatrio: " + (int) (Math.random() * 100));
}
}

www.t2ti.com
12
Curso Java Starter

A classse java.lang.Math possui vrios mtodos. uma boa prtica consultar o


javadoc (esse assunto ser abordado no prximo mdulo) desta classe para aprender
mais sobre a mesma.

Classes Wrapper

Classes wrapper so classes usadas para embutir tipos primitivos para que
possam ser utilizados como objetos. Cada tipo primitivo tem a sua classe wrapper
correspondente. As classes wrapper so: Character, Byte, Short, Integer, Long, Float,
Double e Boolean.
Cada classe wrapper permite manipular tipos primitivos como objetos da
classe Object. Desta forma, valores do tipo primitivo podem ser processados de forma
polimrfica (assunto ser abordado no mdulo 09) se forem mantidos como objetos
das classes wrapper.
Como fazer para obter um int que est armazenado em sua classe wrapper?
Como fazer para obter um double que est armazenado em sua classe
wrapper?
O exemplo a seguir mostra a resposta para estas duas perguntas:

class JavaIniciante {

public static void main (String args[]){


Integer a = new Integer(2);
int b = a.intValue();
Double c = new Double(4.5);
double d = c.doubleValue();
System.out.println("Valor de b: " + b);
System.out.println("Valor de d: " + d);
}
}

O pacote java.lang possui vrias classes. uma boa prtica consultar a API
(esse assunto ser abordado no prximo mdulo) deste pacote para aprender mais
sobre o mesmo.

www.t2ti.com
13
Curso Java Starter

O pacote java.util

O pacote java.util possui vrias classes muito utilizadas e importantes, e


algumas delas foram abordadas em mdulos anteriores. Neste mdulo iremos falar
sobre a classe Calendar. No falaremos sobre a classe Date, pois a maioria dos
mtodos desta classe esto deprecated e a classe Calendar a substitui.
Quando um mtodo est marcado como deprecated, significa que este foi
substitudo por outro. Isso acontece quando detectado um bug ou ineficincia.
Ento, o mtodo mantido como est e marcado como deprecated, para que
aplicaes legadas continuem utilizando o mesmo sem problemas. Voc at pode usar
um mtodo deprecated, mas isso no recomendado.

java.util.Calendar

Com a classe Calendar podemos realizar vrios tipos de operaes envolvendo


datas, como ano, ms, dia, hora, minuto, etc. Esta classe tem o tempo representado
em milissegundos.
Para obter uma instncia desta classe, basta chamar o mtodo esttico
getInstance(). Quando este mtodo chamado, obtido um Calendar com data e
hora atuais. Depois de obtido este objeto, utilizamos o mtodo get() para buscar o
ano, dia, etc.
Primeiramente, vamos utilizar o mtodo getTime() para mostrar a data e hora
atuais.

import java.util.Calendar; //necessrio este import para utilizao da classe

class JavaIniciante {

public static void main (String args[]){


Calendar data = Calendar.getInstance();
System.out.println(data.getTime());
}
}

www.t2ti.com
14
Curso Java Starter

No exemplo anterior, a data e hora foram mostradas de uma forma diferente


da que estamos acostumados. Vamos analis-lo:
1 - Tue --> representa o dia da semana. Neste caso Tuesday - Tera-feira
2 Nov --> representa o ms. Neste caso November - Novembro
3 20 --> representa o dia do ms.
4 20:38:34 --> representa a hora, minuto e segundo.
5 GMT -03:00 --> representa o Tempo Mdio de Greenwich. Neste caso a
hora oficial do brasil.
6 2007 --> representa o ano.

Talvez no seja muito til a data representada desta maneira, ento vamos
obter cada campo separadamente. Vamos utilizar agora o mtodo get().

import java.util.Calendar;

class JavaIniciante {

public static void main (String args[]){


Calendar data = Calendar.getInstance();
System.out.println("Dia do ms: " + data.get(Calendar.DAY_OF_MONTH));
System.out.println("Ms : " + (data.get(Calendar.MONTH) + 1));
System.out.println("Ano : " + data.get(Calendar.YEAR));
System.out.println("Hora : " + data.get(Calendar.HOUR_OF_DAY));
System.out.println("Minuto : " + data.get(Calendar.MINUTE));
System.out.println("Segundo : " + data.get(Calendar.SECOND));
}
}

O mtodo get() da classe Calendar sempre retorna um valor do tipo int.


Observe que para o ms, incrementamos o valor obtido em 1. A constante
Calendar.MONTH que representa o ms inicia em 0(zero), ou seja, janeiro = 0,
fevereiro = 1 e assim por diante.
Agora iremos atribuir novos valores para os campos utilizando o mtodo set().
Este mtodo necessita de dois argumentos: o primeiro define qual campo vamos
alterar e o segundo o novo valor do campo.

www.t2ti.com
15
Curso Java Starter

import java.util.Calendar;

class JavaIniciante {

public static void main (String args[]){


Calendar data = Calendar.getInstance();
data.set(Calendar.DAY_OF_MONTH, 18);
data.set(Calendar.MONTH, 10);
data.set(Calendar.YEAR, 2005);
data.set(Calendar.HOUR_OF_DAY, 14);
data.set(Calendar.MINUTE, 18);
data.set(Calendar.SECOND, 45);
System.out.println("Dia do ms: " + data.get(Calendar.DAY_OF_MONTH));
System.out.println("Ms : " + data.get(Calendar.MONTH));
System.out.println("Ano : " + data.get(Calendar.YEAR));
System.out.println("Hora : " + data.get(Calendar.HOUR_OF_DAY));
System.out.println("Minuto : " + data.get(Calendar.MINUTE));
System.out.println("Segundo : " + data.get(Calendar.SECOND));
}
}

No exemplo anterior, definimos a data para 18/11/2005, 14:18:45. E se


quisermos somar 20 dias a esta data? Para isto, utilizamos o mtodo add(). Da
mesma forma que o set(), informamos dois argumentos: o primeiro define qual
campo vamos somar e o segundo quanto iremos somar.

import java.util.Calendar;

class JavaIniciante {

public static void main (String args[]){


Calendar data = Calendar.getInstance();
data.set(Calendar.DAY_OF_MONTH, 18);
data.set(Calendar.MONTH, 10);
data.set(Calendar.YEAR, 2005);
data.set(Calendar.HOUR_OF_DAY, 14);
data.set(Calendar.MINUTE, 18);
data.set(Calendar.SECOND, 45);
data.add(Calendar.DAY_OF_MONTH, 20);
System.out.println("Dia do ms: " + data.get(Calendar.DAY_OF_MONTH));
System.out.println("Ms : " + data.get(Calendar.MONTH));
System.out.println("Ano : " + data.get(Calendar.YEAR));
System.out.println("Hora : " + data.get(Calendar.HOUR_OF_DAY));
System.out.println("Minuto : " + data.get(Calendar.MINUTE));
System.out.println("Segundo : " + data.get(Calendar.SECOND));

www.t2ti.com
16
Curso Java Starter

}
}

Como resultado, obtivemos a data 8/12/2005, 14:18:45. Lembre-se que o


campo ms comea com 0(zero).
Outros mtodos muito importantes da classe java.util.Calendar so: before() e
after(). before() nos permite saber se uma determinada data anterior a outra data.
after() o inverso, retorna se uma data posterior a outra data. Tem a seguinte
sintaxe:

data1.before(data2)
data1.after(data2)

before() retorna verdadeiro, se e somente se data1 < data2.


after() retorna verdadeiro, se e somente se data1 > data2.

import java.util.Calendar;

class JavaIniciante {

public static void main (String args[]){


Calendar data1 = Calendar.getInstance();
data1.set(Calendar.DAY_OF_MONTH, 18);
data1.set(Calendar.MONTH, 10);
data1.set(Calendar.YEAR, 2005);
Calendar data2 = Calendar.getInstance();
data2.set(Calendar.DAY_OF_MONTH, 12);
data2.set(Calendar.MONTH, 8);
data2.set(Calendar.YEAR, 2007);
if (data1.before(data2)){
System.out.println("data1 anterior a data2");
}
else{
System.out.println("data1 no anterior a data2");
}

}
}

www.t2ti.com
17
Curso Java Starter

Agora vamos utilizar o mtodo getTimeInMillis(), para calcularmos o intervalo


de dias entre as datas utilizadas no exemplo anterior. O clculo feito pegando a
diferena entra a data2 de data1 e dividindo-se pelo valor de milissegundos em um
dia.

import java.util.Calendar;

class JavaIniciante {

public static void main (String args[]){


Calendar data1 = Calendar.getInstance();
data1.set(Calendar.DAY_OF_MONTH, 18);
data1.set(Calendar.MONTH, 10);
data1.set(Calendar.YEAR, 2005);
Calendar data2 = Calendar.getInstance();
data2.set(Calendar.DAY_OF_MONTH, 12);
data2.set(Calendar.MONTH, 8);
data2.set(Calendar.YEAR, 2007);
long d1 = data1.getTimeInMillis();
long d2 = data2.getTimeInMillis();
System.out.println("N dias: " + (int)((d2 - d1)/ (24*60*60*1000)));
}
}

Agora voc deve tentar resolver a lista de exerccios abaixo. Qualquer


dificuldade envie para a lista de discusso:

Exerccios

Aprenda com quem tambm est aprendendo, veja e compartilhe as suas


respostas no nosso Frum:

Exerccios Mdulo 05 Pacotes (java.lang java.util)

www.t2ti.com
18
Curso Java Starter

01 Elabore um programa em Java que possua um mtodo que recebe uma


String como parmetro e caso esta String tenha menos que 8 caracteres, emita uma
mensagem de erro.

02 Aproveitando a classe implementada no exerccio anterior, defina tambm


que a String deve comear com a letra A.

03 Elabore um programa em Java que possua um mtodo que recebe uma


String como parmetro e mostra ao usurio os quatro primeiros caracteres em
Maisculas.

04 Utilizando a classe elaborada no exerccio anterior, verifique se a String


contem nmeros, emitindo uma mensagem ao usurio.

05 Elabore um programa em Java que gere dois nmeros aleatriamente


(entre 0 e 1000) e verifique qual dos nmeros gerados maior.

06 Elabore um programa em Java que mostre ao usurio a quantidade de


anos, meses, dias, horas, minutos e segundos que faltam para o ano de 2014.

07 Elabore um programa em Java que possua um mtodo que receba como


parmetro duas datas, e mostre a maior data. Caso as datas sejam iguais, emitir
mensagem informando o usurio.

08 Aproveitando o programa do exerccio anterior, emita uma mensagem ao


usurio caso a diferena entre as datas seja maior que 20 dias.

www.t2ti.com
19
Curso Java Starter

Mdulo

06
JAVADOC E ARQUIVOS JAR

JAVADOC

JAVADOC, um utilitrio para a gerao da documentao das classes criadas


em Java. Esta documentao muito importante, pois atravs dela que conhecemos
melhor as classes, verificando quais mtodos determinada classe possui e suas
funcionalidades. Aprender utiliz-la essencial.
A documentao da API Java 1.6 pode ser acessada no link:
http://java.sun.com/javase/6/docs/api/

www.t2ti.com
3
Curso Java Starter

Na tela seguinte, estamos acessando a API da classe java.util.Calendar:

O campo representado por 1 contm a lista de pacotes. O campo


representado por 2 contm a lista de classes e interfaces do pacote selecionado em
1. O campo representado por 3 contm a descrio da classe selecionada em 2.
Todo o detalhamento da classe vai estar no campo representado por 3.
No cabealho da pgina encontramos links para:

Overview Mostra todos os pacotes da API Java.


Package Mostra a descrio de todas as classes do pacote atual. Neste

www.t2ti.com
4
Curso Java Starter

caso, java.util.
Class classe que est sendo acessada.
Use Lista dos pacotes que a classe atual utiliza.
Tree Hierarquia de classes no pacote atual.
Deprecated classes e mtodos que no so recomendados utilizar.
Index ndice de mtodos e campos. Muito til quando no se sabe a classe.
Help ajuda de como utilizar a documentao.

Identificado com a letra A temos o nome do pacote em B temos o nome da


classe em C temos a estrutura hierrquica de classes em D temos as interfaces que
so implementadas por esta classe e em E temos as classes que estendem esta
classe.

www.t2ti.com
5
Curso Java Starter

Nesta parte da tela temos a lista de campos da classe. Na primeira coluna


temos o tipo(int, String, etc.) e na segunda temos o nome e a descrio do campo.

www.t2ti.com
6
Curso Java Starter

Aqui temos a lista de construtores e a lista de mtodos. Na lista de


construtores, a primeira coluna mostra o modificador de acesso(public, protected, etc)
e na segunda coluna mostra o nome e a descrio do construtor. Na lista de mtodos,
a primeira coluna mostra o tipo de retorno(void, boolean, etc.) e na segunda coluna
mostra o nome e a descrio do mtodo.

Nesta tela temos os mtodos que so herdados da super-classe. Neste caso, a


classe java.util.Calendar s herda os mtodos da classe java.lang.Object.
Em cada nome de campo, construtor, mtodo mostrados nas telas que vimos,
tem um link direcionando para a sua respectiva descrio detalhada. Na tela abaixo
vemos o detalhamento do mtodo getInstance(TimeZone).

www.t2ti.com
7
Curso Java Starter

Podemos observar aqui o modificador de acesso (public), o tipo de retorno


(Calendar) o nome do mtodo (getInstance) e o parmetro (TimeZone).

Gerando o JAVADOC

Quando instalamos o JDK, o gerador de javadoc tambm instalado. O


mesmo fica na pasta %JAVA_HOME%/bin/javadoc.exe.
Agora vamos criar um javadoc da classe a seguir:

package veiculo

public class CarroPasseio {

public void acelerar(){


//cdigo...
}

public void frear(int intensidade){


//cdigo

www.t2ti.com
8
Curso Java Starter

public int getVelocidade(){


//cdigo...
return 0;
}
}

No prompt de comando digitamos o seguinte comando:


javadoc veiculo
veiculo --> nome do pacote

Ser gerado javadoc para todas as classes que estiverem no pacote veiculo.
Se tiver mais de um pacote, faa assim:

javadoc pacote1 pacote2 pacote3 ...

Sero gerados vrios arquivos. Abra o arquivo index.html e temos o javadoc


do pacote veiculo:

www.t2ti.com
9
Curso Java Starter

Acessando a classe CarroPasseio temos o seguinte:

Geramos o javadoc, mas vemos que s aparecem o nome do construtor e dos

www.t2ti.com
10
Curso Java Starter

mtodos sem nenhuma descrio. Como implementar isto?


Para inserirmos texto na documentao devemos adicionar ao cdigo como se
fossem comentrios. Para abrir o texto utilize /** , para cada linha adicional utilize
* e para fechar utilize */. Neste texto tambm pode-se definir o autor, parmetros,
verso, retorno, etc. Para isto, utilizamos o carectere @ seguido do comando
javadoc. Ex.:
@author quem o autor da classe, mtodo, etc
@param parmetro que o mtodo recebe
@return o que o mtodo retorna
@version verso da classe
@throws quais as excees que podem ser geradas
@since a partir de qual verso est disponvel

Vamos documentar a nossa classe CarroPasseio:


package veiculo;

/**
* Classe que define o comportamento de um Carro de Passeio
* @author Cludio
*
*/
public class CarroPasseio {

/**
* Este mtodo acelera o carro
*
*/
public void acelerar(){
//cdigo...
}

/**
* Frea o carro de acordo com a intensidade informada
* @param intensidade - intensidade da freada.
*/
public void frear(int intensidade){
//cdigo
}

/**
* Retorna a velocidade atual do veculo
* @return velocidade do veculo
*/
public int getVelocidade(){
//cdigo...
return 0;
}
}
Aps gerar o javadoc com o mesmo comando utilizado anteriormente, vemos
o resultado nas duas figuras seguintes:

www.t2ti.com
11
Curso Java Starter

Perceba, acima, que agora temos as descries do mtodos.

www.t2ti.com
12
Curso Java Starter

Arquivos JAR

Depois que implementamos uma aplicao, vamos ter que distribu-la. Mas j
imaginou seu sistema com dezenas de pacotes e classes, e ter que mandar todos
esses arquivos para o cliente? Fica meio complicado no ?
Normalmente as aplicaes Java so distribudas em arquivos JAR, que um
arquivo compactado no formato ZIP, mas com a extenso .jar.
Vamos criar duas classes e criar um arquivo JAR contendo essas classes:

public class Professor {

public static void main(String args[]){


System.out.println("Primeiro arquivo JAR criado!");
}
}

public class Aluno {

public void aprender(){


//cdigo...
}
}

Depois de compilada as classes, temos elas como mostra a figura abaixo:

Agora vamos criar o arquivo JAR com as duas classes. Usamos o seguinte
comando:

jar cvf PrimeiroJar.jar Aluno.class Professor.class

www.t2ti.com
13
Curso Java Starter

onde:
cvf --> opes do comando jar (c = criar novo arquivo, v = mostrar o
andamento do arquivamento, f = especificar o nome do arquivo gerado)
PrimeiroJar.jar --> nome do arquivo que ser gerado
Aluno.class e Professor.class --> classes que sero arquivadas.

Ok, agora as duas classes foram arquivadas no arquivo PrimeiroJar.jar. Fica


bem melhor distribuir a aplicao assim. Mas como vamos executar esta aplicao?
Para isso vamos usar a opo -jar do comando java.

Opa, o que aconteceu? Nossa aplicao no funcionou. Por que?


Quando a JVM executa um arquivo JAR, ela procura no arquivo chamado
manifest.mf para saber qual a classe ela deve executar primeiro(a que contm o
mtodo main). Esse um arquivo txt que alm de informar qual a classe main,
tem a verso, bibliotecas, etc. Vamos criar este arquivo para a nossa aplicao:

www.t2ti.com
14
Curso Java Starter

A primeira linha do arquivo contm a verso do arquivo manifest. Na segunda


linha definimos a classe que contm o mtodo main. A ltima linha do arquivo deve
estar em branco. Salvamos esse texto com o nome manifest.mf. Agora temos os
seguintes arquivos:

Vamos agora incluir o manifest em nosso arquivo JAR:

Perceba que agora inclumos a opo m onde temos que indicar o arquivo
manifest e o nome do arquivo manifest.mf.
Vamos executar nossa aplicao para ver o que acontece:

Beleza, agora sim, nossa aplicao funcionou e poderemos distribu-la em um

www.t2ti.com
15
Curso Java Starter

nico arquivo.
Pode ser que em um arquivo JAR no tenha nenhuma classe que contenha o
mtodo main. Este arquivo pode ser um framework, um driver JDBC, uma biblioteca,
etc.
Por exemplo, quando vamos utilizar o hibernate temos que adicionar ao
CLASSPATH o arquivo JAR que contm as bibliotecas do mesmo.
Agora voc deve tentar resolver a lista de exerccios abaixo. Qualquer
dificuldade envie para a lista de discusso.

Exerccios

Aprenda com quem tambm est aprendendo, veja e compartilhe as suas


respostas no nosso Frum:

Exerccios Mdulo 06 Documentao Java Consulta e JavaDOC

01 Para ir se acostumando$ e aprender um pouco mais sobre as classes do


Java, consulte no link http://java.sun.com/javase/6/docs/api/ as especificaes das
classes java.util.GregorianCalendar e java.lang.Math.

02 Crie uma classe chamada ImportarTexto que esteja no pacote


texto.util e que contenha os mtodos importarArquivo e filtrarDados. Gere a
documentao dessa classe, inclundo os comandos javadoc @param e @return.

03 No prompt de comando digite javadoc -help e veja as opes deste


utilitrio.

04 No prompt de comando digite jar e veja as opes deste utilitrio.

05 Gere um arquivo JAR que contenha a classe criada no exerccio 2.

06 Implemente na classe criada no exerccio 2 o mtodo main contendo a


linha javax.swing.JOptionPane.showMessageDialog(null, "Teste de arquivo JAR");.
Crie um arquivo manifest.mf definindo a classe ImportarTexto como a classe
principal e gere o arquivo JAR.

www.t2ti.com
16
Curso Java Starter

07 Se estiver utilizando o windows, abra o windows explorer e navegue


at a pasta onde est o arquivo JAR gerado no exerccio anterior. Clique duas vezes
neste arquivo e veja o que acontece.

www.t2ti.com
17
Curso Java Starter

Mdulo
Orientao a Objetos
07 Herana, Sobreescrita e
Polimorfismo

Introduo

Em relao ao paradigma Orientado a Objetos ns j vimos o que uma


Classe, aprendemos tambm que um objeto nada mais do que a instanciao de
uma classe e que um dos pilares da Orientao a Objetos o encapsulamento.
Neste mdulo e no prximo ns iremos continuar nossos estudos
relacionados aos conceitos fundamentais da programao Orientada a Objetos. A
seguir estudaremos Herana, Sobreescrita e Polimorfismo.

Herana

No paradigma orientado a objetos podemos definir um conjunto de classes


em uma estrutura hierrquica onde cada uma das classes herda caractersticas da
suas superiores nesta estrutura.
No mundo real temos que uma pessoa herda caractersticas de seus pais
que herdaram de seus avs e assim por diante. Respeitando as limitaes das
linguagens de programao, o que acontece quando utilizamos herana no nosso
cdigo uma tentativa de implementar esta propriedade da natureza.
Para ficar mais claros vamos partir para um exemplo. Imagine que
estivssemos implementando um programa que fosse utilizado em um concessionria
de veculos. Esta concessionria vende carros de passeio, jipes e veculos utilitrios.
Para implementar as classes destes veculos poderamos criar trs classes distintas,
A seguir a classe Jipe:

public class Jipe {

private String marca;


private Double capacidadeTanqueCombustivel;

public Double getTanqueCombustivel()


{
return capacidadeTanqueCombustivel;

www.t2ti.com
3
Curso Java Starter

}
public void setTanqueCombustivel(Double capacidadeTanqueCombustivel)
{
this.capacidadeTanqueCombustivel = capacidadeTanqueCombustivel;
}
public String getMarca() {
return marca;
}
public void setMarca(String marca) {
this.marca = marca;
}

public void acelerar()


{
//Cdigo aqui
}
public void frear()
{
//Cdigo aqui
}

public void ligarTracao4x4()


{
//Cdigo aqui
}
}

A classe que representa o nosso carro de passeio:

public class CarroPasseio {

private String marca;


private Double capacidadeTanqueCombustivel;

public Double getTanqueCombustivel()


{
return capacidadeTanqueCombustivel;
}
public void setTanqueCombustivel(Double capacidadeTanqueCombustivel)
{
this.capacidadeTanqueCombustivel = capacidadeTanqueCombustivel;
}
public String getMarca()
{
return marca;
}
public void setMarca(String marca)
{
this.marca = marca;
}

public void acelerar()


{
//Cdigo aqui
}
public void frear()
{
//Cdigo aqui
}

public void ligarArCondicionado()


{
//Cdigo aqui
}
}

E, finalmente, a classe que representa o nosso veculo utilitrio:

public class Utilitario {

private String marca;


private Double capacidadeTanqueCombustivel;

www.t2ti.com
4
Curso Java Starter

public Double getTanqueCombustivel()


{
return capacidadeTanqueCombustivel;
}
public void setTanqueCombustivel(Double capacidadeTanqueCombustivel)
{
this.capacidadeTanqueCombustivel = capacidadeTanqueCombustivel;
}
public String getMarca()
{
return marca;
}
public void setMarca(String marca)
{
this.marca = marca;
}

public void acelerar()


{
//Cdigo aqui
}
public void frear()
{
//Cdigo aqui
}

public void ligarFarolMilha()


{
//Cdigo aqui
}
}

Perceba que, nas linhas destacadas em amarelo, temos as caractersticas


que dizem respeito a apenas um dos tipos de veculos, isto , no nosso modelo,
apenas jipes tm trao 4x4, somente os carros de passeio tm opo de ligar o ar
condicionado e farol de milha uma caracterstica existente apenas nos veculos
utilitrios
Todas os demais estados e comportamentos voc ainda lembra o que so
estado e comportamento de um objeto? so idnticos, na verdade para criar estas
trs classes foi realizado uma simples cpia e cola dos membros que so iguais. Isto
vlido, por enqanto, afinal de contas estas caractersticas permanecero idnticas
para os trs tipos (Jipe, Carro de Passeio e Utilitrio).
Agora vamos explorar um pouco mais o nosso modelo, a nossa
concessionria vai comear a vender outros 5 tipos de veculos diferentes, cada um
com suas peculiaridades, l vamos ns criar mais 5 classes e copiar e colar mais 5
vezes! E mais, o cliente do software identificou uma caracterstica importante dos
veculos que deve ser adicionada ao modelo, o cdigo do chassi. L vamos ns de
novo implementar mais 8 afinal so 5 novos veculos mais os 3 anteriores
atributos com getter e setter para contemplar esta caracterstica.
Na verdade nada disto seria necessrio se ns tivssemos utilizado
corretamente o conceito de herana da programao Orientada a Objetos. Perceba
que com exceo das caractersticas que esto grifadas em amarelo todas as demais

www.t2ti.com
5
Curso Java Starter

so comuns a todos os veculos, ou seja, possvel que tenhamos uma superclasse


(classe Pai) Veiculo e que todas as demais herdem estas caractersticas comuns dela.
A nossa classe Veiculo ficaria da seguinte forma:

public class Veiculo {

private String marca;


private Double capacidadeTanqueCombustivel;

public Double getTanqueCombustivel() {


return capacidadeTanqueCombustivel;
}

public void setTanqueCombustivel(Double capacidadeTanqueCombustivel) {


this.capacidadeTanqueCombustivel = capacidadeTanqueCombustivel;
}

public String getMarca() {


return marca;
}

public void setMarca(String marca) {


this.marca = marca;
}

public void acelerar() {


//Cdigo aqui
}

public void frear() {


//Cdigo aqui
}

Tudo o que era comum a todos os veculos foi concentrado na classe


Veiculo. Para que as demais classes herdem estas caractersticas ns devemos
utilizar a palavra reservada extends.
As novas classes tm como superclasse a classe Veiculo:

public class Jipe extends Veiculo{

public void ligarTracao4x4()


{
//Cdigo aqui
}
}

public class CarroPasseio extends Veiculo{

public void ligarArCondicionado()


{
//Cdigo aqui
}
}

public class Utilitario extends Veiculo {

public void ligarFarolMilha()


{
//Cdigo aqui
}
}

www.t2ti.com
6
Curso Java Starter

Graficamente podemos representar esta hierarquia de classes da seguinte


forma:

Nesta nova hierarquia de classes toda a subclasse de Veiculo ir


compartilhar as suas caractersticas, dizemos que um jipe, carro de passeio ou
utilitrio so todos do tipo Veiculo. E da mesma forma toda a subclasse de Jipe ir
herdar as caractersticas tanto de Veiculo quanto de Jipe.
O exemplo abaixo mostra como, apesar de no ser declarado
especificamente na classe Jipe, posso acessar atravs do getter o atributo
capacidadeTanqueCombustivel:

Jipe jipe = new Jipe();


Double capacidadeTanqueJipe = jipe.getCapacidadeTanqueCombustivel();
jipe.setCapacidadeTanqueCombustivel(48.0);

Percebeu!? No exemplo acima estou manipulando o atributo atravs dos


mtodos (getter e setter) sem t-los declarados explicitamente na classe Jipe pois, o
compilador sabe que na verdade estou herdando estas caractersticas da classe
Veiculo.
Esta hierarquia de classes garante que todas as mudanas efetuadas na
classe Veiculo se propagam para as suas subclasses. Por exemplo, se for solicitado
adicionar o comportamento buzinar, e este comportamento for uma caractersticas
que todos os veculos devem ter, ento basta adicion-lo a classe Veiculo que
automaticamente todas as subclasses compartilharo a mesma funcionalidade.

Abaixo temos o exemplo desta modificao na classe Veiculo:

public class Veiculo {

private String marca;


private Double capacidadeTanqueCombustivel;

www.t2ti.com
7
Curso Java Starter

//Getters, setters e demais mtodos aqui...

public void buzinar()


{
System.out.println("Bmmmm");
}

}
E agora o meu Jipe tambm buzina:

Jipe jipe = new Jipe();


Double capacidadeTanqueJipe = jipe.getCapacidadeTanqueCombustivel();
jipe.setCapacidadeTanqueCombustivel(48.0);
jipe.buzinar();

Desta forma ns evitamos aquele super-trabalho de copiar, colar e manter


vrias classes cada vez que uma alterao solicitada, concentramos tudo o que
possvel e pertinente na nossa classe Veiculo e realizamos a manuteno do cdigo
em apenas um ponto da aplicao.
Assim, a herana viabiliza o reuso do cdigo existente pois, como podemos
perceber o cdigo da classe Veiculo reutilizado por todas as suas subclasses e, ainda
mais, podemos ter uma hierarquia de herana de tamanho indefinido onde todas as
subclasses iro sempre herdar caractersticas das superclasses at a raiz da estrutura
hierrquica (classe do topo da hierarquia).
Vamos brincar um pouco com o nosso modelo, imagine que fossmos
vender o nosso software de gerncia de concessionrias para uma concessionria
localizada em um pas que esteja em uma zona conflituosa e, alm destes veculos a
concessionria vende tambm tanques de guerra - agora eu apelei! :) - portanto
devemos adicionar a nossa hierarquia mais uma classe.
A classe que representa um tanque de guerra fica da seguinte forma:

public class TanqueGuerra extends Veiculo {

public void atirarMetralhadora()


{
//Cdigo aqui
}

public void atirarCanhao()


{
//Cdigo aqui
}
}

www.t2ti.com
8
Curso Java Starter

Graficamente a nova hierarquia de classes a seguinte:

E novamente eu sei que a minha classe TanqueGuerra tambm possui as


caractersticas herdadas da classe Veiculo, ou seja, alm de atirar com a metralhadora
e o canho caractersticas prprias deste tipo de veculo o nosso tanque de
guerra poder buzinar, acelerar, frear e etc.
Abaixo temos um exemplo do uso da classe TanqueGuerra:

TanqueGuerra osorio = new TanqueGuerra();


osorio.atirarCanhao();//derivado da classe TanqueGuerra
osorio.buzinar();//derivado da classe Veiculo

Agora ns podemos pensar o seguinte, o som emitido pela buzina


(Bmmmm) fica bem para um Jipe, Utilitrio e at quem sabe um Tanque de
Guerra, mas nunca uma senhora de idade iria adquirir um carro de passeio com uma
buzina deste tipo.
Sendo assim ns precisamos modificar o som da buzina apenas para os
carros de passeio de forma a deix-la mais condizente com a realidade do uso deste
veculo.
Para isto devemos conhecer mais um dos fundamentos da Orientao a
Objetos a sobreescrita de mtodos.

Sobreescrita (override)

A sobreescrita de mtodos uma caracterstica que permite alterao do


comportamento de uma superclasse pelas suas subclasses. Ao sobreescrevermos
um mtodo ns estamos fornecendo uma nova implementao para o mesmo
comportamento.
Para exemplificar vamos alterar o comportamento da nossa buzina para que
seja mais adeqada ao um carro de passeio. A classe Veiculo permanece do mesmo
jeito, modificamos apenas a classe CarroPasseio conforme abaixo:

www.t2ti.com
9
Curso Java Starter

public class CarroPasseio extends Veiculo{

public void ligarArCondicionado()


{
//Cdigo aqui
}

public void buzinar()//Estamos sobreescrevendo o mtodo buzinar() da superclasse Veiculo


{
System.out.println("Fon fon");
}

E ao executarmos o main abaixo:

public static void main(String[] args) {

TanqueGuerra osorio = new TanqueGuerra();


osorio.buzinar();
CarroPasseio carroMadame = new CarroPasseio();
carroMadame.buzinar();

}
Obtemos a seguinte sada no console:
TanqueGuerra
CarroPasseio
Bmmmm
Fon fon

Perceba que o som emitido pelo tanque de guerra continuou o mesmo,


derivado da classe Veiculo, porm o som emitido pelo carro de passeio mudou, ou
seja, alteramos o comportamento pr-definido para o mtodo buzinar().
Nesta situao o mtodo buzinar da classe Veiculo completamente
ignorado e substitudo pelo da classe CarroPasseio, porm pode haver situao que
seja interessante a manuteno da implementao existente com adio de
implementao prpria.
Para que isto seja possvel ns devemos, ao sobreescrever o mtodo,
adicionar a palavra reservada super ao corpo do mtodo que estamos fornecendo
nova implementao e invocar o mesmo mtodo da superclasse.
No exemplo abaixo utilizamos a implementao do mtodo buzinar da
superclasse e ao mesmo tempo adicionamos nova implementao:

public class TanqueGuerra extends Veiculo {

public void atirarMetralhadora()


{
//Cdigo aqui
}

public void atirarCanhao()


{
//Cdigo aqui

www.t2ti.com
10
Curso Java Starter

public void buzinar()


{
super.buzinar();
System.out.println("BMMMMMMM");
}
}

A palavra reservada super uma referncia a superclasse. Ao executarmos


este mtodo a JVM ir primeiro invocar e executar o mtodo da superclasse para
depois continuar a execuo local.
Ao sobreescrevermos um mtodo o modificador de acesso neste caso
public nunca pode ser mais restritivo do que o do mtodo que est sendo
sobreescrito, ou seja, no podemos alterar o modificador de acesso de forma que o
mtodo tenha sua visibilidade reduzida, por exemplo, se tentarmos mudar a
assinatura do mtodo buzinar, conforme abaixo, o compilador no ir permitir:

protected void buzinar()

No entanto o inverso vlido, podemos aumentar a visibilidade de um


mtodo, ou seja, se um mtodo for declarado protected e aumentarmos a
visibilidade (public) dele ao sobreescrevermos no teremos problemas com o
compilador.

Sobreescrever diferente de sobrecarregar (overload)

Sobreescrever diferente de sobrecarregar um mtodo. Um mtodo s


sobreescrito se a assinatura do mesmo mantida intacta, isto , o tipo de retorno e
os parmetros (inclusive a seqncia) no so alterados.
Observe a classe CarroPasseio:

public class CarroPasseio extends Veiculo{

public void ligarArCondicionado()


{
//Cdigo aqui
}

public void buzinar(String som)


{
System.out.println(som);
}

Observe o que acontecer ao executarmos o cdigo abaixo:

www.t2ti.com
11
Curso Java Starter

public static void main(String[] args) {

CarroPasseio carroMadame = new CarroPasseio();


carroMadame.buzinar();
carroMadame.buzinar("Fon! Fon!");

O resultado desta execuo o seguinte:

Bmmmm
Fon! Fon!

Observe que o nosso novo mtodo (grifado em amarelo) est


sobrecarregando o mtodo j existente, na verdade temos dois mtodos buzinar, com
e sem parmetros, respectivamente, o mtodo da classe CarroPasseio e o mtodo
derivado (herdado) da classe Veiculo.
A sobrecarga de mtodo cria um mtodo novo na classe mantendo o
mtodo existente.

Polimorfismo

O polimorfismo, que significa muitas formas, permite que uma mesma


referncia se comporte de formas diferentes. Utilizando corretamente o polimorfismo
ns podemos fazer o cdigo ficar mais claro, genrico e, portanto, reutilizvel.
Segue abaixo um exemplo:

public class MainModulo09 {

/**
* @param args
*/
public static void main(String[] args) {

Veiculo veiculo = criarVeiculo(args[0]);


veiculo.buzinar();

public static Veiculo criarVeiculo(String tipo)


{
if(tipo == null)
{
return new CarroPasseio();
}else if(tipo.equals("utilitario"))
{
return new Utilitario();
}else if(tipo.equals("tanque"))
{
return new TanqueGuerra();
}else if(tipo.equals("passeio"))
{
return new CarroPasseio();

www.t2ti.com
12
Curso Java Starter

}
return new Utilitario();
}

A invocao do mtodo buzinar() na varivel veiculo feita de forma


polimrfica, isto , pode possuir diversos comportamentos diferentes. O resultado
desta invocao ser apenas conhecido em tempo de execuo pois, dependendo do
parmetro de entrada do mtodo main o objeto retornado pelo mtodo criarVeiculo()
ser de tipos diferentes.
Perceba que a varivel veiculo do tipo Veiculo, ou seja, ela pode
referenciar objetos das classes Jipe, CarroPasseio, TanqueGuerra e Utilitario, afinal,
conforme visto, todas estas classes so tambm do tipo Veiculo (Herana).
A JVM s conhecer a referncia da varivel veiculo em tempo de
execuo, que ser dependente do parmetro de entrada do mtodo main, ou seja, a
JVM at sabe que em tempo de execuo esta varivel ir referenciar um objeto do
tipo Veiculo, ou uma de suas subclasses, porm ela no sabe qual dos tipos de Veiculo
ser (Jipe, TanqueGuerra, Utilitario ou CarroPasseio).
Durante a execuo da aplicao a JVM ir identificar qual tipo a varivel
est referenciando e assim ir invocar a implementao do mtodo buzinar()
adequada.
Observe abaixo a execuo do cdigo:

Veja que, conforme explicado, durante cada execuo do programa a JVM

www.t2ti.com
13
Curso Java Starter

identificou a correta implementao do mtodo buzinar() neste caso respectivamente


as implementaes da classe TanqueGuerra e CarroPasseio.
Se, por acaso, o mtodo buzinar() no tivesse sido sobreescrito em
nenhuma das subclasses (TanqueGuerra e CarroPasseio) a JVM ento iria invocar a
implementao existente na classe Veiculo.
Ao declararmos a varivel veiculo utilizamos o tipo Veiculo, superclasse
das demais classes, observe o trecho de cdigo abaixo:

Veiculo veiculo = criarVeiculo(args[0]);


veiculo.buzinar();
veiculo.ligarArCondicionado();

A situao acima identificada resulta em erro de compilao, isto acontece


porque o mtodo ligarArCondicionado() no faz parte da classe Veiculo ou de uma
de suas superclasses, ou seja, o compilador verifica se o mtodo existe em tempo
de compilao.
Desta forma, mesmo que voc tenha certeza que naquele momento a
varivel far referncia um objeto do tipo CarroPasseio, o compilador no ir aceitar
este tipo de construo. No entanto existem solues para isto, a primeira e mais
simples substituir o tipo da varivel, conforme abaixo:
K
O

CarroPasseio veiculo = criarVeiculo(args[0]);


veiculo.buzinar();
veiculo.ligarArCondicionado();

A segunda forma executando um cast, a idia a mesma do cast de tipos


primitivos porm, neste caso, ns avisamos ao compilador que a varivel faz
referncia a uma das subclasses da hierarquia de classes, observe a construo
abaixo:

Veiculo veiculo = criarVeiculo(args[0]);


veiculo.buzinar();
((CarroPasseio)veiculo).ligarArCondicionado();
O
K

Podemos dizer que o compilador entende algo como: Opa?! Beleza! Se


voc est garantindo que eu vou encontrar um CarroPasseio neste endereo ento eu
deixo voc invocar este mtodo porm espero que saiba o que est fazendo pois se,
em tempo de execuo, a referncia for de outro tipo a JVM ir emitir uma exceo
bem espalhafatosa.

www.t2ti.com
14
Curso Java Starter

Modificador final

O modificador final quando utilizado em classes ou mtodos bloqueia,


respectivamente, a extenso e a sobreescrita, isto , utilizamos este modificador
quando no desejamos que nossa classe tenha subclasses ou o mtodo seja
sobreescrito.
Devido s suas caractersticas este modificador deve ser utilizado com
parcimnia e sabedoria pois ele vai contra um dos pilares da orientao a objetos:
Reuso de cdigo atravs da herana e/ou sobreescrita.
Abaixo segue um exemplo do uso:

public final class Jipe extends Veiculo{

public void ligarTracao4x4()


{
//Cdigo aqui
}

public void buzinar()


{
System.out.println("Buzina jipe");
}
}

Conforme dito anteriormente, ao adicionar o modificador final a declarao


da classe estou inviabilizando qualquer tipo de estenso por outras classes, isto ,
apesar da classe Jipe estender a classe Veiculo, nenhuma outra classe poder
estender, ser subclasse, da classe Jipe.
Em mtodos a aplicao deste modificador feita da seguinte forma:

public class Jipe extends Veiculo{

public void ligarTracao4x4()


{
//Cdigo aqui
}

public final void buzinar()


{
System.out.println("Buzina jipe");
}
}

Agora a classe Jipe pode ser estendida porm qualquer uma de suas
subclasses no poder sobreescrever o mtodo buzinar(). Isto interessante quando
desejamos que determinado comportamento no seja alterado em hiptese nenhuma.
Nos pacotes bsicos da linguagem Java existem diversas classes que so
modificadas pelo final, temos como exemplo a classe String e a classe Math.

www.t2ti.com
15
Curso Java Starter

Se foi dito que o modificador final vai contra os pilares da Orientao a


Objetos porque as prprias classes desenvolvidas pelos gurus da SUN utilizam este
modificador?
A resposta a seguinte, quando estamos manipulando uma String ns
devemos ter certeza que o comportamento esperado ser encontrado, isto , ao
contrrio de outras classes para a classe String ns esperamos um comportamento
estvel e consistente ao longo do tempo. Imagine os problemas decorrentes do uso de
uma String que se comporta de maneira diferente da esperada?!
Da mesma forma com a classe Math, imagine os problemas decorrentes da
realizao de uma operao matemtica em que o resultado obtido seja diferente do
esperado pois, um outro programador estendeu a classe e resolveu modificar as
implementaes e por acaso ele no sabia tanto de matemtica quanto achava que
sabia :).
Nestes casos o modificador final utilizado a fim de evitar um mal maior
aos programas em detrimento ao melhor uso do paradigma orientado a objetos.
Quando voc for utilizar, se for utilizar, o modificador final pense sempre
nas implicaes e nos objetivos que espera obter com o seu uso.

Classe Object

Para encerrar este mdulo vejamos a classe Object. Em Java todas as


classes, eu disse todas as classes! String, Math, as minhas classes, as suas classes e
etc. estendem a classe Object e portanto so do tipo Object tambm.
Desta forma mesmo quando declaramos uma classe conforme abaixo:

public class Classe {

Implicitamente o compilador interpreta esta classe como:

public class Classe extends Object{

Por isso todos os objetos objetos e no tipos primitivos! sempre iro


passar (true) por um teste conforme abaixo:

www.t2ti.com
16
Curso Java Starter

if(qualquerObjeto instanceof Object)


{
//Sempre entrar neste bloco
}

L-se: Todo objeto instncia da classe Object.


A seguir temos os alguns dos principais mtodos da classe Object:

Mtodo Descrio
equals() Indica quando um objeto igual a este
toString() Retorna a representao textual deste objeto
hashCode() Retorna o cdigo hash para este objeto

Todos estes mtodos podem ser sobreescritos, e muitas vezes o so, os


mtodos equals() e hashCode sero abordados no mdulo de Colees. Abaixo temos
um exemplo da utilizao do mtodo toString():

public class Jipe extends Veiculo{

public void ligarTracao4x4()


{
//Cdigo aqui
}

public final void buzinar()


{
System.out.println("Buzina jipe");
}

public String toString()


{
return "toString do Jipe";
}
}

Observe que o mtodo toString(), da classe Object, est sendo sobreescrito


pela minha classe Jipe, a seguir temos trecho de cdigo que imprime um objeto do
tipo Jipe:

Veiculo veiculo = new Jipe();


System.out.println(veiculo);

O resultado deste cdigo o seguinte:

toString do Jipe

Quando imprimimos um objeto, a JVM invoca o mtodo toString() do


objeto, se este mtodo no foi sobreescrito ento o mtodo toString() invocado o da

www.t2ti.com
17
Curso Java Starter

classe Object.
Se no tivesse sido sobreescrito um dos possveis resultados a ser obtido
seria este:

Jipe@10385c1

O que uma representao textual significativa do objeto para a JVM,


mas no para ns seres humanos :).

EXERCCIOS

Aprenda com quem tambm est aprendendo, veja e compartilhe as suas


respostas no nosso Frum:

Exerccios Mdulo 07 Herana, Sobreescrita e Polimorfismo

1 Crie uma hierarquia de classes conforme abaixo com os seguintes atributos e


comportamentos (observe a tabela), utilize os seus conhecimentos e distribua
as caractersticas de forma que tudo o que for comum a todos os animais fique
na classe Animal:

Cachorro Cavalo Preguica


Possui Nome Possui Nome Possui Nome
Possui Idade Possui Idade Possui Idade
Deve emitir som Deve emitir som Deve emitir som
Deve correr Deve correr Deve subir em rvores

2 Implemente um programa que crie os 3 tipos de animais definidos no exerccio


anterior e invoque o mtodo que emite o som de cada um de forma polimrfica,
isto , independente do tipo de animal.

www.t2ti.com
18
Curso Java Starter

3 Implemente uma classe Veterinario que contenha um mtodo examinar() cujo


parmetro de entrada um Animal, quando o animal for examinado ele deve
emitir um som, passe os 3 animais com parmetro.
4 Crie uma classe Zoologico, com 10 jaulas (utilize um array) coloque em cada
jaula um animal diferente, percorra cada jaula e emita o som e, se o tipo de
animal possuir o comportamento, faa-o correr.
5 Resolva a seguinte situao utilizando os conceitos aprendidos. Uma empresa
quer manter o registro da vida acadmica de todos os funcionrios, o modelo
deve contemplar o registro das seguintes informaes, de forma incremental:
5.1 Para o funcionrio que no estudou, apenas o nome e o cdigo funcional;
5.2 Para o funcionrio que concluiu o ensino bsico, a escola;
5.3 Para o funcionrio que concluiu o ensino mdio, a escola;
5.4 Para o funcionrio que concluiu a graduao, a Universidade;
6 Estenda o modelo implementado no exerccio anterior de forma que todo
funcionrio possua uma renda bsica de R$ 1000,00 e:
6.1 Com a concluso do ensino bsico a renda total renda bsica
acrescentada em 10%;
6.2 Com a concluso do ensino mdio a renda total a renda do nvel anterior
acrescentada em 50%;
6.3 Com a concluso da graduao a renda total a renda do nvel anterior
acrescentada em 100%;
6.4 Todos os clculos so efetuados sempre sobre a ltima renda obtida.
7 Crie um programa que simule uma empresa com 10 funcionrios, utilize um
array, sendo que a escolaridade dos funcionrios distribuda da seguinte
forma: 40% ensino bsico, 40% ensino mdio e 20% nvel superior. Calcule os
custos da empresa com salrios totais e por nvel de escolaridade, utilize a
classe funcionrio desenvolvida no exerccio anterior.
8 Faa uma hierarquia de Comisses, crie as comisses de Gerente, Vendedor e
Supervisor. Cada uma das comisses fornece um adicional ao salrio conforme
abaixo:
8.1 Gerente: R$1500,00
8.2 Supervisor: R$600,00
8.3 Vendedor: R$250,00
9 Adicione a classe funcionrio um atributo referente as comisses desenvolvidas
no exerccio anterior. Corrija o mtodo renda total de forma que ele some ao

www.t2ti.com
19
Curso Java Starter

valor da renda calculada o adicional da comisso do funcionrio.


10 Refaa o exerccio 7 considerando que 10% dos funcionrios so Gerentes,
20% so supervisores e 70% so vendedores.
11 Sobreescreva o mtodo toString de forma que ele imprima o nome do
funcionrio, a comisso e o salrio total. Imprima todos os funcionrios da
empresa criada no exerccio 7.

www.t2ti.com
20
Curso Java Starter

Apresentao

O Curso Java Starter foi projetado com o objetivo de ajudar quelas pessoas
que tm uma base de lgica de programao e desejam entrar no mercado de
trabalho sabendo Java,

A estrutura do curso formada por mdulos em PDF e por mini-cursos em


vdeo. O aluno deve baixar esse material e estud-lo. Deve realizar os exerccios
propostos. Todas as dvidas devem ser enviadas para a lista de discusso que est
disponvel para inscrio na pgina do Curso Java Starter no site www.t2ti.com. As
dvidas sero respondidas pelos instrutores Albert Eije, Cludio de Barros e Miguel
Kojiio, alm dos demais participantes da lista.

Nosso objetivo que aps o estudo do Curso Java Starter o aluno no tenha
dificuldades para acompanhar um curso avanado onde poder aprender a
desenvolver aplicativos para Web, utilizando tecnologias como Servlets e JSP e
frameworks como Struts e JSF, alm do desenvolvimento para dispositivos mveis.

Albert Eije trabalha com informtica desde 1993. Durante esse perodo j
trabalhou com vrias linguagens de programao: Clipper, PHP, Delphi, C, Java, etc.
Atualmente mantm o site www.alberteije.com.

Cludio de Barros Tecnlogo em Processamento de Dados.

Miguel Kojiio bacharel em Sistemas de Informao, profissional certificado


Java (SCJP 1.5).

O curso Java Starter surgiu da idia dos trs amigos que trabalham juntos em
uma instituio financeira de grande porte.

www.t2ti.com
3
Curso Java Starter

Mdulo Classes Abstratas, Interfaces

08
e
Excees

Introduo

Estamos alcanando o fim da nossa trilha que apenas o incio do


maravilhoso mundo que Java nos oferece e este momento bastante adeqado
para introduzirmos os conceitos de classes Abstratas, Interfaces e Excees. Classes
Abstratas e Interfaces so estruturas muito importantes quando programamos
Orientado a Objetos com Java e, visto que j conhecemos os demais fundamentos da
linguagem (reuso, herana, polimorfismo, encapsulamento, mtodos, etc.), est na
hora de aplicarmos estes recursos existentes na linguagem.
Uma das diferenas mais evidentes entre um bom e um mal programa o
tratamento de excees, isto , a capacidade que o seu programa tem de responder a
situaes inesperadas. Quando o tratamento de excees feito adeqadamente o
seu programa fica mais robusto e ao mesmo tempo a usabilidade usabilidade nada
mais do que a facilidade que um usurio tem em utilizar o programa aumenta
sensivelmente.
Porm antes de iniciarmos o novo contedo vamos conhecer uma
importante caracterstica do construtor com parmetros levando em conta o uso de
herana.

Herana - continuao

Ns j vimos que uma classe herda de sua classe pai as suas caractersticas
porm a subclasse no herda o construtor, isto , o construtor individual para cada
classe.
Sempre que o construtor de uma classe invocado ele invoca , quando no
explicitado, implicitamente o construtor da superclasse. Desta forma o construtor da

www.t2ti.com
4
Curso Java Starter

classe Object sempre invocado, pois todas as classes estendem dela. Observe o
cdigo abaixo referente a classe Veiculo:

public class Veiculo {

private String marca;


private Double capacidadeTanqueCombustivel;

public Veiculo(String marca) {


this.marca = marca;
}

//Demais membros...

Quando o compilador gerar o bytecode o que ns teremos o seguinte:

public class Veiculo {

private String marca;


private Double capacidadeTanqueCombustivel;

public Veiculo(String marca) {


super();
this.marca = marca;
}

//Demais membros...

Observe que a declarao super() indica que o construtor default


construtor public e sem parmetros da superclasse est sendo invocado. Isto
acontece de forma automtica, ns no precisamos nos preocupar.
O construtor default adicionado pelo compilador quando no h construtor
declarado explicitamente, isto , se o programador no declarar um construtor o
compilador ir adicionar, implicitamente, um pblico e sem parmetros.
No entanto se for adicionado explicitamente um construtor o compilador
no ir adicionar implicitamente o construtor default, o que significa que se ns
criarmos um construtor com parmetros e estendermos a classe, obrigatoriamente
teremos que, explicitamente, invocar o construtor da superclasse passando os
parmetros.
Para ficar mais claro vamos estender a classe Veiculo que possui um
construtor com parmetros:

public class Jipe extends Veiculo{

public Jipe() {
!
}

//Demais membros...
O cdigo acima demonstrado no compila. Imagine o compilador tentando

www.t2ti.com
5
Curso Java Starter

adicionar a declarao super() porm sem sucesso. Isto acontece pois no existe
construtor sem parmetros na superclasse, existe apenas um construtor com o
parmetro marca do tipo String.
Podemos solucionar o problema apresentado de diversas maneiras, a
primeira seria invocando o construtor da superclasse e encaminhando um parmetro
padro para todas as instncias da classe Jipe:

Construtor sem parmetro


public class Jipe extends Veiculo{

public Jipe() {
super("Marca padro de jipe");
}
Invocao do construtor da superclasse
//Demais membros...

Perceba que no construtor da classe Jipe estamos invocando o construtor da


classe Veiculo e passando uma String ("Marca padro de jipe"), ou seja, todas
as instncias desta classe Jipe possuiro a mesma marca.
Outra soluo seria a implementao de um construtor na classe Jipe que
receba o mesmo parmetro repassando-o para a superclasse:

Construtor com parmetro


public class Jipe extends Veiculo{

public Jipe(String marca) {


super(marca);
}
Invocao do construtor da superclasse
//Demais membros... com repasse do parmetro recebido

Desta forma mantida a lgica implementada pela superclasse. E por fim,


uma terceira abordagem seria a mais de um construtor, observe que neste caso os
dois construtores desenvolvidos anteriormente foram mantidos:

public class Jipe extends Veiculo{

private String modelo;

public Jipe(){
super("Marca padro de jipe");
}

public Jipe(String marca) {


super(marca);
}

public Jipe(String marca, String modelo) {


super(marca);
this.modelo = modelo; Construtor novo com dois parmetros
}

//Demais membros...
Observe que, neste ltimo caso, temos um construtor sem parmetros, um

www.t2ti.com
6
Curso Java Starter

construtor que recebe o mesmo parmetro da superclasse e outro que recebe dois
parmetros (marca e modelo), ou seja, poderamos ter N-construtores, um para cada
situao.

Classes Abstratas

At este momento todas as classes que havamos desenvolvido eram


classes concretas, isto todas as nossas classes podem originar objetos. Classes
concretas so estruturas definidas e prontas para instanciarem objetos.
Uma classe abstrata se comporta de forma diferente de uma classe
concreta. Uma classe abstrata nunca pode ser instanciada de forma direta, seu
maior propsito, a razo da sua existncia, ser estendida.
Para que serve esta classe ento? Imagine a seguinte situao, ns temos
uma hierarquia de classe conforme abaixo:

Todos os animais (cachorro, cavalo e preguia) estendem da classe Animal,


no entanto, no nosso, programa a classe Animal por si s no representa nenhum tipo
de animal. Isto , esta classe representa apenas um animal genrico e ela existe
apenas para ser estendida dando origem a um animal de fato.
Nesta situao mais adeqado que seja feita a mudana na classe Animal
a fim de torn-la abstrata e inviabilizar a sua instanciao por qualquer parte do
programa. Isto realizado adicionando-se o modificador abstract conforme abaixo:

public abstract class Animal {

//corpo da classe

Observe que agora a classe Animal no pode ser instanciada indevidamente


em nenhum trecho do nosso programa, o exemplo abaixo ir produzir um erro de

www.t2ti.com
7
Curso Java Starter

compilao:

Animal animal = new Animal();


!

Desta forma ns temos certeza que durante a execuo do programa nunca


haver um objeto da classe Animal e sim, sempre, de uma de suas subclasses.
Uma classe abstrata pode possuir mtodos concretos um mtodo
concreto todo aquele possui corpo veja o exemplo abaixo:

public abstract class Animal {

private String nome;

//getters e setters...
Mtodo concreto
public void emitirSom()
{
System.out.println("Animal emitindo som");
}

}
Perceba que o mtodo emitirSom() na verdade dever ser sobreescrito por
cada uma das subclasses da classe Animal a fim de que forneam um comportamento
adeqado pois, cada tipo de animal emite um som diferente dos demais.
Porm, da forma como foi feito, esta condio no garantida pois,
podemos ter uma subclasse da classe Animal que no sobreescreve o mtodo emitir
som, no entanto existem formas de forarmos esta condio. Ao modificarmos o
mtodo com abstract impedimos que alguma das subclasses no implementem o
mtodo. Segue exemplo abaixo:

public abstract class Animal {

private String nome;

//getters e setters...
Mtodo abstrato
public abstract void emitirSom();

Agora todas as subclasses da classe Animal iro obrigatoriamente ter que


fornecer uma implementao para o mtodo emitirSom(). Alm da palavra reservada
abstract devemos encerrar o mtodo sem as chaves para que seja um mtodo

abstrato vlido.
Uma classe abstrata pode conter apenas mtodos abstratos, concretos ou
ambos. No entanto a presena de um mtodo abstrato torna, obrigatoriamente, a
classe abstrata tambm.

www.t2ti.com
8
Curso Java Starter

A extenso de uma classe Abstrata feita da mesma forma que a extenso


realizada por classes concretas:

public class Cachorro extends Animal {

public void emitirSom() {


System.out.println("au! au!");
}

Em Java no existe o conceito de herana mltipla, isto , cada classe pode


estender (extends) apenas uma superclasse de cada vez. Por exemplo, a seguinte
situao no permitida:

public class Cachorro extends Animal, Mamifero { !

No entanto podemos ter hierarquia de classes de qualquer tamanho o que


viabilizaria a extenso de diversas classes nesta estrutura.

Interfaces

Pense em uma interface como sendo uma classe totalmente abstrata, isto
que no possui mtodos concretos. Desta forma, quando uma classe implementa uma
interface ela obrigatoriamente deve implementar o conjunto de mtodos definidos
pela interface.
Do site da SUN, implementar uma interface permite a uma classe tornar-
se mais formal em relao ao comportamento que ela promete fornecer. Interfaces
formam um contrato entre a classe e o mundo exterior, e este contrato garantido
em tempo de compilao pelo compilador. Se a sua classe deseja implementar uma
interface, todos os mtodos definidos pela interface devem aparecer no corpo antes
da sua classe ser compilada.
Em sntese, quando uma classe concreta implementa uma interface ela est
garantindo que possui os mtodos especificados bem como a implementao destes,
mesmo que o corpo do mtodo seja vazio. Aqui cabe uma observao: O uso de
interfaces garante a existncia do comportamento porm no garante a sua correta
implementao.
Da mesma forma que classes, a definio de uma interface cria um novo

www.t2ti.com
9
Curso Java Starter

tipo e ns devemos utilizar interfaces quando existem determinados comportamentos


que sejam similares entre hierarquias de classes diferentes.
Veja o mtodo emitirSom() da classe abstrata Animal, agora suponha que
no mesmo programa eu tenha uma classe Bola, que por sinal tambm emite som. Em
um determinado momento do programa eu desejo invocar o mtodo emitirSom para
alguns objetos conforme a situao abaixo:

public void limpar(Object obj)


{
//Cdigo para limpar uma bola ou um animal...

if(obj instanceof Bola)


{
((Bola)obj).emitirSom();
} else if(obj instanceof Animal)
{
((Animal)obj).emitirSom();
}
}

Neste programa ns temos um mtodo que efetua a limpeza de qualquer


objeto, seja ele um animal ou uma bola, porm caso o objeto seja de um dos dois
tipos, Bola ou Animal, estes devero emitir seus sons caractersticos.
Esta situao no pode ser resolvida atravs do uso de herana j que a
classe Bola e a classe Animal no esto na mesma hierarquia de classes na verdade
at poderia ser resolvida com herana e sobreescrita, mas havemos de convir que
colocar a classe Bola e a classe Animal na mesma hierarquia um erro de projeto
logo, a soluo seria a criao da interface EmiteSom conforme abaixo:

public abstract interface EmiteSom {

public abstract void emitirSom();


}

Observe que o uso do abstract opcional tanto na classe quanto no


mtodo pois toda interface obrigatoriamente abstrata e seus mtodos tambm o
so.
A classe Animal e a classe Bola ficariam da seguinte forma:

public class Bola implements EmiteSom{ Implementao do mtodo abstrato


public void emitirSom()
{
System.out.println("Boing, boing...");
}
}

www.t2ti.com
10
Curso Java Starter

public abstract class Animal implements EmiteSom{

private String nome;


Cad a implementao?
//getters e setters...
}

Perceba o uso da palavra reservada implements que informa ao compilador


que esta classe est implementando uma interface. A classe Animal no fornece uma
implementao para o mtodo emitirSom(), ao contrrio da classe Bola, isto acontece
porque a classe Animal do tipo abstract.
Quando uma classe abstrata implementa uma interface ela pode ou no
fornecer a implementao dos mtodos oriundos da interface. Caso a classe abstrata
no fornea a implementao destes mtodos (situao existente na classe Animal),
obrigatoriamente cada subclasse concreta da classe abstrata ir ter que fornecer a
implementao.
Por exemplo, a classe Cachorro fica da seguinte forma:

public class Cachorro extends Animal {

public void emitirSom() {


System.out.println("au! au!"); Implementao do mtodo
}

}
Ento, podemos interpretar a situao da seguinte forma: A classe Animal
implementa a interface EmiteSom, mas deixou a responsabilidade pela implementao
do mtodo para a classe concreta Cachorro.
E agora o nosso mesmo mtodo limpar() utilizando a interface:

public void limpar(Object obj)


{
//Cdigo para limpar uma bola ou um animal...

if(obj instanceof EmiteSom)


{
((EmiteSom)obj).emitirSom();
}
}

Perceba que independente do tipo de objeto que vier como parmetro,


desde que ele seja do tipo EmiteSom, eu sei que ir possuir a implementao do
mtodo emitirSom() e que portanto o cdigo ser executado sem problemas, isto
tambm nos permite acabar com aquelas cadeias indesejveis de if's deixando o
cdigo mais legvel.

www.t2ti.com
11
Curso Java Starter

Excees

At agora ns criamos pequenos programas sem nos preocuparmos em


tratar possveis erros. No entanto todos aqueles que programam h algum tempo
sabem que o tratamento de erros (excees) parte fundamental da programao.
Vamos comear os nossos estudos conhecendo a forma como uma exceo
apresentada e o seu significado, observe as duas classes abaixo:

public class modulo10Main {

public static void main(String[] args)


{
new RecebeArray(args);
System.out.println("Trmino do programa!");
}
}
public class RecebeArray {

public RecebeArray(String[] array)


{
imprimirPosicao0(array);
}
public void imprimirPosicao0(String[] array)
{
! }
System.out.println(array[0]);

As setas indicam o fluxo de execuo at o ponto onde ir acontecer a


exceo (estrela) o que ocasiona a quebra no fluxo normal da aplicao. Esta
execuo pode ser entendida da seguinte forma:
Ao invocar o mtodo main, sem o envio de parmetros, instanciado um
novo objeto RecebeArray e passado como parmetro do construtor o array vazio, o
construtor por sua vez invoca um mtodo desta mesma classe (imprimirPosicao0())
repassando o parmetro recebido, este mtodo tenta imprimir o elemento da posio
0, primeira posio, e o resultado obtido uma exceo, j que o array est vazio.
Quando esta exceo acontece o programa encerrado de forma
inesperada, perceba que a ltima linha a ser executada (linha grifada em amarelo)
no percorrida devido ao trmino inesperado.
Podemos observar a visualizao da execuo desta aplicao na figura a
seguir:

www.t2ti.com
12
Curso Java Starter

A exceo foi do tipo java.Lang.ArrayIndexOutOfBoundsException que


significa a tentativa de acesso a uma posio fora dos limites do array, a seguir ele
informa que posio foi, neste caso o ndice 0 (zero).
Embaixo da definio da exceo ns temos a stacktrace que contm a
seqncia da pilha de execuo. Pela stacktrace possvel perceber quais caminhos a
execuo percorreu at alcanar a exceo.
A primeira linha da stacktrace contm a definio da exceo, a segunda
linha contm o ltimo trecho de cdigo executado com o nmero da linha no cdigo
fonte, neste caso foi a invocao do mtodo imprimirPosicao0() da classe
RecebeArray, que no cdigo fonte (arquivo RecebeArray.java) refere-se a linha 10.
A fim de construirmos programas mais robustos, poderamos tratar
situaes como esta. Para isto iremos utilizar o bloco try/catch:

try{
//Cdigo perigoso
}catch(Exception e)
{
//tratamento da exceo
}

O bloco try/catch define dois trechos de cdigo, um sujeito a erros (try) e


outro que responsvel pelo tratamento do erro caso acontea (catch). Vamos
modificar agora a nossa classe RecebeArray e adicionar este bloco ao mtodo
imprimirPosicao0():

public class RecebeArray {

public RecebeArray(String[] array)


{
imprimirPosicao0(array);
}

public void imprimirPosicao0(String[] array)


{
try{
System.out.println(array[0]);
}catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("Erro: Array vazio, execute o programa novamente" +
" passando ao menos um parmetro.");
}

www.t2ti.com
13
Curso Java Starter

}
}

E agora ao executarmos novamente este mesmo programa o usurio ir


receber uma mensagem mais significativa, observe a execuo abaixo:

Pronto! Agora ao executar o programa sem parmetros o usurio saber o


que fazer. Porm o mais interessante o seguinte, uma vez que a exceo foi tratada,
o programa continua o fluxo de execuo e termina normalmente.
Devemos observar o seguinte, esta no a nica exceo que pode
acontecer neste mtodo, vamos modificar o mtodo main() de forma que ele
encaminhe como parmetro um valor nulo (null).

public class modulo10Main {

public static void main(String[] args)


{
new RecebeArray(null);
System.out.println("Termino do programa!");
}
}

Repare que agora a nova instncia da classe RecebeArray est recebendo


como parmetro uma referncia nula, isto ocasionar uma exceo do tipo
java.lang.NullPointerException.
Vejamos o resultado da execuo deste cdigo:

Ok! O programa encerrou de forma inesperada a mensagem Termino do

www.t2ti.com
14
Curso Java Starter

programa! no foi apresentada por uma exceo pois o nosso bloco try/catch no
foi capaz de captur-la, isto aconteceu pois ele foi construdo de forma que apenas
excees do tipo java.lang.ArrayIndexOutOfBoundsException sejam tratadas.
Para corrigir este problema podemos encadear mais um bloco catch que
capture todos os tipos de excees, vejamos:

public class RecebeArray {

public RecebeArray(String[] array)


{
imprimirPosicao0(array);
}
public void imprimirPosicao0(String[] array)
{
try{
System.out.println(array[0]);
}catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("Erro: Array vazio, execute o programa novamente" +
" passando ao menos um parametro.");
}catch(Throwable t)
{
System.out.println("Mensagem do erro: "+t.getMessage());
t.printStackTrace();
}
}
}

Perceba agora que, no cdigo destacado, adicionamos mais um bloco de


catch que captura todos os tipos de excees veremos mais a frente como est
estruturada a hierarquia de classes de excees desta forma caso seja uma exceo
do tipo java.lang.ArrayIndexOutOfBoundsException ser tratado no primeiro bloco,
todos os demais tipos sero tratados no segundo bloco.
O cdigo destacado ir imprimir a mensagem (getMessage()) e na
seqncia ir imprimir a stacktrace, importante perceber novamente que aps o
tratamento da exceo pelo segundo bloco o programa encerrado normalmente.
A seguir temos a execuo do novo programa:

www.t2ti.com
15
Curso Java Starter

Todas as excees em Java derivam da classe Throwable conforme


hierarquia a seguir:

Observe que, conforme dito em mdulos anteriores, todas as classes em


Java estendem de alguma forma direta ou indiretamente da classe Object.
Nesta imagem esto representadas as trs modalidades de excees
existentes na linguagem Java: Unchecked Exception, Checked Exception e Error.

Error: Hierarquia em laranja na imagem, representam situaes


incomuns, que no so causadas pelo programa, indicam situaes que
no acontecem usualmente durante a execuo de um programa (Ex:
Estouro da pilha de execuo StackOverflowError);

Checked Exception: Hierarquia em cinza, representam situaes que,


geralmente, no so erros de programao e sim indisponibilidade de
recursos ou condio necessria para a correta execuo inexistente (Ex:
Em aplicaes distribudas existe dependncia externa de rede de

www.t2ti.com
16
Curso Java Starter

comunicao NoRouteToHostException).

Unchecked Exception (RuntimeException): Hierarquia em turquesa


(azul escuro), representam situaes que, geralmente, identificam erros
de programao (programa no robusto) ou mesmo situaes
incomuns/difceis de tratar (Ex: Acessar ndice invlido em um array
ArrayIndexOutOfBoundsException);

As checked exceptions so tratadas obrigatoriamente, isto , o compilador


s compila a classe se houver um tratamento (bloco try/catch) para aquele tipo de
exceo.
Segue quadro com relao de algumas das mais comuns excees:

Exceo Quando acontece


ArrayIndexOutOfBounds Tentativa de acesso a posio inexistente no array.
Exception
ClassCastException Tentativa de efetuar um cast em uma referncia que no classe
ou subclasse do tipo desejado.
IllegalArgumentException Argumento formatado de forma diferente do esperado pelo
mtodo.
IllegalStateException O estado do ambiente no permite a execuo da operao
desejada.
NullPointerException Acesso a objeto que referenciado por uma varivel cujo valor
null.
NumberFormatException Tentativa de converter uma String invlida em nmero.
StackOverflowError Normalmente acontece quando existe uma chamada recursiva
muito profunda.
NoClassDefFoundError Indica que a JVM no conseguiu localizar uma classe necessria
a execuo.

Jogando (throw) excees

Possivelmente em algum trecho do nosso programa, se uma determinada


condio acontecer, ns queiramos lanar uma exceo por incrvel que possa
parecer para informar que a situao esperada no aconteceu.

www.t2ti.com
17
Curso Java Starter

Vejamos um exemplo, suponha o mtodo abastecer() pertencente a uma


classe que representa um veculo. Este mtodo recebe como parmetro um Double
que representa o valor que est sendo abastecido, logo no pode haver situaes
onde o valor seja negativo. Caso esta situao acontea ns iremos lanar uma
IllegalArgumentException.

public void abastecer(Double litros)


{
if(litros < 0)
{
throw new IllegalArgumentException("Era esperado um valor maior que 0:
"+litros);
}else
{
tanque += litros;
}
}

A seta indica o uso da palavra reservada throw que responsvel por


jogar a exceo, logo a seguir ns instanciamos um objeto do tipo
IllegalArgumentException e passamos como parmetro do mtodo construtor o texto
que dever aparecer quando a stacktrace for impressa.
Veja o resultado da execuo deste mtodo passando o valor -1 (um
negativo):

Exception in thread "main" java.lang.IllegalArgumentException: Valor indevido


era esperado um valor maior que 0: -1.0
at Veiculo.abastecer(Veiculo.java:10)
at modulo10Main.main(modulo10Main.java:6)

Criando sua prpria exceo

Suponha que ao invs de utilizar a IllegalArgumentException no mtodo


abastecer(), caso o valor recebido seja negativo, ns desejemos jogar uma exceo
prpria chamada QuantidadeLitrosException, neste caso basta que utilizemos os
nossos conhecimentos em herana e faamos uma extenso da classe
RuntimeException conforme abaixo:

public class QuantidadeLitrosException extends RuntimeException


{
QuantidadeLitrosException(String mensagem)
{
super(mensagem);
}
}

www.t2ti.com
18
Curso Java Starter

A linha em destaque significa que estou invocando o construtor da


superclasse (Exception) e enviando o parmetro mensagem para ela. O novo mtodo
abastecer fica da seguinte forma:

public void abastecer(Double litros)


{
if(litros < 0)
{
throw new QuantidadeLitrosException("Valor indevido. Era esperado um valor
maior que 0: "+litros);
}else
{
tanque += litros;
}
}

A execuo deste mtodo com um valor negativo resulta em:

Exception in thread "main" QuantidadeLitrosException: Valor indevido. Era esperado um valor maior
que 0: -1.0
at Veiculo.abastecer(Veiculo.java:10)
at modulo10Main.main(modulo10Main.java:6)

Na prtica, so poucos os motivos que nos levam a criar as nossas prprias


excees, normalmente as excees existentes nas bibliotecas Java so suficientes
para a maioria das ocorrncias.

Exerccios

Aprenda com quem tambm est aprendendo, veja e compartilhe as suas


respostas no nosso Frum:

Exerccios Mdulo 08 Classes Abstratas, Interfaces e Excees

1. Crie uma classe abstrata que represente um quadriltero e receba como


parmetros do construtor os quatro valores referentes a cada lado.
2. Estenda a classe criada no exerccio 1, a subclasse deve representar um
quadrado e portanto receber como parmetro um nico valor referente aos
seus lados.
3. Estenda novamente a classe criada no exerccio 1, a subclasse deve representar
um retngulo e portanto deve receber como parmetros dois valores
diferentes.
4. Crie uma interface denominada FiguraGeometrica, adicione os mtodos calcular
rea e calcular permetro.

www.t2ti.com
19
Curso Java Starter

5. Modifique a classe abstrata criada no exerccio 1 de forma que ela implemente a


interface FiguraGeomtrica.
6. Implemente os mtodos definidos na interface FiguraGeometrica nas classes
Quadrado e Retangulo.
7. Modifique o construtor da classe Quadrado de forma que caso seja recebido um
valor igual a zero ou negativo seja jogada uma exceo do tipo
IllegalArgumentException com o seguinte texto: Valor invlido, o valor
esperado maior que 0 (zero).
8. Modifique o construtor da classe Retangulo de forma que caso seja recebido
como parmetro um valor igual a zero ou negativo ou ambos os valores
positivos idnticos porm idnticos seja jogada duas excees do tipo
IllegalArgumentException com os seguintes textos respectivamente: Valor
invlido, os valores esperados so maior que 0 (zero) e Valor invlido,
modifique um dos valores a fim de torn-los diferentes.
9. Crie um programa que solicite a entrada de 2 parmetros, crie um Quadrado e
imprima a rea e o permetro.
10.Modifique o programa desenvolvido no exerccio 9. Adicione o tratamento de
excees e caso acontea uma exceo imprima a stacktrace. Execute o
programa forando uma exceo e observe a stacktrace.
11.Modifique novamente o programa desenvolvido no exerccio 9 de forma que
caso sejam passados valores invlidos ele trate a exceo e exiba a mensagem
em um dilogo (JoptionPane).
12.Crie uma classe abstrata denominada conta corrente. Adicione os mtodos
sacar, depositar e obter saldo, adicione o atributo saldo total.
13.Estenda a classe desenvolvida no exerccio anterior. Crie a classe conta corrente
especial que contenha um atributo que represente um limite extra da conta
corrente convencional de forma que:
1. O saque debita primeiro o saldo total, na seqncia deve-se debitar o limite
do cheque especial;
2. O depsito primeiro deve creditar o limite do cheque especial, at cobrir, e
somente aps o saldo total.
14.Crie uma exceo que represente o estouro da conta corrente, modifique a
classe desenvolvida no exerccio 13 de forma que caso seja extrapolado o limite
do extra esta exceo seja lanada.
15.Crie um programa que, utilizando as classes desenvolvidas nos exerccios

www.t2ti.com
20
Curso Java Starter

anteriores (12, 13 e 14), efetue alguns saques e depsitos, tanto sobre o limite
extra quanto sobre saldo total, e ainda faa um saque que extrapole todo o
valor disponvel (limite extra + saldo total).

www.t2ti.com
21
Curso Java Starter

Mdulo

09
Colees

O Framework Collections

Dada sua importncia, colees (estruturas de dados) so encontradas em


qualquer linguagem de programao e em Java as colees recebem um tratamento
especial, neste sentido o framework Collections surgiu com a inteno de formar
uma arquitetura unificada para representao e manipulao de colees.
Mas o que o framework Collections? o conjunto de implementaes
(classes e interfaces) oferecidas no pacote java.util que fornecem as principais
funcionalidades esperadas quando trabalha-se com conjuntos de elementos
(colees).
Legal, mas o que este framework me permite fazer que eu no conseguiria
com os vetores (arrays) convencionais? Nada, na verdade todas as funcionalidades
implementadas no framework Collections podem ser obtidas atravs de uma
implementao prpria, ou seja, voc pode at fazer a sua prpria Lista, Fila ou
rvore mas sabe que isto j est pronto e acessvel neste framework, na prtica
implementaes prprias so difceis de encontrar afinal de contas tempo um
recurso valioso e o reuso um dos pilares da orientao a objetos, lembra-se?.
Em sntese, ao utilizarmos as colees j implementadas no pacote
java.util, obtemos os seguintes benefcios:

Reduo na codificao: Muitas funcionalidades esperadas durante a


manipulao de um conjunto de elementos j esto prontas;

Melhor desempenho do programa: As implementaes das


funcionalidades e estruturas de armazenamento foram feitas com o
objetivo de fornecerem um desempenho timo;

Maior qualidade do programa: Respeitando as interfaces podemos

www.t2ti.com
3
Curso Java Starter

substituir as implementaes utilizadas sem prejuzo ao resto do


programa;

Existem outros benefcios porm, para o iniciante nosso caso o


entendimento destes mais do que suficiente.
Tudo bem, entendi, importante reutilizar cdigo, tempo um recurso
escasso, as implementaes fornecidas so timas... Mas o que voc quis dizer
quando falou da arquitetura unificada? A resposta encontra-se na prxima figura:

Nesta figura temos as interfaces (razes e ns das rvores) que formam o


conjunto de interfaces disponveis. Nas folhas (retngulos com bordas mais espessas)
encontramos as classes concretas ou implementaes destas interfaces.
Esta arquitetura de interfaces forma o ncleo do Java Framework
Collections e todas as classes concretas iro derivar de uma ou mais interfaces.
interessante notar que apesar da arquitetura nica as colees
derivadas da interface Map no implementam a interface Collection no entanto elas
tambm fazem parte do pacote de implementaes Java para colees.
A figura apresentada pode ser interpretada da seguinte forma: Um Set,
List ou Queue um tipo de Collection, cada um com suas particularidades. J um Map
no do mesmo tipo dos demais mas tambm manipula colees de elementos
As implementaes de cada ramo esto dividas da seguinte forma:

Set: HashSet, LinkedHashSet e TreeSet;


List: ArrayList, Vector e LinkedList;
Queue: LinkedList e PriorityQueue;

www.t2ti.com
4
Curso Java Starter

Map: Hashtable, LinkedHashMap, HashMap e TreeMap.

Muito interessante tudo isto mas, na prtica, quando devo utilizar uma ou
outra implementao? Qual a diferena entra cada uma destas interfaces?
A seguir sero explicados, simplificadamente, os principais benefcios
obtidos com o uso de cada grupo de interfaces e respectivas implementaes. A
compreenso das funcionalidades de cada uma das interfaces e implementaes
representa a parte mais importante deste mdulo.
Ento vamos l:

Set: Representa uma coleo que no pode conter duplicatas,


implementa uma abstrao dos conjuntos matemticos;
List: Representa uma coleo ordenada (ordem de insero) e que
permite duplicatas;
Queue: Parecida com a interface List porm adiciona algumas
funcionalidades, muito utilizada para representar listas de elementos
cuja ordem importante, normalmente elementos em ordem de
processamento;
Map: um objeto que armazena um elemento e o remove atravs da
sua chave, os Maps no aceitam chaves duplicadas.

Ns iniciaremos esta jornada investigando a interface Set porm antes de


comearmos precisamos conhecer um pouco dos mtodos equals() e hashcode() da
classe Object e suas funes.

equals()

Quando ns estamos trabalhando com objetos os operadores de igualdade,


== e != , podem ter efeitos desastrosos se no forem corretamente aplicados.
Quando estes operadores so utilizados, na verdade, o que est sendo comparado a
referncia do objeto, isto , esta operao ir retornar verdadeiro (true) apenas se as
duas referncias so do mesmo objeto.
Um exemplo desta situao o seguinte:

System.out.println(new String("Pedro") == new String("Pedro"));//Imprime false


No exemplo anterior, caso o cdigo seja executado, obteremos como sada

www.t2ti.com
5
Curso Java Starter

false. Isto acontece, pois conforme explicado anteriormente, estamos comparando


as referncias e no o contedo das Strings (que so idnticos). Ou seja cada uma
das partes da operao refere-se a um objeto diferente porm, do mesmo tipo String
e com o mesmo valor Pedro.
Para resolver este problema basta substituir o cdigo acima por:

System.out.println(new String("Pedro").equals(new String("Pedro")));//Imprime true

Neste exemplo o resultado obtido ser true, isto acontece pois agora o que
est sendo comparado o contedo de cada objeto String, ou seja o valor Pedro.
O importante que voc compreenda que ao utilizar os operadores de
igualdade, sobre objetos, (== ou !=) o que voc est verificando se as duas
referncias fazem aluso ao mesmo objeto. Ao utilizar o mtodo equals() ns estamos
verificando se os dois objetos so significativamente iguais (equivalentes).
A maioria das coisas (objetos) que importam, no contexto da computao,
possuem algum identificador nico ou alguma forma de identificao nica. Ex: Carro
placa/renavam, Pessoa CPF, Empresa CNPJ, Fatura cdigo, Nota fiscal
nmero/srie, Municpio Cdigo do IBGE, Produto cdigo de barras e etc.
Sendo assim ao sobreescrevermos o mtodo equals() devemos observar
estes identificadores e implementar o mtodo a fim de realizar os testes de igualdade
sobre este(s) atributo(s).
A fim de clarificar o que foi dito acompanhe o exerccio a seguir.

Exerccio resolvido

Crie uma classe que represente notas fiscais com cdigo, valor e data, e
sobreescreva o mtodo equals de forma que duas notas fiscais sejam consideradas
iguais apenas se seus cdigos forem idnticos.

Resoluo:

1. Criar classe NotaFiscal com atributos cdigo, valor e data;


2. Sobreescrever mtodo equals de forma que compare os cdigos.

import java.util.Calendar;
import java.util.Date;

www.t2ti.com
6
Curso Java Starter

public class NotaFiscal {

private Integer codigo;


private Date dataEmissao;
private Double valor;

//Construtor parametrizado
public NotaFiscal(Integer codigo, Date dataEmissao, Double valor) {
super();
this.codigo = codigo; //atribui o valor do codigo
this.dataEmissao = dataEmissao; //atribui a data da emissao
this.valor = valor;//atribui o valor
}

//metodo equals
public boolean equals(Object obj) {
//Verifica se o objeto da classe NotaFiscal e verifica se os codigos so iguais
//Se a resposta for afirmativa para os dois testes retorna verdadeiro (true)
if((obj instanceof NotaFiscal) &&
((NotaFiscal)obj).getCodigo().equals(this.getCodigo()))
{
return true;
}else
{
return false;
}
}

//retorna o codigo da nota fiscal


public Integer getCodigo() {
return codigo;
}

public static void main(String[] args) {


//Criacao da nota fiscal 1
NotaFiscal nf1= new NotaFiscal(1, Calendar.getInstance().getTime() ,123456.0 );
//Criacao da nota fiscal 2
NotaFiscal nf2= new NotaFiscal(2, Calendar.getInstance().getTime() ,555566.0 );
//Criacao da nota fiscal 3
NotaFiscal nf3= new NotaFiscal(1, Calendar.getInstance().getTime() ,788955.0 );

System.out.println("nf1 igual a nf2: "+nf1.equals(nf2));//resulta false


System.out.println("nf1 igual a nf3: "+nf1.equals(nf3));//resulta verdadeiro
}
}

Resultado da execuo desta classe:

nf1 igual a nf2: false


nf1 igual a nf3: true

hashcode()

Uma vez compreendida a importncia do mtodo equals() iniciamos os


estudos para descobrir a funo do mtodo hashcode(). Cdigos de Hash ou
Hashcodes so utilizados para aumentar a performance quando manipulamos grandes
quantidades de objetos.
Hashcodes* so utilizados para identificar objetos de forma que o acesso a
estes se torne mais eficiente. Estes cdigos so gerados por uma funo de

* Para saber mais visite http://pt.wikipedia.org/wiki/Tabela_de_hashing

www.t2ti.com
7
Curso Java Starter

espalhamento, o resultado desta funo obtido de acordo com o valor (dado) de


entrada.
importante compreender que entradas diferentes podem produzir tanto
hashcodes iguais quanto diferentes, j entradas iguais produziro sempre o mesmo
hashcode, desta forma o mtodo hashCode() deve respeitar o mtodo equals(), ou
seja, sempre que dois objetos forem iguais, de acordo com o mtodo equals(),
obrigatoriamente o resultado obtido pelo mtodo hashCode() deve ser igual para
estes objetos.
Caso o mtodo hashCode() no respeite a implementao do mtodo
equals() poderemos ter problemas de desempenho e consistncia nas nossas
colees.
O ideal que a funo de espalhamento nunca produza o mesmo cdigo
hash para entradas diferentes porm isto nem sempre possvel, nestes casos
devemos nos preocupar em criar funes que faam uma boa disperso de cdigos.
Mais a frente iremos utilizar estas funes (hashcode() e equals()) na
prtica.

Algumas definies

Ordenao: Define que a coleo possui algum tipo de ordem determinada


por regra(s).
Ex: Crescente, decrescente, prioridade e etc.

Organizao: Garante que a coleo sempre percorrida em uma


determinada seqncia no aleatria.
Ex: Ordem de insero, ndice e etc.

Durante a explicao das colees estas definies ficaro mais claras.

SET

Um Set, ou seja, qualquer implementao desta interface,


obrigatoriamente, no aceita duplicatas em seu conjunto de elementos. Estas
duplicatas so identificadas atravs do mtodo equals(), logo, qualquer
implementao desta interface (Set) altamente dependente de uma correta

www.t2ti.com
8
Curso Java Starter

implementao do mtodo equals().


A implementao do mtodo equals() em desacordo com o universo a ser
modelado pode fazer com que elementos diferentes sejam considerados iguais ou
elementos iguais sejam tratados como diferentes.
Alguns dos mtodos mais utilizados quando manipulamos Sets, estes
mtodos so comuns a qualquer implementao desta interface:

Mtodo Descrio
add( Objeto ) Adiciona um elemento ao nosso Set, retorna true se o elemento
foi inserido
remove( Objeto ) Remove o elemento da nossa coleo, retorna true se o elemento
foi removido
iterator() Retorna um objeto do tipo Iterator
size() Retorna um int (inteiro) com a quantidade de elementos da
coleo
contains( Objeto ) Retorna true se o elemento j existe dentro do Set
clear() Elimina todos os elementos do Set

HashSet

Uma das implementaes concretas da interface Set. O HashSet


caracteriza-se por no aceitar duplicatas, caracterstica derivada do Set, ser uma
coleo desordenada e desorganizada, isto , no h nenhuma garantia quanto a
ordem que os elementos sero percorridos.
O HashSet utiliza o hashcode como chave de identificao de cada um dos
seus elementos ento, quanto mais eficiente for a funo de espalhamento mais
eficiente ser a sua pesquisa e no entanto, se o mtodo hashCode() no respeitar a
implementao do mtodo equals() poderemos ter elementos duplicatas no nosso Set.
A seguir ser apresentada a utilizao do HashSet com uma implementao
eficiente comparada a uma ineficiente.

Exerccio resolvido

Utilizando a classe NotaFiscal, desenvolvida no E.R. - 1, sobreescreva o


mtodo hashcode() duas vezes, uma utilizando o cdigo e outra retornando sempre o
mesmo valor (pior funo de espalhamento possvel afinal de contas no espalha

www.t2ti.com
9
Curso Java Starter

nada). Crie um HashSet e armazene 10.000 notas fiscais com cdigos variando de 1 a
10.000, retire o elemento com cdigo 5.000. Compare os tempos de cada remoo.

Resoluo:

1. Sobreescrever o mtodo hashcode, utilizar o cdigo como funo de


espalhamento;
2. Criar um HashSet com 100.000 elementos e atribuir os cdigos de acordo com
a ordem de criao;
3. Remover o elemento de cdigo 5.000 verificar o tempo total;
4. Sobreescrever o mtodo hashcode, utilizar uma funo de espalhamento que
retorne sempre o mesmo valor;
5. Repetir passos 2 e 3.

import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

public class NotaFiscalHashSet {

private Integer codigo;


private Date dataEmissao;
private Double valor;

//Construtor parametrizado
public NotaFiscalHashSet(Integer codigo, Date dataEmissao, Double valor) {
super();
this.codigo = codigo; //atribui o valor do codigo
this.dataEmissao = dataEmissao; //atribui a data da emissao
this.valor = valor;//atribui o valor
}

//metodo equals
public boolean equals(Object obj) {
//Verifica se o objeto da classe NotaFiscal e verifica se os codigos so iguais
//Se a resposta for afirmativa para os dois testes retorna verdadeiro (true)
if((obj instanceof NotaFiscalHashSet) &&
((NotaFiscalHashSet)obj).getCodigo().equals(this.getCodigo()))
{
return true;//
}else
{
return false;
}
}

//retorna o codigo da nota fiscal


public Integer getCodigo() {
return codigo;
}

//metodo hashcode
public int hashCode() {
return codigo;//funcao de espalhamento retorna o valor do codigo
//return 2;//funcao de espalhamento retorna sempre o mesmo valor
}
//Retorna um long que identifica o tempo atual
public static long getTempoAtual()
{
return Calendar.getInstance().getTimeInMillis();

www.t2ti.com
10
Curso Java Starter

public static void main(String[] args) {


Set hashset = new HashSet();//Criacao do HashSet
Long inicio = getTempoAtual(); //Inicio da contagem do tempo
for(int i = 0; i < 10000; i++)//Iteracao sobre os elementos
{
//adicao dos elementos
hashset.add(new NotaFiscalHashSet(i, Calendar.getInstance().getTime(), 0.0));
}
//remocao dos elementos
hashset.remove(new NotaFiscalHashSet(5000, Calendar.getInstance().getTime(), 0.0));
Long fim = getTempoAtual();//fim da contagem do tempo
System.out.println("Tempo total: "+(fim-inicio)+" ms");//impressao do tempo total
}
}

Resultado obtido utilizando o hashcode baseado no cdigo:


Tempo total : 191 ms

Resultado obtido utilizando o hashcode fixo (2):


Tempo total: 11279 ms

A partir dos resultados temos que, nesta situao, utilizando uma funo de
espalhamento mais adeqada o tempo total de pesquisa foi aproximadamente 60
vezes menor do que utilizando a pior funo de hashcode possvel, espalhando para
apenas um cdigo.

LinkedHashSet

uma verso organizada do HashSet, lembrando, organizada significa que


existe algum tipo de seqncia no-aleatria durante a iterao dos elementos, neste
caso a ordem de insero respeitada. Por ser um Set, o LinkedHashSet no aceita
duplicatas e, da mesma forma que o HashSet, dependente da correta
implementao do mtodo equals(). Devemos utilizar o LinkedHashSet ao invs do
HashSet quando a ordem de iterao dos elementos importante.
J que falamos de iterao vamos apresentar duas formas de iterao de
elementos de colees: utilizando um Iterator; e utilizando o for-each ou enhanced-
for.

Iterator: uma interface que fornece poucos mtodos (next(), hasNext() e


remove()) porm de muita utilidade quando precisamos percorrer colees.
Todas as implementaes do Framework Collections fornecem um Iterator. Os

www.t2ti.com
11
Curso Java Starter

dois principais mtodos sero apresentados a seguir.

Mtodo Descrio
hasNext() Retorna true se existe prximo elemento.
next() Retorna o prximo elemento na iterao.

For-Each: um for adaptado a colees e que percorre todos os elementos


qualquer de coleo do Framework Collection. A seguir temos um exemplo:

Set carrosHashSet = new HashSet();


for(Carros carro : carrosHashSet)
{
carro.setPlaca(...);
...
}

A estrutura deste for-each poderia ser lida da seguinte forma : Para cada
elemento do tipo Carro existente na minha coleo de Carro (carrosHashSet) faa
isto;
Ns prximos exerccios as duas modalidades de iterao sero utilizadas e
a observao do uso prtico facilitar o entendimento.

Exerccio resolvido

Implemente um mtodo que manipule uma coleo HashSet e outra coleo


LinkedHashSet, adicione a elas 20 nmeros inteiros (Integer), em ordem crescente, e
percorra todos os elementos, observe se a ordem de iterao a mesma.

import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;

public class IntegerLinkedHashSet {

public static void main(String[] args) {


Set hashSet = new HashSet();//Criacao do HashSet
Set linkedHashSet = new LinkedHashSet(); //Criacao do LinkedHashSet

for(int i = 0; i < 20; i++) //For para preencher as duas colecoes


{
hashSet.add(i); //Adicionando elemento i ao hashSet
linkedHashSet.add(i); //Adicionando elemento i ao linkedHashSet
}

Iterator itHashSet = hashSet.iterator(); //obtendo Iterator para HashSet


//obtendo Iterator para LinkedHashSet
Iterator itLinkedHashSet = linkedHashSet.iterator();

www.t2ti.com
12
Curso Java Starter

//Enquanto existir proximo elemento nos Iterators


while(itHashSet.hasNext() && itLinkedHashSet.hasNext())
{
//Imprime (system.out.println) o proximo elemento de cada Iterator
System.out.println("HashSet: "+itHashSet.next()+ " LinkedHashSet: "
+itLinkedHashSet.next());
}
}
}

Resultado encontrado:

HashSet: 0 LinkedHashSet: 0
HashSet: 1 LinkedHashSet: 1
HashSet: 2 LinkedHashSet: 2
HashSet: 3 LinkedHashSet: 3
HashSet: 4 LinkedHashSet: 4
HashSet: 5 LinkedHashSet: 5
HashSet: 6 LinkedHashSet: 6
HashSet: 7 LinkedHashSet: 7
HashSet: 8 LinkedHashSet: 8
HashSet: 9 LinkedHashSet: 9
HashSet: 10 LinkedHashSet: 10
HashSet: 11 LinkedHashSet: 11
HashSet: 12 LinkedHashSet: 12
HashSet: 13 LinkedHashSet: 13
HashSet: 14 LinkedHashSet: 14
HashSet: 15 LinkedHashSet: 15
HashSet: 17 LinkedHashSet: 16
HashSet: 16 LinkedHashSet: 17
HashSet: 19 LinkedHashSet: 18
HashSet: 18 LinkedHashSet: 19

Perceba que at o elemento 15 o HashSet vinha mantendo a ordem de


insero durante o processo de iterao dos seus elementos, mas como dito
anteriormente, esta situao no garantida e, a partir do elemento seguinte, a
ordem foi desrepeitada (linhas em negrito) enquanto isto, no LinkedHashSet, a ordem
de insero foi respeitada como era esperado.

TreeSet

um Set ordenado e como tal no aceita duplicatas, ou seja existe alguma


regra que garante a ordenao, no Treeset os elementos inseridos sero percorridos
de acordo com sua ordem natural e de forma ascendente.

Exerccio resolvido

Implemente um mtodo que manipule as trs modalidades de Set


(HashSet, LinkedHashSet e TreeSet), e insira o mesmo conjunto de inteiros em cada
uma delas. Percorra todos os elementos de cada uma delas e compare a ordem

www.t2ti.com
13
Curso Java Starter

encontrada.

import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.TreeSet;

public class IntegerLinkedHashSet {

public static void main(String[] args) {


Set hashSet = new HashSet();//Criacao do HashSet

hashSet.add(100);//Adicionando valores aleatoriamente


hashSet.add(0);
hashSet.add(23);
hashSet.add(465);
hashSet.add(45);
hashSet.add(21);
hashSet.add(10);
hashSet.add(3);
hashSet.add(12);
hashSet.add(5);
hashSet.add(147);
hashSet.add(29);
hashSet.add(7);
hashSet.add(3);
hashSet.add(12);
hashSet.add(54);
//Criacao do LinkedHashSet a partir do hashSet
Set linkedHashSet = new LinkedHashSet(hashSet);
Set treeSet = new TreeSet(hashSet);//Criacao do TreeSet a partir do hashSet

Iterator itHashSet = hashSet.iterator(); //obtendo Iterator para HashSet


//obtendo Iterator para LinkedHashSet
Iterator itLinkedHashSet = linkedHashSet.iterator();
Iterator itTreeSet = treeSet.iterator(); //obtendo Iterator para TreeSet

//Enquanto existir proximo elemento nos Iterators


while(itHashSet.hasNext() && itLinkedHashSet.hasNext() && itTreeSet.hasNext())
{
//Imprime (system.out.println) o proximo elemento de cada Iterator
System.out.println("HashSet: "+itHashSet.next()+
" LinkedHashSet: "+itLinkedHashSet.next()+
" TreeSet: "+itTreeSet.next());
}
}
}

Resultado encontrado:

HashSet: 0 LinkedHashSet: 0 TreeSet: 0


HashSet: 100 LinkedHashSet: 100 TreeSet: 3
HashSet: 3 LinkedHashSet: 3 TreeSet: 5
HashSet: 5 LinkedHashSet: 5 TreeSet: 7
HashSet: 7 LinkedHashSet: 7 TreeSet: 10
HashSet: 10 LinkedHashSet: 10 TreeSet: 12
HashSet: 12 LinkedHashSet: 12 TreeSet: 21
HashSet: 465 LinkedHashSet: 465 TreeSet: 23
HashSet: 45 LinkedHashSet: 45 TreeSet: 29
HashSet: 21 LinkedHashSet: 21 TreeSet: 45
HashSet: 54 LinkedHashSet: 54 TreeSet: 54
HashSet: 23 LinkedHashSet: 23 TreeSet: 100
HashSet: 147 LinkedHashSet: 147 TreeSet: 147
HashSet: 29 LinkedHashSet: 29 TreeSet: 465

Antes de nos avaliarmos a ordem dos resultados, observe que durante a

www.t2ti.com
14
Curso Java Starter

fase de inclusao dos numeros no HashSet alguns deles se repetem, especificamente o


3 e o 12 (linhas em negrito), porm no resultado estes nmeros aparecem apenas
uma vez cada um, isto acontece pois, conforme dito anteriormente, qualquer coleo
do tipo Set no permite duplicatas, na verdade, na segunda tentativa de incluso dos
nmeros 3 e 12, eles no foram includos.
Em relao a ordem o HashSet, desta vez, manteve a ordem de insero e
obtivemos um resultado igual ao visto no LinkedHashSet, no entanto no temos
garantia nenhuma de que este comportamento ir se repetir. J o TreeSet no
respeitou a ordem de insero mas, ordenou de acordo com a ordem natural de cada
um dos valores.
Interessante! Para nmeros a ordem natural fcil de compreender afinal
de contas 1 menor do que 2 que menor do que 3 que menor... no entanto,
nem sempre trabalhamos com nmeros, muitas vezes criamos nossos prprios tipos
(Classes). Nestes casos devemos informar que a nossa Classe (tipo) pode ser
comparada. Isto feito utilizando-se a interface Comparable, este assunto ser
abordado no mini-curso relativo a Colees e disponvel junto com este material.

LIST

A interface List garante que todas as suas implementaes sero


organizadas, isto , a ordem de insero ser mantida. Em implementaes da
interface List podemos so permitidas duplicatas, isto , objetos iguais de acordo com
o mtodo equals().
Ao contrrio do Set, qualquer implementao da interface List mantm seus
elementos indexados, ou seja, existe uma preocupao com o posicionamento de
cada elemento e esta posio determinada pelo ndice. Devemos utilizar um List
quando a ordem de insero ou a posio na coleo nos interessa.
Alguns mtodos importantes quando manipulamos Lists:

Mtodo Descrio
add( Objeto ) Adiciona um elemento ao List, na ltima posio
get( ndice ) Retorna o elemento da posio do ndice
iterator() Retorna um objeto do tipo Iterator
size() Retorna um int (inteiro) com a quantidade de elementos da
coleo

www.t2ti.com
15
Curso Java Starter

contains( Objeto ) Retorna true se o elemento j existe dentro do List


clear() Elimina todos os elementos do Set

ArrayList e Vector:

Um ArrayList pode ser visto como um array (vetor) porm dinmico, isto ,
ele aumenta o espao disponvel a medida que demandado. Ele organizado pelo
ndice, ou seja, temos alguma garantia quanto a ordem que encontraremos os
elementos.
Vector basicamente um ArrayList, no entanto seus mtodos so
sincronizados o que significa que o acesso por vrios processos simultaneamente
coordenado.
Antes de continuarmos falando das implementaes da interface List,
iremos introduzir uma nova caracterstica da linguagem Java e mostrar trechos de
cdigos que a utilizam junto com ArrayList e Vector:

Generics: uma funcionalidade introduzida a partir da verso 1.5 do Java.


Em relao as colees sua principal caracterstica definir o tipo aceito
pela coleo;

At agora as nossas colees aceitavam qualquer tipo de elemento, desde


que fosse um Object, por exemplo, abaixo temos um ArrayList onde adicionamos um
String e um Integer:

//Criando ArrayList
List arrayList = new ArrayList();
//Adicionando um String
arrayList.add(new String("Texto"));
//Adicionando um Integer
arrayList.add(new Integer(3));

Isto era possvel pois nossas colees aceitam qualquer elemento que seja do tipo Object, e todas as classes criadas em Java

automaticamente herdam, e portanto so, da classe Object. No entanto, com o uso de Generics podemos definir de que tipo especfico ser a

nossa coleo. Abaixo temos um exemplo de ArrayList, parecido com o anterior, utilizando Generics:

//Criando ArrayList de Integer


List<Integer> arrayList = new ArrayList<Integer>();
//Adicionando Integer
arrayList.add(new Integer(3));

www.t2ti.com
16
Curso Java Starter

arrayList.add(new Integer(5));

Perceba que a partir de agora este List aceita apenas objetos do tipo
Integer utilizando esta notao, declarao <Integer> junto a declarao da
Classe/Interface, evito que sejam inseridos indevidamente outros tipos que no sejam
Integer na minha coleo.

LinkedList:

Muito similar as duas colees vistas anteriormente (Vector e ArrayList), a


diferena que todos os elementos so ligados entre si. O desempenho do LinkedList
muito superior aos do ArrayList e Vector quando necessitamos inserir elementos no
incio da coleo, no entanto se precisarmos obter algum elemento pelo o ndice o
desempenho muito inferior.

Exerccio resolvido

Implemente um cdigo que compare o tempo de obteno e insero, na


primeira posio dos Lists, de 25.000 nmeros inteiros para o ArrayList, Vector e
LinkedList.

import java.util.LinkedList;
import java.util.List;
import java.util.ArrayList;
import java.util.Vector;

public class ArrayListVector {

public static void main(String[] args)


{
Integer quantidadeElementos = 25000;//Quantidade total de elementos
List<Integer> arrayList = new ArrayList<Integer>();//Criacao do ArrayList de Integer
for(int i = 0; i < quantidadeElementos; i++)//Inserir elementos dentro do ArrayList
{
arrayList.add(i);
}
//Criacao do LinkedList de Integer, com os mesmos elementos do ArrayList
LinkedList<Integer> linkedList = new LinkedList<Integer>(arrayList);
//Criacao do Vector de Integer, com os mesmos elementos do ArrayList
List<Integer> vector = new Vector<Integer>(arrayList);

//inicio da contagem do tempo


long inicio = System.currentTimeMillis();
//percorrendo todos os elementos do ArrayList
for(int i = 0; i < arrayList.size(); i++)
{
arrayList.get(i);//Obtendo elementos do ArrayList
}
//fim da contagem do tempo
long fim = System.currentTimeMillis();
System.out.println("Obter elemento. Tempo arrayList: "+(fim-inicio)+" ms");

//inicio da contagem do tempo

www.t2ti.com
17
Curso Java Starter

inicio = System.currentTimeMillis();
//percorrendo todos os elementos do Vector
for(int i = 0; i < vector.size(); i++)
{
vector.get(i);//Obtendo elementos do Vector
}
//fim da contagem do tempo
fim = System.currentTimeMillis();
System.out.println("Obter elemento. Tempo Vector: "+(fim-inicio)+" ms");

//inicio da contagem do tempo


inicio = System.currentTimeMillis();
//percorrendo todos os elementos do LinkedList
for(int i = 0; i < linkedList.size(); i++)
{
linkedList.get(i);//Obtendo elementos do LinkedList
}
//fim do cronomentro
fim = System.currentTimeMillis();
System.out.println("Obter elemento. Tempo linkedList: "+(fim-inicio)+" ms");

//inicio da contagem do tempo


inicio = System.currentTimeMillis();
//percorrendo todos os elementos do ArrayList
for(int i = 0; i < quantidadeElementos; i++)
{
arrayList.add(0, i);//Adicionando um elemento no inicio do ArrayList
}
//fim da contagem do tempo
fim = System.currentTimeMillis();
System.out.println("Inserir elemento no inicio. Tempo arrayList: "+(fim-inicio)
+" ms");

//inicio da contagem do tempo


inicio = System.currentTimeMillis();
//percorrendo todos os elementos do Vector
for(int i = 0; i < quantidadeElementos; i++)
{
vector.add(0, i);//Adicionando um elemento no inicio do Vector
}
//fim da contagem do tempo
fim = System.currentTimeMillis();
System.out.println("Inserir elemento no inicio. Tempo Vector: "+(fim-inicio)+" ms");

//inicio da contagem do tempo


inicio = System.currentTimeMillis();
//percorrendo todos os elementos do LinkedList
for(int i = 0; i < quantidadeElementos; i++)
{
linkedList.addFirst(i);//Adicionando elemento no inicio do LinkedList
}
//fim da contagem do tempo
fim = System.currentTimeMillis();
System.out.println("Inserir elemento no inicio. Tempo linkedList: "+(fim-inicio)
+" ms");
}

Resultado obtido:

Obter elemento. Tempo arrayList: 12 ms


Obter elemento. Tempo Vector: 12 ms
Obter elemento. Tempo linkedList: 1561 ms
Inserir elemento no inicio. Tempo arrayList: 1804 ms
Inserir elemento no inicio. Tempo Vector: 1809 ms
Inserir elemento no inicio. Tempo linkedList: 17 ms

Considerando que esta uma experincia apenas ilustrativa (no


controlada), os resultados mostram que o ArrayList e o Vector so equivalente nos

www.t2ti.com
18
Curso Java Starter

quesitos avaliados. J o LinkedList foi muito inferior quando da obteno dos


elementos e muito superior na insero dos elementos na primeira posio.

MAP

Um Map, qualquer implementao desta interface, identifica seus elementos


atravs de uma chave, logo, esta coleo aceita duplicatas de valores (elementos)
desde que eles possuam chaves diferentes. A principal caracterstica dos Maps so
suas chaves que nunca podem se repetir, ou seja, em um Map nunca iro haver dois
elementos com a mesma chave. Assim como os elementos armazenados as chaves
utilizadas nos Maps tambm devem ser objetos.
Os principais mtodos utilizados quanto manipulamos Maps so:

Mtodo Descrio
put( chave, objeto ) Adiciona a chave e o elemento
get( chave ) Retorna o elemento de acordo com a chave
iterator() Retorna um objeto do tipo Iterator
size() Retorna um int (inteiro) com a quantidade de elementos da
coleo
containsKey( chave ) Retorna true se a chave j existe
clear() Elimina todos os elementos do Set
containsValue( objeto ) Retorna true se o objeto j existir no Map

HashMap e Hashtable

HashMap um Map desorganizado, isto , a ordem de iterao dos


elementos desconhecida, e desordenado, ou seja, os elementos no sofrem nenhum
tipo de ordenao derivada de alguma regra.
Hashtable, similarmente ao ArrayList e Vector, a verso sincronizada do
HashMap. A maior diferena que o HashMap aceita nulos tanto para chaves quanto
para valores enquanto o Hashtable no aceita nenhum nulo.
A seguir segue trecho de cdigo que exemplifica o uso do HashMap:

//Criacao do HashMap
Map notasFiscaisMap = new HashMap();

//Criacao das Notas Fiscais


NotaFiscal nf1 = new NotaFiscal(1, Calendar.getInstance().getTime(), 123.56);

www.t2ti.com
19
Curso Java Starter

NotaFiscal nf2 = new NotaFiscal(2, Calendar.getInstance().getTime(), 127.00);


NotaFiscal nf3 = new NotaFiscal(3, Calendar.getInstance().getTime(), 100.25);

//Armazenamento das notas fiscais no HashMap


notasFiscaisMap.put(nf1.getCodigo(), nf1);
notasFiscaisMap.put(nf2.getCodigo(), nf2);
notasFiscaisMap.put(nf3.getCodigo(), nf3);

//Obtem nf2
NotaFiscal nf = (NotaFiscal)notasFiscaisMap.get(2);

LinkedHashMap

Muito similar ao LinkedHashSet, porm esta a verso que implementa a


interface Map, logo ao armazenar os objetos necessria uma chave. E, ao contrrio
do HashMap, o LinkedHashMap organizado, o que significa dizer que durante a
iterao dos elementos ele respeita a ordem que estes foram inseridos na coleo.
Se a ordem de insero for importante e precisarmos identificar os
elementos pelas suas chaves devemos utilizar esta implementao da interface Map.
Abaixo temos o mesmo cdigo exibido anteriormente porm a
implementao utilizada agora a LinkedHashMap:

//Criacao do LinkedHashMap
Map notasFiscaisMap = new LinkedHashMap();

//Criacao das Notas Fiscais


NotaFiscal nf1 = new NotaFiscal(1, Calendar.getInstance().getTime(), 123.56);
NotaFiscal nf2 = new NotaFiscal(2, Calendar.getInstance().getTime(), 127.00);
NotaFiscal nf3 = new NotaFiscal(3, Calendar.getInstance().getTime(), 100.25);

//Armazenamento das notas fiscais no HashMap


notasFiscaisMap.put(nf1.getCodigo(), nf1);
notasFiscaisMap.put(nf2.getCodigo(), nf2);
notasFiscaisMap.put(nf3.getCodigo(), nf3);

//Obtem nf2
NotaFiscal nf = (NotaFiscal)notasFiscaisMap.get(2);

TreeMap

Assim como o TreeSet um Set que ordena os elementos de acordo com


alguma regra, o TreeMap tambm ordena seus elementos atravs da chave por
alguma regra. Quando esta ordem no definida pela interface Comparable ou por
um objeto Comparator1 o TreeMap busca a ordem natural dos elementos.
A seguir apresentado um trecho de cdigo mostrando o uso do TreeMap:

//Criacao do TreeMap utilizando Generics


Map<Integer, String> treeMap = new TreeMap<Integer, String>();

//Inserindo os valores
treeMap.put(5, "Numero 5");
treeMap.put(1, "Numero 1");

www.t2ti.com
20
Curso Java Starter

treeMap.put(100, "Numero 100");


treeMap.put(22, "Numero 22");

//For-Each, percorrendo todos os elementos do Map


for(String str : treeMap.values())
{
//Imprimindo os valores encontrados
System.out.println(str);
}

Resultado da execuo deste cdigo:

Numero 1
Numero 5
Numero 22
Numero 100

Observe que a declarao Map<Integer, String> utiliza generics. Ao


declarar um Map desta forma estou garantindo que todas as chaves sero do tipo
Integer e todos os valores sero do tipo String.

QUEUE

A ltima das interfaces a ser analisada, a interface Queue projetada para


armazenar listas de elementos a serem executados/processados. Os elementos
inseridos em uma coleo que implemente esta interface, normalmente, possuir
comportamento similar a uma Fila, isto , o primeiro elemento a ser inserido ser o
primeiro elemento a ser processado.
Os mtodos comumente utilizados com esta coleo so os seguintes:

Mtodo Descrio
add( objeto ) Adiciona o elemento, joga uma exceo se no for possvel
incluir
offer( objeto ) Idntico ao add, porm no joga exceo em caso de falha
remove() Remove o elemento, joga uma exceo se no houver
elementos
poll() Idntico ao remove(), porm retorna nulo caso no hajam
elementos
element() Retorna elemento elemento inicial, joga exceao caso no haja
peek() idntico ao element(), porm retorna nulo caso no haja
elemento

PriorityQueue

www.t2ti.com
21
Curso Java Starter

Diferentemente de uma fila convencional, onde o primeiro elemento a ser


inserido o primeiro a ser removido, na PriorityQueue nem sempre a ordem de
insero representa a ordem de sada dos elementos. Esta ordem administrada pela
coleo que priorizar a ordem de sada dos elementos.
Esta ordem definida pelo prprio objeto quando este implementa a
interface Comparable, por um objeto Comparator ou pela ordem natural dos
elementos.
A seguir mostraremos trecho de cdigo que exemplifica o uso da
PriorityQueue:

//Criando a minha Queue utilizando Generics


Queue<Integer> filaPrioridade = new PriorityQueue<Integer>();
//Adicionando elementos
filaPrioridade.add(5);
filaPrioridade.add(5);
filaPrioridade.add(2);
filaPrioridade.add(3);
filaPrioridade.add(0);
filaPrioridade.add(-2);

//Removendo elementos e imprimindo


System.out.println("poll: "+filaPrioridade.poll());
System.out.println("poll: "+filaPrioridade.poll());
System.out.println("poll: "+filaPrioridade.poll());
System.out.println("poll: "+filaPrioridade.poll());
System.out.println("poll: "+filaPrioridade.poll());
System.out.println("poll: "+filaPrioridade.poll());
System.out.println("poll: "+filaPrioridade.poll());

Resultado obtido:

poll: -2
poll: 0
poll: 2
poll: 3
poll: 5
poll: 5
poll: null

No exemplo apresentado, a ordem de prioridade foi definida naturalmente


uma vez que tratavam-se de nmeros inteiros. A ordem natural , neste caso, do
menor para o maior. Ao fim da execuo o resultado null significa que no existem
mais elementos na fila pois todos j foram removidos.

A classe Collections

www.t2ti.com
22
Curso Java Starter

Da mesma forma que para arrays (vetores), Java fornece uma classe com
um conjunto de funcionalidades muito utilizadas (ordenao, pesquisa, preenchimento
e etc.) na manipulao das estruturas de dados do Framework Collections tambm
existe uma classe similar (Collections)
A classe Collections (mesmo nome do framework) para as colees do
framework a mesma coisa que a classe Arrays para os vetores (arrays)
convencionais, portanto, quando voc precisar destes tipos de funcionalidades, ir
apenas adaptar s suas necessidades, se for necessrio.
A seguir iremos explorar brevemente as principais funcionalidades.

Ordenao

O algoritmo de ordenao implementado na classe Collections ordena os


elementos em ordem ascendente. Temos um exemplo de cdigo a seguir:

//Criao do ArrayList
List arrayList = new ArrayList();
//Adicionando elementos
arrayList.add("Miguel");
arrayList.add("Albert");
arrayList.add("Fernando");
arrayList.add("Mario");

//Ordenando
Collections.sort(arrayList);
//Imprimindo o resultado
System.out.println(arrayList);

Resultado obtido:

[Albert, Fernando, Mario, Miguel]

Mistura/Desordenao

Este algoritmo o oposto ao anterior, ao invs de ordenar ele desordena


(mistura) os elementos dentro de um List. A primeira vista pode parecer pouco til,
mas existem situaes onde voc ir querer desordenar sua estrutura de dados para
obter um elemento aleatoriamente.
Por exemplo, abaixo temos uma possvel implementao para a modalidade
de sorteio cujos nomes dos elementos a serem sorteados, normalmente pessoas, so
escritos em pequenos pedaos de papis e o primeiro a ser escolhido o vencedor.

www.t2ti.com
23
Curso Java Starter

//Criao do ArrayList
List arrayList = new ArrayList();
//Adicionando elementos
arrayList.add("Miguel");
arrayList.add("Albert");
arrayList.add("Fernando");
arrayList.add("Mario");

//Misturando elementos
Collections.shuffle(arrayList);
//Sorteando o primeiro nome e imprimindo o resultado
System.out.println(arrayList.get(0));

Resultado obtido em uma execuo

Fernando

Perceba que o elemento na posio 0 (zero), pela ordem de insero seria


Miguel e, no entanto, obtivemos o elemento Fernando, o que confirma, a mudana
de posio destes elementos dentro do List.

Pesquisa:

Quando falamos em estruturas de dados obrigatoriamente devemos pensar


em algoritmos de ordenao e pesquisa, pois, de que adianta uma estrutura de dados
cujos elementos no conseguimos localizar? Ao manipularmos estruturas de dados
sempre devemos ter em mente que iremos orden-las ou pesquis-las.
Por isto a importncia deste algoritmo. A pesquisa efetuada pela Classe
Collections retorna um nmero inteiro positivo ou zero se o elemento for encontrado e
negativo se o elemento no existe na coleo. Quando o elemento existe na coleo o
nmero representa o seu ndice (posio), por outro lado, quando o elemento no
existe, o nmero, em mdulo, representa a posio que ele deveria estar (ponto de
insero), neste caso, esta posio somente vlida se a coleo estiver ordenada
antes da pesquisa.
A seguir temos um exemplo:

//Criao do ArrayList
List arrayList = new ArrayList();
//Adicionando elementos
arrayList.add("Miguel");
arrayList.add("Albert");
arrayList.add("Fernando");
arrayList.add("Mario");

//Pesquisando
int resultado = Collections.binarySearch(arrayList, "Albert");
//Imprimindo resultado

www.t2ti.com
24
Curso Java Starter

System.out.println("Resultado da pesquisa: "+resultado);

Resultado da execuo:

Resultado da pesquisa: 1

O resultado obtido, conforme esperado, indica que o nome Albert


encontra-se na segunda posio da coleo, lembrando que todas as colees iniciam-
se pelo ndice 0 (zero), logo, o valor 1 indica a segunda posio.

Outras funcionalidades teis

Reverse Inverte a ordem dos elementos;


Fill Preenche a coleo com o elemento especificado;
Swap troca os elementos de posio;
addAll Adiciona os elementos a coleo;
frequency Conta a quantidade de ocorrncias do elemento especificado;
disjoint Verifica quando duas colees no possuem nenhum elemento em
comum.

EXERCCIOS

Aprenda com quem tambm est aprendendo, veja e compartilhe as suas


respostas no nosso Frum:

Exerccios Mdulo 09 Colees Framework Collections

1. Implemente cdigo que possua um ArrayList e insira 200 Strings nesta lista.

2. Faa um ArrayList e insira as Strings String 1, String 2 e String 3 cada


uma duas vezes, percorra todos os elementos e imprima (System.out.println()).
Observe o resultado. Quantos elementos tm a coleo?

3. Faa um HashSet e insira as Strings String 1, String 2 e String 3 cada uma


duas vezes, percorra todos os elementos e imprima (System.out.println()).

www.t2ti.com
25
Curso Java Starter

Observe o resultado. Quantos elementos tm a coleo?

4. Faa um HashMap e insira as Strings String 1, String 2 e String 3 cada


uma duas vezes, utilize o numeral como chave, percorra todos os elementos e
imprima (System.out.println()). Observe o resultado. Quantos elementos tm a
coleo?

5. Adicione os nmeros 100, 20, 200, 30, 80, 40, 100, 200 a um List, percorra
todos os elementos utilizando for-enhanced (for-each) e calcule a mdia.

6. Adicione os nmeros 100, 20, 200, 30, 80, 40, 100, 200 a um List, percorra
todos os elementos utilizando um Iterator e calcule a mdia.

7. Adicione os nmeros 100, 20, 200, 30, 80, 40, 100, 200 a um Set, percorra
todos os elementos utilizando for-enhanced (for-each) e calcule a mdia.

8. Porque as mdias encontradas nos exerccios 6 e 7 ficaram diferentes?

9. Repita o exerccio anterior porm, sem repetir os cdigos das chaves. Observe
o resultado. Quantos elementos tm a coleo?

10.Utilizando a classe Collections desordene a coleo criada no exerccio 2.


Imprima (System.out.println()) o resultado.

11. Utilizando a classe Collections pesquise por String 2 na coleo criada no


exerccio 2. Imprima (System.out.println()) o resultado.

12. Utilizando a classe Collections ordente a coleo criada no exerccio 2. Imprima


(System.out.println()) o resultado.

13.Compare o desempenho das colees HashMap e HashSet. Insira nas duas


colees um total de 20.000 alunos e pesquise por um deles, compare o tempo
de pesquisa em cada uma das colees.

14.Implemente uma classe ContaCorrente com os atributos Agencia, Numero,

www.t2ti.com
26
Curso Java Starter

Nome, CPF e Saldo. Sobreescreva os mtodos equals() de forma que duas


contas correntes sejam consideradas iguais apenas se possurem a mesma
Agencia e Numero, e sobreescreva o mtodo hashCode().

15.Crie um HashSet e adicione 5 (cinco) ContaCorrente diferentes. Imprima o


resultado (System.out.println()).

16. Crie uma classe Aluno com os atributos Nome , RG e Idade. Sobreescreva o
mtodo equals() de forma que dois alunos sejam considerados iguais apenas se
possurem o mesmo RG.

17. Qual interface do Framework Collections voc utilizaria para representar uma
Turma de faculdade, considerando que cada aluno est matriculado apenas uma
vez?

18. Implemente cdigo com a estrutura de dados definida no exerccio anterior,


adicione alguns alunos com o mesmo RG, utilize a classe Aluno do exerccio 16.
Percorra todos os elementos, observe o resultado. Existem alunos nesta turma
com o mesmo cdigo?

19. Sobreescreva o mtodo hashCode da classe Aluno, desenvolvida no exerccio


16, observando a implementao do mtodo equals().

20. Faa novamente o exerccio 8 porm, utilizando a nova classe Aluno, agora
com o mtodo hashCode() implementado.

www.t2ti.com
27
Curso Java Starter

Mdulo

10
Aplicaes grficas
SWING
Interface grfica em Java

As aplicaes grficas so aquelas que possibilitam a criao de uma GUI


(Graphical User Interface Interface Grfica do Usurio), onde definimos os
componentes que sero utilizados e suas disposies na tela, permitindo tambm uma
interao com o usurio por meio do mouse e teclado.
O Java possui duas bibliotecas grficas: AWT (Abstract Window Toolkit) e
Swing. A primeira a ser criada foi a AWT e esta foi substituda pelo swing a partir do
Java 1.2. Neste mdulo, falaremos somente do swing, por ter melhor aparncia,
melhor tratamento de eventos, recursos estendidos, alm de todas as classes deste
pacote serem extenses do pacote AWT.
As classes do swing so encontradas no pacote javax.swing. Usando swing,
sua aplicao ter a mesmo forma, aparncia e comportamento independente de
sistema operacional.

Primeira Aplicao Grfica

Todo componente swing deve ser adicionado a um continer. O continer


essencial para uma aplicao grfica o JFrame.

import javax.swing.JFrame; //importao da classe JFrame

public class PrimeiroSwing {


//criamos um JFrame chamado 'janela'
JFrame janela = new JFrame();

public static void main (String args[]){


new PrimeiroSwing();
}
private PrimeiroSwing(){

www.t2ti.com
3
Curso Java Starter

//definimos o ttulo da janela


janela.setTitle("Primeira Aplicao Grfica");
//definimos a largura e a altura da janela
janela.setSize(350, 150);
//define a posio da janela na tela
janela.setLocation(50, 50);
//define que ao fechar a janela, encerre a aplicao
janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//mostramos a janela
janela.setVisible(true);
}
}

Depois de compilarmos e executarmos a classe, temos o resultado:

Vamos adicionar um boto a esta janela:

import javax.swing.JButton;
import javax.swing.JFrame;

public class PrimeiroSwing {

//criamos e instaciamos um JFrame chamado 'janela'


JFrame janela = new JFrame();
//criamos e instaciamos um JButton chamado 'botao' e com o texto "OK"
JButton botao = new JButton("OK");

public static void main (String args[]){


new PrimeiroSwing();
}

private PrimeiroSwing(){
//definimos o ttulo da janela
janela.setTitle("Primeira Aplicao Grfica");
//definimos a largura e a altura da janela
janela.setSize(350, 150);
//define que ao fechar a janela, encerre a aplicao
janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//adicionamos o botao janela
janela.add(botao);
//mostramos a janela
janela.setVisible(true);
}
}

www.t2ti.com
4
Curso Java Starter

Agora temos uma janela com um boto. Perceba que o boto ocupou toda a
rea da janela, e ao clicar no boto nada acontece. Isto acontece porque no foi
definido nenhum layout para a janela e nenhum evento para o boto.
O mtodo setDefaultCloseOperation() foi usado para definir que ao
fecharmos a janela, encerra-se a aplicao (JFrame.EXIT_ON_CLOSE). Normalmente
definimos este valor na janela principal da aplicao. Quando instanciamos um
JFrame, o valor padro definido como (JFrame.HIDE_ON_CLOSE). Se deixarmos com o
valor padro, ao fecharmos a janela, o processo continuar rodando, apenas ser
escondida a janela. Temos tambm a opo (JFrame.DISPOSE_ON_CLOSE) que destri a
janela, sem encerrar a aplicao caso esta no seja a janela principal do sistema.
No decorrer do estudo dos gerenciadores de layout e de tratamento de
eventos, veremos novos componentes do swing e no final do mdulo seus principais
mtodos.

Gerenciadores de Layout

Uma GUI construda a partir de componentes chamados contineres que


contm outros componentes. Os mais usados so o JFrame e o JPanel. Caso
nenhum gerenciador de layout seja especificado, ser considerado que toda a
extenso do continer formada por uma nica clula, possibilitando assim apenas a
incluso de um objeto.
Os principais gerenciadores de layout so: FlowLayout, GridLayout,
BorderLayout e CardLayout.

www.t2ti.com
5
Curso Java Starter

FlowLayout

O FlowLayout o gerenciador mais simples. Os componentes so dispostos


da esquerda para a direita na ordem em que aparecem, isto , na ordem em que so
adicionados. Quando no existe mais espao em uma linha, criada uma outra linha,
se assemelhando a um editor de texto. Este processo feito automaticamente de
acordo com o tamanho do continer.
Vamos incluir em uma janela, um JPanel (continer), um JText (caixa de
texto) , um JLabel (rtulo) e um JButton (boto).

import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class ExemploFlowLayout {

//criamos e instaciamos um JFrame chamado 'janela'


JFrame janela = new JFrame();
//criamos um JPanel chamado painel
JPanel painel = new JPanel();
//criamos um JLabel chamado rotulo e com o texto "Seu nome: "
JLabel rotulo = new JLabel("Seu nome: ");
//criamos um JTextField chamado texto com o tamanho 5
JTextField texto = new JtextField(5);
//criamos e instanciamos um JButton chamado 'botao' e com o texto "OK"
JButton botao = new JButton("OK");

public static void main (String args[]){


new ExemploFlowLayout();
}

private ExemploFlowLayout(){
//definimos o ttulo da janela
janela.setTitle("Exemplo de um FlowLayout");
//definimos a largura e a altura da janela
janela.setSize(300, 100);
//define a posio da janela na tela
janela.setLocation(50, 50);
//define que ao fechar a janela, encerre a aplicao
janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//definimos o layout do painel
painel.setLayout(new FlowLayout(FlowLayout.CENTER, 30, 20));
//adicionamos o rotulo ao painel
painel.add(rotulo);
//adicionamos o texto ao painel
painel.add(texto);
//adicionamos o botao ao painel
painel.add(botao);
//adicionamos o painel janela
janela.add(painel);
//mostramos a janela

www.t2ti.com
6
Curso Java Starter

janela.setVisible(true);
}
}

Perceba que os componentes foram posicionados na janela de acordo com a


sequncia em que os adicionamos no cdigo (primeiro o rtulo, depois o texto, e por
ltimo o boto). A sintaxe do construtor do FlowLayout a seguinte:
FlowLayout(alinhamento, espaamento-horizontal, espaamento-vertical)
O nosso painel foi definido com o alinhamento centralizado, 30 de
espaamento horizontal e 20 de espaamento vertical.

GridLayout

O GridLayout um gerenciador que divide um continer em um conjunto de


clulas espalhadas numa grade retangular, de maneira que todas elas possuam a
mesma dimenso. Pode-se dividir um continer em linhas e colunas de acordo com
sua necessidade. Os componentes so dispostos na ordem em que aparecem, sendo
inseridos na grade da esquerda para a direita e de cima para baixo.
Qualquer modificao no tamanho do continer ser automaticamente
alterado o tamanho dos componentes adicionados a ele, ou seja, os componentes so
redimensionados em funo da nova dimenso do continer.
Para definirmos um layout na forma de grade utilizamos a seguinte sintaxe:
nome-do-conteiner.setLayout(new GridLayout(linhas, colunas, espaamento-
horizontal, espaamento-vertical)
linhas --> nmero de linhas que ter o continer
colunas --> nmero de colunas que ter o continer
espaamento-horizontal --> distncia horizontal entre os componentes
espaamento-vertical --> distncia vertical entre os componentes
Vamos criar uma janela contendo os componentes JPanel (continer), JList
(lista), um JComboBox (combo), dois JLabel (rtulo) e um JButton (boto):

www.t2ti.com
7
Curso Java Starter

import java.awt.GridLayout;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;

public class ExemploGridLayout {


//criamos um JFrame chamado 'janela'
JFrame janela = new JFrame();
//criamos um JPanel chamado painel
JPanel painel = new JPanel();
//criamos um JLabel chamado rotulo1 e com o texto "Escolha uma fruta: "
JLabel rotulo1 = new JLabel("Escolha uma fruta: ");
//criamos um JLabel chamado rotulo2 e com o texto "Escolha uma bebida: "
JLabel rotulo2 = new JLabel("Escolha uma bebida: ");
/* criamos um ListModel que o objeto que contm as opes da lista
* no se preocupem com isso agora, pois veremos com mais detalhes
*/
DefaultListModel listModel = new DefaultListModel();
//criamos um JList chamado lista e definimos onde esto os objetos da
lista
JList lista = new JList(listModel);
//criamos um JComboBox chamado combo
JComboBox combo = new JComboBox();
//criamos um JButton chamado 'botao' e com o texto "OK"
JButton botao = new JButton("OK");

public static void main (String args[]){


new ExemploGridLayout();
}

private ExemploGridLayout(){
//definimos o ttulo da janela
janela.setTitle("Exemplo de um FlowLayout");
//definimos a largura e a altura da janela
janela.setSize(300, 200);
//define a posio da janela na tela
janela.setLocation(50, 50);
//define que ao fechar a janela, encerre a aplicao
janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//definimos o layout do painel
painel.setLayout(new GridLayout(3, 2, 5, 1));
//adicionamos o rotulo1 ao painel
painel.add(rotulo1);
//acrescentamos algumas frutas a lista
listModel.addElement("Ma");
listModel.addElement("Uva");
listModel.addElement("Pera");
//adicionamos a lista ao painel
painel.add(lista);
//adicionamos o rotulo2 ao painel
painel.add(rotulo2);
//acrescentamos algumas bebidas ao combo
combo.addItem("gua");
combo.addItem("Refrigerante");
combo.addItem("Suco");
//adicionamos o combo ao painel
painel.add(combo);
//adicionamos o botao ao painel

www.t2ti.com
8
Curso Java Starter

painel.add(botao);
//adicionamos o painel janela
janela.add(painel);
//mostramos a janela
janela.setVisible(true);
}
}

BorderLayout

O BorderLayout um gerenciador que divide um continer em cinco regies


distintas: north (regio superior), south (regio inferior), west (regio esquerda),
east (regio direita) e center (regio central). Diferentemente dos gerenciadores
vistos anteriormente, a ordem em que os componentes so adicionados irrelevante,
pois no momento em que adicionamos o componente, definimos em qual regio o
mesmo ir ficar. Em cada regio, conseguimos colocar apenas um componente, ou
seja, somente 5 (cinco) componentes podem ser inseridos neste layout. Caso um
componente seja inserido em uma regio que j contenha outro, este ser
sobreposto. Da mesma maneira que o GridLayout, os componentes so
redimensionados de acordo com as dimenses do continer.
Pode ser que seja uma desvantagem podermos adicionar somente 5
componentes, mas se adicionarmos um painel em cada regio, poderemos ter 5
painis que tero seus prprios componentes e respectivos gerenciadores de layout.
Para a definio do BorderLayout, utilizamos a seguinte sintaxe:
nome-do-conteiner.setLayout(new BorderLayout(espaamento-horizontal,
espaamento-vertical)
espaamento-horizontal e espaamento-vertical --> parmetros opcionais que
definem o espao entre os objetos.

www.t2ti.com
9
Curso Java Starter

Vamos definir um JPanel com o layout BorderLayout, e incluir um JButton


em cada regio do continer:

import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ExemploBorderLayout {


//criamos um JFrame chamado 'janela'
JFrame janela = new JFrame();
//criamos um JPanel chamado painel
JPanel painel = new JPanel();
//criamos um JButton chamado sul
JButton sul = new JButton("SUL");
//criamos um JButton chamado norte
JButton norte = new JButton("NORTE");
//criamos um JButton chamado leste
JButton leste = new JButton("LESTE");
//criamos um JButton chamado oeste
JButton oeste = new JButton("OESTE");
//criamos um JButton chamado centro
JButton centro = new JButton("CENTRO");

public static void main (String args[]){


new ExemploBorderLayout();
}

private ExemploBorderLayout(){
//definimos o ttulo da janela
janela.setTitle("Exemplo de um BoderLayout");
//definimos a largura e a altura da janela
janela.setSize(300, 200);
//define a posio da janela na tela
janela.setLocation(50, 50);
//define que ao fechar a janela, encerre a aplicao
janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//definimos o layout do painel
painel.setLayout(new BorderLayout());
//adicionamos os botes ao painel
painel.add("North", norte);
painel.add("South", sul);
painel.add("East", leste);
painel.add("West", oeste);
painel.add("Center", centro);
//adicionamos o painel janela
janela.add(painel);
//mostramos a janela
janela.setVisible(true);
}
}

www.t2ti.com
10
Curso Java Starter

Para a utilizao do BorderLayout existe uma pequena diferena em relao


aos gerenciadores anteriores: necessrio infomar no mtodo add() em qual regio
o objeto ser inserido.
Neste layout, no obrigatrio preencher todas as regies. possvel utilizar
apenas as regies desejadas. Na classe anterior, vamos retirar os botes do Leste e
Sul e ver o resultado:

Como no existiam componentes nestas regies, os botes oeste e centro


utilizam o espao que ficou livre.

CardLayout

O CardLayout se constitui em um gerenciador mais aprimorado que pode


agrupar diversos contineres na forma de cartes, mostrando um de cada vez, ou
seja, apenas um continer visvel por vez. Cada continer pode possuir seu layout
especfico, permitindo que diversos gerenciadores de layout sejam usados em um
mesmo espao da janela.
Vamos criar uma janela sendo gerenciada pelo BorderLayout, contendo trs

www.t2ti.com
11
Curso Java Starter

JPanel (painis), sendo que um deles ser gerenciado pelo CardLayout e os outros
sem gerenciador contendo um JLabel (rtulo). Para alternar entre os painis, vamos
incluir dois JButton (botes) em um JPanel:

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class ExemploCardLayout implements ActionListener{


//criamos um JFrame chamado 'janela'
JFrame janela = new JFrame();
//criamos um JPanel chamado painel1
JPanel painel1 = new JPanel();
//criamos um JPanel chamado painel2
JPanel painel2 = new JPanel();
//criamos um JLabel chamado rotulo1
JLabel rotulo1 = new JLabel("Painel 1", JLabel.CENTER);
//criamos um JLabel chamado rotulo2
JLabel rotulo2 = new JLabel("Painel 2", JLabel.CENTER);
//criamos dois botoes e um painel para alternar entre os paineis
JPanel painelSelecao = new JPanel();
JButton botao1 = new JButton("Painel 1");
JButton botao2 = new JButton("Painel 2");
//criamos o painelCard que ser gerenciado pelo CardLayout
JPanel painelCard = new JPanel();

public static void main (String args[]){


new ExemploCardLayout();
}

private ExemploCardLayout(){
//definimos o ttulo da janela
janela.setTitle("Exemplo de um CardLayout");
//definimos a largura e a altura da janela
janela.setSize(300, 200);
//define a posio da janela na tela
janela.setLocation(50, 50);
//define que ao fechar a janela, encerre a aplicao
janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//definimos o layout da janela
janela.setLayout(new BorderLayout());
//definimos o painelselecao com o GridLayout e incluimos os botoes
painelSelecao.setLayout(new GridLayout(1,2));
painelSelecao.add(botao1);
painelSelecao.add(botao2);
//adicionamos os rotulos a seus respectivos paineis
painel1.add(rotulo1);
painel2.add(rotulo2);
//definimos o layout do painelCard
painelCard.setLayout(new CardLayout());
//adicionamos os paineis quem contm os rotulos ao painelCard
painelCard.add(painel1, "p1");
painelCard.add(painel2, "p2");

www.t2ti.com
12
Curso Java Starter

//adicionamos os paineis janela


janela.add("North", painelSelecao);
janela.add("East", painelCard);
//registra os botoes para tratarmos os eventos gerados por eles
botao1.addActionListener(this);
botao2.addActionListener(this);
//mostramos a janela
janela.setVisible(true);
}

//veremos este metodo com mais detalhe no proximo topico


public void actionPerformed(ActionEvent e){
CardLayout cl = (CardLayout) painelCard.getLayout();
if (e.getSource() == botao1){
cl.show(painelCard, "p1");
}
if (e.getSource() == botao2){
cl.show(painelCard, "p2");
}
}
}

No trecho de cdigo mostrado com a seta verde, definimos o layout do painel


painelCard como sendo do tipo CardLayout e adicionamos os paineis que contm
os rtulos. Perceba que no mtodo add() os parmetros so: componente a ser
adicionado, e uma String como identificador do componente.
No trecho marcado com a seta azul, criamos um objeto do tipo CardLayout e
definimos qual painel seria visvel no momento. Caso o usurio clique no boto 1, o
painel 1 ser mostrado, e caso clique no boto 2, o painel 2 ser mostrado. Para que
mostremos o painel desejado, usamos a seguinte sintaxe:

nome-do-cardlayout.show(nome-do-conteiner, identificador)

www.t2ti.com
13
Curso Java Starter

Tratamento de Eventos

Nas aplicaes em que desejamos interpretar as aes do usurio (ao clicar


em um boto, por exemplo), necessitamos implementar uma ou mais interfaces
receptoras de eventos. Cada classe receptora de eventos trata de um evento
diferente. Alguns exemplos:
ActionListener Eventos de ao como o clique do mouse sobre um
boto, ao pressionar ENTER em um campo texto, etc.
FocusListener Eventos de foco, gerados quando um componente
recebe ou perde o foco.
MouseListener eventos gerados pelo mouse quando clicado, entra
na rea de um componente, etc.
WindowListener eventos de janelas, gerados quando uma janela
maximizada, minimizada, etc.
Neste mdulo vamos aprender a utilizar a interface ActionListener. Esta
classe exige a declarao do mtodo actionPerformed, que onde vamos definir o
tratamento do evento gerado. Atravs do mtodo addActionListener registramos os
componentes que sero observados.
Vamos utilizar a classe de exemplo do gerenciador FlowLayout para registrar
o boto e definir que ao ser clicado mostre o contedo do campo texto.

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

//implementamos a classe ActionListener para controlar os eventos


public class ExemploFlowLayout implements ActionListener{

//criamos um JFrame chamado 'janela'


JFrame janela = new JFrame();
//criamos um JPanel chamado painel
JPanel painel = new JPanel();
//criamos um JLabel chamado rotulo e com o texto "Seu nome: "
JLabel rotulo = new JLabel("Seu nome: ");
//criamos um JTextField chamado texto com o tamanho 5
JTextField texto = new JTextField(5);
//criamos e instaciamos um JButton chamado 'botao' e com o texto "OK"

www.t2ti.com
14
Curso Java Starter

JButton botao = new JButton("OK");

public static void main (String arg[]){


new ExemploFlowLayout();
}

private ExemploFlowLayout(){
//definimos o ttulo da janela
janela.setTitle("Exemplo de um FlowLayout");
//definimos a largura e a altura da janela
janela.setSize(300, 100);
//define a posio da janela na tela
janela.setLocation(50, 50);
//define que ao fechar a janela, encerre a aplicao
//janela.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
//definimos o layout do painel
painel.setLayout(new FlowLayout(FlowLayout.CENTER, 30, 20));
//adicionamos o rotulo ao painel
painel.add(rotulo);
//adicionamos o texto ao painel
painel.add(texto);
//adicionamos o botao ao painel
painel.add(botao);
//adicionamos o painel janela
janela.add(painel);
//mostramos a janela
janela.setVisible(true);
//registramos o botao ao Listener
botao.addActionListener(this);
}

//construimos o metodo exigido pela interface


public void actionPerformed(ActionEvent e){
if (e.getSource() == botao){
JOptionPane.showMessageDialog(null, texto.getText());
}
}
}

Na linha mostrada pela seta azul, registramos o boto para que os eventos
gerados por ele sejam tratados pela interface.
O bloco representado pela seta verde, onde definimos o que ser feito ao ser
gerado um evento. Para sabermos qual componente gerou o evento, utilizamos o
mtodo getSource() da classe ActionEvent. Neste exemplo, se o componente que
gerou o evento foi o boto, ento mostramos uma mensagem com o contedo do
campo texto.

www.t2ti.com
15
Curso Java Starter

Componentes Swing

Neste tpico veremos alguns componentes do swing, entre eles:


JButton
JOptionPane
JLabel
JTextField
JComboBox
JCheckBox
JRadioButton

JButton

Utilizando a classe JButton podemos incluir botes em um continer.


A tabela seguinte mostra alguns mtodos da classe Jbutton:

Mtodo Descrio
JButton() Constri um boto sem texto *
JButton(String) Constri um boto com o texto informado *
JButton(String, Icon) Constri um boto com o texto e imagem informados *
getText() Obtm o texto do boto
setText(String) Define o texto do boto
setEnabled(boolean) Define se o boto est habilitado (true) ou desabilitado
(false)
* construtores

Exemplo:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class Botoes implements ActionListener{

JFrame janela = new JFrame();


//criamos dois botes
JButton botao1 = new JButton();
JButton botao2 = new JButton();

www.t2ti.com
16
Curso Java Starter

public static void main (String args[]){


new Botoes();
}

public Botoes(){
janela.setSize(240,70);
janela.setTitle("Exemplo de JButton");
janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
janela.setLayout(new GridLayout(1,2));
//definimos o texto dos botes
botao1.setText("Fechar");
botao2.setText("OK");
//registramos os botoes no ActionListener
botao1.addActionListener(this);
botao2.addActionListener(this);
//adicionamos os botes a janela
janela.add(botao1);
janela.add(botao2);
janela.setVisible(true);
}

public void actionPerformed(ActionEvent e){


if (e.getSource() == botao1){
//se pressionado o botao1, fechamos a aplicao
System.exit(0);
}
if (e.getSource() == botao2){
//se pressionado o botao2, mostramos uma mensagem
JOptionPane.showMessageDialog(null, "Janela de botes");
}
}
}

JOptionPane

Utilizamos a classe JOptionPane para a incluso de mensagens. Esta classe


especializada na gerao de caixas de dilogo, isto , pequenas janelas que fazem
uma pergunta, avisam o usurio ou fornecem uma mensagem qualquer. Existem
quatro tipos padro de caixas de dilogo, sendo eles:
MessageDialog caixa de dilogo que apresenta uma mensagem,
possibilitando acrescentar cones de alerta ao usurio.
ConfirmDialog caixa de dilogo que alm de emitir uma mensagem,

www.t2ti.com
17
Curso Java Starter

possibilita ao usurio responder a uma pergunta.


InputDialog caixa de dilogo que alm de emitir uma mensagem,
permite a entrada de um texto.
OptionDialog caixa de dilogo que abrange os trs tipos anteriores.

Vamos incrementar a classe Botoes e antes de fechar a janela ao ser


pressionado o boto Fechar, confirmar a ao do usurio. No boto OK, o texto a
ser apresentado ser o que o usurio digitar no InputDialog:

public void actionPerformed(ActionEvent e){


if (e.getSource() == botao1){
//se pressionado o botao1, pedimos confirmao do usurio
int resposta = JOptionPane.showConfirmDialog(null, "Deseja encerrar a aplicao?",
"Confirmao", JOptionPane.OK_CANCEL_OPTION);
//se a resposta for sim, encerra a aplicao
if (resposta == JOptionPane.OK_OPTION){
System.exit(0);
}
}

if (e.getSource() == botao2){
//se pressionado o botao2, solicitamos ao usurio digitar uma mensagem
String mensagem = JOptionPane.showInputDialog("Informe a mensagem:");
//mostramos a mensagem informada pelo usurio
JOptionPane.showMessageDialog(null, mensagem);
}
}
No bloco indicado pela seta azul, declaramos um objeto do tipo int que ir
receber o valor da resposta na caixa de confirmao. A sintaxe utilizada para o
mtodo showConfirmDialog() :
JOptionPane.showConfirmDialog(Component, mensagem, ttulo, botes)
Component refere-se a um objeto do tipo continer que permite
definir a posio da tela em que a caixa de mensagem aparecer. Quando
utilizado null, a mensagem centralizada na tela.
Mensagem mensagem do tipo String que ser informada ao usurio
Ttulo texto que aparece na barra de ttulo. Tambm do tipo String
Tipo os botes que estaro presentes na caixa de dilogo. No nosso
exemplo, esto os botes OK e Cancel.
No bloco indicado pela seta amarela, declaramos um objeto do tipo String que
ir receber a mensagem informada pelo usurio no InputDialog. O parmetro
utilizado a mensagem que ser informada ao usurio.
Executando a aplicao, ao pressionar o boto OK temos:

www.t2ti.com
18
Curso Java Starter

Ao pressionarmos OK aparece a mensagem:

Quando pressionamos o boto Fechar, aparece a tela de confirmao:

Ao pressionarmos OK a aplicao encerrada.

JLabel

A classe JLabel utilizada para a incluso de texto (rtulos) e/ou imagens.


Esta classe no gera eventos, e tambm no permanece com o foco.
A tabela seguinte mostra alguns mtodos desta classe:

Mtodo Descrio
JLabel() Constri um label sem texto
JLabel(String) Constri um label com o texto informado
JLabel(Icon) Constri um label contendo a imagem especificada
setText(String) Define o texto a ser mostrado

www.t2ti.com
19
Curso Java Starter

getText() Retorna o texto que o label est mostrando

JTextField

A classe JTextField utilizada para a incluso de campos textos editveis de


uma nica linha. A tabela seguinte mostra alguns mtodos desta classe:

Mtodo Descrio
JTextField() Constri um novo campo texto
JTextField(int) Constri um campo texto com o nmero de colunas
(tamanho) informado
JTextField(String) Constri um campo texto com o texto especificado
setText(String) Define o texto do campo texto para o informado
getText() Retorna o texto do campo texto
setEnabled(boolean) Define se o campo texto est habilitado (true) ou
desabilitado (false)

JComboBox

Utilizamos a classe JComboBox para criarmos caixas de seleo. Estas caixas


permitem que o usurio selecione apenas um item de sua lista.
A tabela seguinte mostra alguns mtodos da classe JcomboBox:

Mtodo Descrio
JComboBox() Cria uma caixa de seleo
addItem(Object) Adiciona o objeto como um novo item
getSelectedItem() Retorna o objeto que est selecionado
getSelectedIndex() Retorna um valor do tipo int que representa o ndice
selecionado
removeItemAt(int) Remove o item com o ndice especificado
removeAllItems() Remove todos os itens da lista

Exemplo:
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;

www.t2ti.com
20
Curso Java Starter

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

public class ExemploCombo implements ActionListener{

JFrame janela = new JFrame();


JLabel label = new JLabel("Selecione uma cor:");
JButton botao = new JButton("OK");
//criamos um novo combo
JComboBox combo = new JComboBox();

public static void main (String args[]){


new ExemploCombo();
}

public ExemploCombo(){
janela.setSize(240,100);
janela.setTitle("Exemplo de JComboBox");
janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
janela.setLayout(new FlowLayout());
janela.add(label);
janela.add(combo);
janela.add(botao);
janela.setVisible(true);
botao.addActionListener(this);
//adicionamos as cores ao combo
combo.addItem("Vermelho");
combo.addItem("Verde");
combo.addItem("Azul");
}

public void actionPerformed(ActionEvent e){


if (e.getSource() == botao){
//mostramos uma mensagem informando a cor selecionada pelo usurio
JOptionPane.showMessageDialog(null, combo.getSelectedItem());
}
}
}

JCheckBox

Para incluirmos caixas de opo utilizamos a classe JCheckBox que permite

www.t2ti.com
21
Curso Java Starter

representar uma opo que est ativada (true) ou desativada(false). As caixas de


opo so utilizadas para exibir vrias opes dentre as quais o usurio pode optar
por selecionar nenhuma, uma ou vrias delas.
A tabela seguinte mostra alguns mtodos da classe JcheckBox:

Mtodo Descrio
JCheckBox() Cria um checkbox sem texto e no selecionado
JCheckBox(String, boolean) Cria um checkbox com o texto e estado especificados
isSelected() Retorna se o checkbox est selecionado (true) ou
no (false)

Exemplo:

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class ExemploCheckBox implements ActionListener{


JFrame janela = new JFrame();
JPanel painel = new JPanel();
JButton botao = new JButton("OK");
//criamos trs checkbox
JCheckBox chk1 = new JCheckBox("Curso");
JCheckBox chk2 = new JCheckBox("Java");
JCheckBox chk3 = new JCheckBox("Starter");

public static void main (String args[]){


new ExemploCheckBox();
}

public ExemploCheckBox(){
janela.setSize(240,100);
janela.setTitle("Exemplo de JCheckBox");
janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
janela.setLayout(new GridLayout(2,1));
painel.setLayout(new GridLayout(1,1));
painel.add(chk1);
painel.add(chk2);
painel.add(chk3);
janela.add(painel);
janela.add(botao);
janela.setVisible(true);
botao.addActionListener(this);
}

public void actionPerformed(ActionEvent e){


if (e.getSource() == botao){

www.t2ti.com
22
Curso Java Starter

String mensagem = "";


//se chk1 selecionado acrescentamos o seu texto a mensagem
if (chk1.isSelected()){
mensagem = chk1.getText() + " ";
}
//se chk2 selecionado acrescentamos o seu texto a mensagem
if (chk2.isSelected()){
mensagem += chk2.getText() + " ";
}
//se chk3 selecionado acrescentamos o seu texto a mensagem
if (chk3.isSelected()){
mensagem += chk3.getText();
}
JOptionPane.showMessageDialog(null, mensagem);
}
}
}

JRadioButton

Os radio buttons so criados a partir da classe JRadioButton, e


diferentemente dos JCheckBox, permitem que apenas uma entre vrias opes seja
selecionada. Cada conjunto de radio buttons deve ser inserido em um
ButtonGroup.
A tabela seguinte mostra alguns mtodos da classe JRadioButton:

Mtodo Descrio
JRadioButton() Cria um radio button sem texto e no
selecionado
JRadioButton(String, boolean) Cria um radio button com o texto e estado
especificados
setSelected(boolean) define se o radio button est ou no
selecionado (true ou false)
ButtonGroup() Cria um grupo para radio buttons
Nome-do-grupo.add(JRadioButton) Adiciona um radio button a um grupo

Exemplo:
import java.awt.GridLayout;

www.t2ti.com
23
Curso Java Starter

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

public class ExemploJRadioButton implements ActionListener{

JFrame janela = new JFrame();


JPanel painel = new JPanel();
JButton botao = new JButton("OK");
//criamos trs radio buttons
JRadioButton rb1 = new JRadioButton("Opo 1");
JRadioButton rb2 = new JRadioButton("Opo 2");
JRadioButton rb3 = new JRadioButton("Opo 3");
//criamos o grupo para os radio buttons
ButtonGroup grupo = new ButtonGroup();

public static void main (String args[]){


new ExemploJRadioButton();
}
public ExemploJRadioButton(){
janela.setSize(240,100);
janela.setTitle("Exemplo de JRadioButton");
janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
janela.setLayout(new GridLayout(2,1));
painel.setLayout(new GridLayout(1,1));
painel.add(rb1);
painel.add(rb2);
painel.add(rb3);
janela.add(painel);
janela.add(botao);
janela.setVisible(true);
botao.addActionListener(this);
//adicionamos os radio buttons ao grupo
grupo.add(rb1);
grupo.add(rb2);
grupo.add(rb3);
}
public void actionPerformed(ActionEvent e){
if (e.getSource() == botao){
String mensagem = "Nenhuma opo selecionada";
//verificamos qual radio button est selecionado
if (rb1.isSelected()){
mensagem = "Opo 1 selecionada";
}else if (rb2.isSelected()){
mensagem = "Opo 2 selecionada";
}else if (rb3.isSelected()){
mensagem = "Opo 3 selecionada";
}
JOptionPane.showMessageDialog(null, mensagem);
}
}
}

www.t2ti.com
24
Curso Java Starter

Agora voc deve tentar resolver a lista de exerccios abaixo. Qualquer


dificuldade envie para a lista de discusso:

Exerccios
Aprenda com quem tambm est aprendendo, veja e compartilhe as suas
respostas no nosso Frum:

Exerccios Mdulo 10 Aplicaes Grficas Swing


1. Inclua em um JFrame gerenciado pelo layout GriLayout, dois JTextField
e um JButton.

2. Utilizando a classe feita no exerccio anterior, acrescente a seguinte


funcionalidade: quando o usurio clicar no boto, mostre a soma dos valores
informados nos campos texto.

3. Crie um janela contendo 3 botes gerenciada pelo BorderLayout.


Inicialmente, somente um deles estar habilitado. Ao clicar no boto que est
habilitado, desabilita o mesmo e habilita somente um dos outros dois.

4. Crie uma aplicao que calcule o valor final de uma venda. Caso o
pagamento seja realizado em dinheiro, no haver acrscimo, caso seja em carto,
ter um acrscimo de 5% e caso seja em cheque, o acrscimo ser de 10%. Utilize o
JRadioButton para que o usurio escolha a forma de pagamento e o JTextField
para o usurio informar o valor da venda e mostrar o resultado.

5. Refaa a aplicao do exerccio anterior, substituindo o JRadioButton pelo


JComboBox e o JTextField pelo InputDialog para receber o valor e
MessageDialog para mostrar o resultado.

6. Crie uma aplicao que simule o cadastramento de pessoas. O usurio

www.t2ti.com
25
Curso Java Starter

digita o nome e o endereo, escolhe o sexo e estado civil atravs do ComboBox. Ao


pressionar um boto, apresenta uma mensagem com os dados informados.

7. Refaa o exerccio anterior substituindo o JComboBox pelo JRadioButton.

8. Faa uma aplicao que apresente 5 itens de uma papelaria. O usurio ir


escolher um ou mais itens. Ao clicar no boto Comprar, o sistema emite uma
mensagem com os itens escolhidos pelo usurio. Utilize o JcheckBox.

9. Altere a aplicao feita no exerccio anterior, confirmando a ao do usurio


antes de mostrar a mensagem.

10. Abra o promp de comando e acesse a pasta diretorio-instalacao-


JDK/demo/jfc/SwingSet2/. Digite o comando: java -jar SwingSet2.jar e veja uma
aplicao de demonstrao feita em swing. A tela inicial a seguinte:

www.t2ti.com
26
Curso Java Starter

11. No pacote swing existem muitas classes. Neste mdulo foram vistos
alguns componentes bsicos e seus principais mtodos. Acesse a documentao deste
pacote para aprender mais sobre essas classes e seus respectivos mtodos:
http://java.sun.com/javase/6/docs/api/

www.t2ti.com
27

S-ar putea să vă placă și