Você está na página 1de 147

CurtaTI - Tecnologia

Parceira da sua
Empresa

Autor: Marcelo
Costa Curta

[PROGRAMAO
EM JAVA]
Uma introduo ao mundo da programao em Java.

2013, Marcelo Costa Curta - Todos os direitos


reservados e protegidos pela Lei n9.610, de
10/02/1998.
Nenhuma parte deste livro poder ser reproduzida, nem
transmitida, sem autorizao prvia por escrito do autor.

SOBRE O AUTOR
Marcelo Costa Curta formado em Engenharia
da Computao pela Universidade de Ribeiro Preto e
MBA em Gesto de Projetos pela FGV, certificado em
ITIL V3, atua a 6 anos como desenvolvedor Java e a 4
anos trabalha como consultor na empresa CurtaTI
(www.curtati.com.br).

SUMRIO
1.

Introduo __________________________ 6
Tecnologias Java _________________________ 7
Estrutura da linguagem Java ________________ 8
Chegou a hora do Hello World _____________ 11
Variveis e Controle de Fluxo ______________ 16
Instrues ou Comandos __________________ 22

2.

Orientao a Objetos ________________ 34


Classes________________________________ 36
Objetos ________________________________ 40
Herana _______________________________ 49
Interface _______________________________ 61

4.

Excees __________________________ 66
Capturando e manipulando uma exceo _____ 67
Lanando sua prpria exceo _____________ 70
Try-with-resources no Java 7 _______________ 74

5.

Colees __________________________ 77
Interfaces ______________________________ 77
Implementaes _________________________ 79

6.

Input e Output (I/O) __________________ 92


Capturando o que foi digitado do teclado _____ 93
Escrevendo um arquivo ___________________ 94

Lendo o arquivo gerado ___________________ 96


Scanner e PrintStream ____________________ 97
7.

Serializao ________________________ 99
Transient e static _______________________ 104
Regras de Serializao __________________ 105
Externalizable __________________________ 106
Controle de Verso _____________________ 107

8.

Reflexo __________________________ 109

9.

Padres de Projetos ________________ 115


Padres estruturais _____________________ 117
Padres comportamentais ________________ 117
Singleton (Padro de Criao) _____________ 119
Factory Method (Padro de Criao) ________ 122
Template Method (Padro Comportamental) _ 128
Faade (Padro Estrutural) _______________ 132

10.

Referencias _______________________ 137

Programao em Java

1. Introduo
A linguagem de programao Java uma
linguagem de alto nvel, robusta e segura que tem como
principais caractersticas, a orientao a objetos e a
capacidade de ser multiplataforma, lanada em 2005
pela Sun Microsystems, e atualmente mantida pela
Oracle.
Hoje uma linguagem que conta com mais de 9
milhes de desenvolvedores em todo o mundo1.
O grande diferencial do Java hoje a
caracterstica de ser multiplataforma, ou seja, pode ser
executado em vrios hardwares e Sistemas
Operacionais, atravs do conceito de Maquina Virtual
Java que veremos mais detalhes ainda nesse capitulo.
Por sua capacidade modularizao e estrutura
bem definida, permite que seja implantado um ambiente

http://www.oracle.com/br/technologies/java/overview/index.html
6|

www.borgesrinolfi.com.br

Programao em Java

altamente seguro e avanado


complexas baseadas em rede.

para

arquiteturas

Tecnologias Java
A tecnologia Java oferece meios para se
desenvolver aplicaes robustas para com arquiteturas
avanadas, programas desktop, sistemas embarcados
(Embeddable), para dispositivos mveis e interfaces
grficas avanadas para seus aplicativos.
Para fazer isso da melhor forma possvel foi
desenvolvida uma tecnologia para cada tipo de
aplicao conforme segue abaixo:

Java EE Java Platform, Enterprise


Edition
Com
bibliotecas
essenciais
para
o
desenvolvimento
de
aplicaes
empresariais,
permitindo desenvolver
aplicaes Web, com
arquiteturas avanadas, e mais produtividade.

Java SE Java Standard Edition


O JavaSE foi criado para o desenvolvimento
com bibliotecas padres para um desenvolvimento de
aplicaes segura, e de alto desempenho.

Oracle Embeddable Java


Embeddable um pacote criado para
desenvolvimento para dispositivos com recursos
restritos, tendo alto desempenho para acessar os
7|

www.borgesrinolfi.com.br

Programao em Java

recursos do aparelho, dentro desta categoria podemos


listar JavaCard utilizado para desenvolvimento em
cartes inteligentes (crachs, bilhete eletrnico, etc) e
Java TV para desenvolvimento de aplicaes para
TVs.

Java ME Java Platform, Micro Edition


Possui
ferramentas
exclusivas
para
desenvolvimento de aplicaes para celulares, podendo
fazer acessos a funes especficas dos aparelhos de
vrias marcas e modelos.

JavaFX
JavaFX uma plataforma criada para
desenvolvimento de interfaces visuais avanadas para
aplicaes,
reduzindo
a
complexidade
do
desenvolvimento.

Estrutura da linguagem Java


A linguagem Java composta basicamente de
dois componentes centrais:

8|

Java Virtual Machine (JVM) uma


ferramenta capaz de executar instrues
geradas pelo compilador java. Este capaz de
executar um programa java.

www.borgesrinolfi.com.br

Programao em Java

Java Development Kit (JDK) trata-se de um


kit de ferramentas essenciais para o
desenvolvimento,
consistindo
de
classes
essenciais, compilador Java, e a Mquina Virtual
Java, entre outros.

Para
iniciar
o
desenvolvimento
Java,
primeiramente todo cdigo fonte escrito em arquivos
texto simples, com o seu editor de texto preferido, e
salvo com a extenso .java.

Figura 1: MeuPrograma.java

Esse cdigo fonte compilado utilizando o


programa javac.exe que vem junto com o Kit de
Desenvolvimento (JDK).

Figura 2: MeuPrama.java passa por um compilador

Depois de compilado gerado um arquivo com


o mesmo nome e com extenso .class, este arquivo
contm instrues independentes do computador que
foi compilado, ele contem informaes de bytecodes,
que a Mquina Virtual Java (JVM) capaz de executar
esse programa.

9|

www.borgesrinolfi.com.br

Programao em Java

MeuPrograma.java

Compilador

Converto o arquivo
'.java' em bytecode

MeuPrograma.class

Java Virtual Machine

traduz o arquivo
'.class' em
binario e executa
o programa

Figura 3: Esquema de compilao Java

exatamente essa estrutura de compilao que


faz o Java ter capacidade de ser multiplataforma, pois a
JVM pode ser implementada para qualquer sistema
operacional, inclusive podendo ter vrias para a mesma
plataforma, fazendo com que sua aplicao execute em
vrias plataformas, conforme ilustrado no desenho
abaixo:

10 |

www.borgesrinolfi.com.br

Programao em Java

Figura 4: Funcionamento multiplataforma Java

Devido a execuo de um programa Java


passar por uma camada a mais, a JVM, ela tende a ser
mais lenta do que as demais linguagens.
Para isso foi criado um conceito de Just-InTime (JIT) Compiler, trata-se de um componente
agregado a JVM, que converte todos os bytecodes em
linguagem nativa da mquina somente quando o
programa Java iniciado. O resultado uma melhora
considervel no cdigo que interpretado pela JVM.

Chegou a hora do Hello World


Para criar o nosso primeiro programa
precisaremos ter a JDK devidamente instalado, um
editor de texto a sua escolha, podendo facilmente ser
utilizado o Notepad que vem incluso no Windows.
11 |

www.borgesrinolfi.com.br

Programao em Java

Criar o cdigo fonte


Utilizando o seu editor de texto preferido escreva
o cdigo fonte abaixo, e salve o arquivo, ele deve ter a
extenso .java daremos o nome no arquivo de
OlaMundo.java, como exemplo iremos salvar em uma
pasta no caminho C:\primeiroPrograma.
class OlaMundo{
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
Cdigo 1: Fonte da classe OlaMundo.java

ATENO: o cdigo case sensitive, ou seja,


ele sensvel a letras maisculas e minsculas,
identificando como palavras diferentes, portanto o
cdigo acima deve ser digitado exatamente como
exibido.

Compilando o Cdigo Fonte


O Kit de Desenvolvimento JDK, traz as
ferramentas necessrias para compilar e executar o
programa java, e para utilizar eles iremos utilizar o
Prompt de comando do Windows (Iniciar > Todos os
Programas > Acessrios > Prompt de Comando)

12 |

www.borgesrinolfi.com.br

Programao em Java

Figura 5: Prompt de comando do Windows

ATENO: Garanta que voc esteja dentro do


diretrio que contem o arquivo que criamos
C:\primeiroPrograma para fazer isso execute os
comando como mostrado na tela abaixo:

Figura 6: Verifique o diretrio onde se localiza o arquivo

Agora estamos prontos para compilar o nosso


primeiro programa, utilizaremos um programa chamado

13 |

www.borgesrinolfi.com.br

Programao em Java

javac.exe que acompanha a JDK, e para isso basta


executar o comando abaixo:
javac OlaMundo.java
Cdigo 2: Compilando a classe OlaMundo.java

Ser criado um arquivo com o mesmo nome e


com extenso .class trata-se do bytecode gerado que
contm instrues que a Mquina Virtual Java capaz
de executar.

Figura 7: Arquivo compilado .class e cdigo fonte .java

Executando o programa
Agora que j temos o bytecode (.class) gerado e
no tivemos nenhuma erro, podemos executar o nosso
primeiro programa feito em java. Para isso basta utilizar
o comando java.exe que tambm instalado junto com
a JDK.

14 |

www.borgesrinolfi.com.br

Programao em Java

Para executar o programa, basta digitar o


seguinte comando no prompt de comando do Windows:
java OlaMundo
Cdigo 3: Executando um programa java

Abaixo segue a tela com o resultado do nosso


primeiro programa:

Figura 8: Resultado da execuo do primeiro programa

15 |

www.borgesrinolfi.com.br

Programao em Java

Variveis e Controle de Fluxo


Todo programa de computador elaborado para
resolver alguns problemas, ou automatizar operaes
do dia-a-dia. E isso sempre feito manipulando dados
atravs de instrues ou comandos.

Dados
Tipos primitivos de dados
Tipos primitivos de dados um conjunto de tipos
bsicos de dados definido na linguagem java.
Tipo

Tamanho
(bits)

Byte

Short

1
6

Int

3
2

16 |

Descrio

Valor mnimo de -128 e


mximo de 127 (inclusive).
Pode ser utilizado para
economizar
memoria,
podendo substituir o tipo
int s que com valores
limitados
Valor mnimo de -32.768 e
valor mximo de 32.767
(inclusive) pode ser usado
tambm para economizar
memria.
Valor
mnimo
de
2.147.483.648 e mximo
de
2.147.483.647

www.borgesrinolfi.com.br

Valor
Padro
(Default
)
0

Programao em Java

Long

6
4

Float

3
2
(754
pontos
flutuantes
)

Double

6
4
(754
pontos
flutuantes
)

Boolea
n

17 |

(inclusive). Escolhido para


valores do tipo inteiro,
positivos e negativos.
Valor
mnimo
de
9.223.372.036.854.775.80
8
e
mximo
de
9.223.372.036.854.775.80
7
(inclusive).
Usado
quando h a necessidade
de um espao de valores
maiores do que o int.
Utilizado para valores
decimais
positivos
e
negativos.
No

recomendado o seu uso


para
valores
muitos
precisos como moedas,
para isso melhor utilizar
objetos
como
java.math.BigDecimal.
Utilizado para valores
decimais
positivos
e
negativos
com
uma
abrangncia maior do que
o float. Tambm no
recomendado o seu uso
para
valores
muitos
precisos como moedas,
para isso melhor utilizar
objetos
como
java.math.BigDecimal.
Tipo de dados com
somente
dois
valores

www.borgesrinolfi.com.br

0L

0.0f

0.0d

False

Programao em Java

Char

1
6

possveis True ou False


(verdadeiro ou falso).
Utilizado para representar
caracteres Unicode. O
valor mnimo \u0000
(ou 0) e o mximo \uffff
(ou 65.535 inclusive)

\u0000

Tabela 1: Tipos primitivos existentes em Java

O tipo de dados utilizado no Java para


representar uma string (cadeia de caractere), a classe
java.lang.String, a cada vez que voc coloca os
caracteres entre aspas duplas, automaticamente
criado um objeto da classe String.
Por exemplo, String s = string de teste. String
no um tipo primitivo de dados, uma classe com
suporte especial pela linguagem Java, fazendo com que
parea ser um tipo primitivo.
Variveis
No Java as variveis precisam ser declaradas
antes de serem utilizadas e podem ser divida em quatro
tipos:
Instancia de Variveis (Campos No esttico)
espaos de memria para armazenar valores
no estticos e que pode ser diferente para cada
instncia.
Variveis de Classe (Campos Estticos)
qualquer campo declarado com o modificador
static, que define um valor nico para todas as
instancias da classe.

18 |

www.borgesrinolfi.com.br

Programao em Java

Variveis Locais A sintaxe para criao da


varivel a mesma utilizada para os outros
tipos, porm ela criada dentro de um mtodo e
valida somente dentro dele, sendo visvel
tambm somente dentro do mtodo e no sendo
acessvel para o resto da classe.
Parmetros So variveis utilizadas para
passagem de parmetros entre os objetos.

Para criar variveis elas devem seguir algumas


regras como, por exemplo:
Os nomes so case sensitive, ou seja, faz
diferena escrever uma varivel com letras
minsculas e maisculas.
O primeiro nome tem que ser uma letra
No pode utilizar caracteres especiais (por
exemplo: $@&)
No pode possuir espaos em branco
No pode ser palavra reservada para uso da
linguagem Java, para consultar as palavras
reservadas
do
Java
consulte
o
link
http://docs.oracle.com/javase/tutorial/java/nutsan
dbolts/_keywords.html
No Java a sintaxe para se declarar uma varivel
segue a seguinte forma:
tipoDeDado nomeDaVariavel
Cdigo 4: Forma de declarao de varivel

Como os exemplos abaixo:


19 |

www.borgesrinolfi.com.br

Programao em Java

float valor;
int numero;
Cdigo 5: Exemplo de declarao de varivel

Constantes
Constantes so similares a varivel, com uma
diferena, no possvel alterar o seu valor durante a
execuo do cdigo, o seu valor imutvel.
As constantes so muito utilizadas para lembrarse de algum nmero muito grande ou um valor que
pode ser identificado pelo nome da constante.
Para declarar uma constante em java, deve-se
adicionar a palavra static antes do tipo de dado,
conforme exemplo abaixo:
final float PI = 3.14159265f;
Cdigo 6: Declarao de constantes

Atribuio de valores
Para poder utilizar a varivel aps a sua
declarao voc pode atribuir valores a essas variveis.
Isso pode ser feito de varias formas, segue algumas
delas:
Atribuio de valor na mesma linha da
declarao da varivel, nesse caso a varivel j
criada com um valor inicial.
int numero = 10;
Cdigo 7: Atribuindo valores

20 |

www.borgesrinolfi.com.br

Programao em Java

Atribuir valor em qualquer momento aps a


declarao da varivel, aps a sua declarao o valor
padro atribuda a varivel, at que esse valor seja
alterado.
int numero; //nesse momento valor da varivel
0
numero = 10;
Cdigo 8: Atribuio de valor em um segundo momento

Casting
Alguns tipos de dados quando declarados no
podem assumir posies de valores com menor
capacidade, como por exemplo:
long valor = 1000;
int numero = valor;
Cdigo 9: Erro por tipos de dados incompativeis

Isso causaria um erro de compilao, pois,


embora o nmero 1000, de certo em uma varivel do
tipo inteiro, a varivel valor de um tipo de dado que
suporta pontos flutuantes e o inteiro no e com isso
voc pode estar perdendo informao. Se realmente
quisermos fazer essa operao, temos que converter o
valor da varivel para inteiro, ou seja, fazer um casting
conforme cdigo abaixo:
long valor = 1000;
int numero = (int) valor;
Cdigo 10: Casting de tipo de dados

Mais alguns tipos de casting:


char a = 'a';
21 |

www.borgesrinolfi.com.br

Programao em Java

int b = (int) 5.1987;


float c = (float) 5.0;
int d = (char) (a + 5);
char e = (char) 110.5;
Cdigo 11: Outros tipos de casting de variaveis

Nem todos os tipos de dados so possveis


converter, para isso segue abaixo uma tabela dos tipos
possveis de casting:
DE \
PARA
byte

Byte

short

char

int

long

float

double

Implcito

char

Implcito

Implcito

Implcito

Implcito

short

byte

char

Implcito

Implcito

Implcito

Implcito

char

byte

short

Implcito

Implcito

Implcito

Implcito

int

byte

short

char

Implcito

Implcito

Implcito

long

byte

short

char

int

Implcito

Implcito

float

byte

short

char

int

long

double

byte

short

char

int

long

Implcito
float

Tabela 2: Tipos de Casting possveis

Instrues ou Comandos
Operadores Aritmticos
Os operadores aritmticos so utilizados para
fazer operaes matemticas, manipulando os dados
(variveis) criados no cdigo. Segue abaixo alguns
exemplos de operadores aritmticos:
int soma = 1 + 1; //resultado igual a 2
int subtracao = 2 - 1; //resultado igual a 1
22 |

www.borgesrinolfi.com.br

Programao em Java

int multiplicacao = 3 * 3; //resultado igual


a 6
int divisao = 6 / 2; //resultado igual a 3
int modulo = 6 % 2; //resultado igual a 0
Cdigo 12: Operadores aritmticos em Java

O operador aritmtico mdulo (%) retorna o


resta da diviso entre os dois nmeros, no exemplo
acima (6 / 2), tem o resto da diviso igual a 0. Esse
tipo de operar muito utilizado para identificar se um
nmero par ou impar.
ATENO: Os operadores seguem as mesmas
regras de precedncia da matemtica, podendo ser
limitada por parnteses, obedecendo sempre a regra
matemtica.

Operadores de Atribuio
Os operadores de atribuio so utilizados para
atribuir um determinado valor a varivel, sem perceber
j vimos o operador =, que atribui valor a varivel, alm
dele temos outros operadores como segue abaixo:
Operador

+=

-=

23 |

Descrio
Operador
incremental - soma
valor da varivel e
atribui valor.
Operador
Decremental
subtrai
valor
da

Exemplo
int numero = 1;
numero += 2; //o valor
3 atribudo a
varivel numero
int numero = 2;
numero -= 2; //o valor
0 atribudo a
varivel numero

www.borgesrinolfi.com.br

Programao em Java

*=

/=

%=

varivel e atribui
valor.
Operador
Multiplicador

multiplica valor da
varivel e atribui
valor.
Operador Divisor
divide
valor
da
varivel e atribui
valor.
Operador Mdulo
divide
valor
a
varivel e atribui
valor.do resto da
diviso a varivel

int numero = 2;
numero *= 3; //o valor
6 atribudo a
varivel numero

int numero = 6;
numero /= 2; //o valor
3 atribudo a
varivel numero
int numero = 4;
numero %= 3; //o
valor 1 atribudo a
varivel numero

Tabela 3: Operadores de Atribuio

Todas essas operaes poderiam ser feitas com


os operadores aritmticos, porm como pudemos
perceber, com essa sintaxe, economizamos cdigo e
deixamos o cdigo fonte mais legvel.
Alm desses operadores de atribuio, temos
tambm alguns operadores de incremento e
decremento de um em um, tambm com cdigo
reduzido.
Ao invs de escrevermos um cdigo como:
int numero = 6;

24 |

www.borgesrinolfi.com.br

Programao em Java

int incrementado = numero + 1; //o valor 7


atribudo a varivel incrementado
Cdigo 13: Incrementando um nmero

Podemos escrever da seguinte forma:


int numero = 6;
int incrementado = numero++; //o valor 6
atribudo a varivel incrementado, e a
varivel numero passa a valer 7
Cdigo 14: Incrementando um numero de forma mais limpa no
cdigo

Essa forma chamada de PS-INCREMENTO,


primeiro atribui o valor a varivel, para depois fazer o
incremento, por isso a varivel numero, primeiro foi
atribudo o seu valor a varivel incrementado e depois
a varivel numero foi adicionado 1 a ela, fazendo com
que ela passasse a valer 7.
No PR-INCREMENTO o valor atribudo a
varivel incrementado, j vem com valor da varivel
numero somado, conforme exemplo abaixo:
int numero = 6;
int incrementado = ++numero; //A
numero passa a valer 7, e este
atribudo a varivel incrementado.

varivel
valor

Cdigo 15: Utilizando ps-incremento em java

Operadores Relacionais
Todo programa feito de tomada de
decises com respostas podendo ser, verdadeira ou
falsa e mais nada, no permitindo redundncia ou
25 |

www.borgesrinolfi.com.br

Programao em Java

duvidas nas decises. Para essas comparaes


utilizamos os operadores relacionais, seguem
abaixo quais so os operadores:
Operador

==

26 |

Descrio
Exemplo
Igualdade verifica int numero = 1;
se o primeiro valor boolean resultado;
resultado = (numero
IGUAL ao segundo

!=

Diferena verifica
se o primeiro valor
DIFERENTE
ao
segundo

<

Menor verifica se o
primeiro
valor

MENOR ao segundo

<=

Menor ou igual
verifica se o primeiro
valor MENOR OU
IGUAL ao segundo

>

Maior verifica se o
primeiro
valor

MAIOR ao segundo

== 2); //o valor false


atribudo a varivel
resultado
int numero = 1;
boolean resultado;
resultado = (numero
!= 2); //o valor true
atribudo a varivel
resultado
int numero = 1;
boolean resultado;
resultado = (numero <
2); //o valor true
atribudo a varivel
resultado
int numero = 1;
boolean resultado;
resultado = (numero
<= 2); //o valor true
atribudo a varivel
resultado
int numero = 1;
boolean resultado;
resultado = (numero >
2); //o valor false

www.borgesrinolfi.com.br

Programao em Java

>=

Maior ou igual
verifica se o primeiro
valor MAIOR OU
IGUAL ao segundo

atribudo a varivel
resultado
int numero = 1;
boolean resultado;
resultado = (numero
== 2); //o valor false
atribudo a varivel
resultado

Tabela 4: Operadores Relacionais em Java

Operadores Lgicos
As decises aprendidas no tpico anterior
podem ser feitas em conjunto com duas ou mais
decises, trazendo para o programa apenas um
resultado true ou false, para isso utilizado os
operadores lgicos E ou OU, segue abaixo:
Operador
Descrio
Exemplo
Condio E faz a int numero = 1;
&&
verificao e as boolean resultado;
duas
condies resultado = (numero >
0 && numero < 3 ); //o
devem
ser valor true atribudo
verdadeiras
para a varivel resultado
que seja retornado
true
Condio OU faz int numero = 1;
||
a verificao e uma boolean resultado;
das duas condies resultado = (numero
deve ser verdadeira == 2 || numero > 10 );
//o valor false
para
que
seja
atribudo a varivel
retornado true
resultado

Tabela 5: Operadores Lgicos em Java


27 |

www.borgesrinolfi.com.br

Programao em Java

Estruturas de Controle
O fluxo de um sistema desenvolvido pode ter
seu rumo alterado conforme o valor inserido (Deciso),
ou tem-se a necessidade de repetir algum trecho de
cdigo por algum perodo seja ele fixo, ou por alguma
condio de parada (Repetio). Para isso temos
alguns recursos para controle do fluxo do programa,
vamos ver quais so e como funciona cada um deles.
Deciso
IF-Else

Este um dos comandos mais comuns para


controle de fluxo. Com as tomadas de decises
trazendo respostas booleanas, ou seja, verdadeiras ou
falsas, pode ser que eu queira tomar alguma ao se
for verdadeira e outra completamente diferente se for
falsa, e para esse tipo de controle usamos o If-Else, que
pode facilmente ser traduzido para Se-Seno, para
essas tomadas de decises utilizamos os operadores
lgicos <, >, <=, >=.
Por exemplo, para verificar se o valor digitado
no negativo, para o caso de validao de um sistema
de pagamento de uma conta, por exemplo:
if ( valor < 0) {
System.out.println
negativo ");
} else {

28 |

("O

valor

no

www.borgesrinolfi.com.br

pode

ser

Programao em Java

System.out.println
");
}

("O

valor

esta

correto.

Cdigo 16: Estrutura if-else

O bloco else opcional, caso voc queira que


algo acontea.
O comando if-else pode ser aninhado com
vrias sequencias de decises, e a sequencia das
decises so seguidas, caso a primeira seja satisfeita,
nenhuma mais ser testada, conforme o exemplo
abaixo:
if ( nota >= 9) {
System.out.println
("Voc
passou
com
louvor!");
} else if ( nota >= 8) {
System.out.println ("Voc passou!");
} else if ( nota >= 7) {
System.out.println ("Voc passou raspando!");
} else if ( nota >= 6) {
System.out.println ("Voc no passou pois a
mdia 7, tente novamente!");
} else {
System.out.println
("Voc
precisa
estudar
mais!");
}
Cdigo 17: Estrutura if-else aninhada

Switch

O Comando switch pode ter vrios caminhos de


execuo possveis, conforme exemplo abaixo:
int numero = 8;

29 |

www.borgesrinolfi.com.br

Programao em Java

String colocacao;
switch (numero) {
case 1: colocacao =
break;
case 2: colocacao =
break;
case 3: colocacao =
break;
case 4: colocacao =
break;
case 5: colocacao =
break;
case 6: colocacao =
break;
case 7: colocacao =
break;
case 8: colocacao =
break;
case 9: colocacao =
break;
case 10: colocacao =
break;
default: colocacao

"Primeiro";
"Segundo";
"Terceiro";
"Quarto";
"Quinto";
"Sexto";
"Stimo";
"Oitavo";
"Nono";
"Dcimo";
=

"Acima

do

dcimo";
break;
}
System.out.println(colocacao);
Cdigo 18: Estrutura do comando switch

Neste cdigo a varivel numero representa a


colocao do candidato e deve ser impressa na tela a
colocao por extenso at a 10 posio, acima desta
posio deve aparecer a mensagem "Acima do
dcimo", como a varivel nmero 8, deve ser
impresso na tela a mensagem "Oitavo".

30 |

www.borgesrinolfi.com.br

Programao em Java

ATENO: No bloco do switch eu posso ter


quantos case for necessrio, a instruo break
necessrio para o comando parar de ser executado
aps ter encontrado a opo correta, caso contrrio
todos os case abaixo da opo escolhida, tambm
ser executado.
Repetio
Estruturas de repetio so utilizadas para
executar um trecho de cdigo algumas vezes, ou um
nmero de vezes fico ou definindo uma condio de
parada.
While e Do-While

O comando WHILE executa um trecho de cdigo


enquanto a condio permanecer verdadeira.
Por exemplo, o cdigo abaixo imprime nmeros
de 1 a 100.
int contador = 1;
while (contador <= 100){
System.out.println("Nmero
contador);
contador++;
}

"

Cdigo 19: Estrutura do comando while

A varivel contador comea com o valor igual a


1, e a condio que ENQUANTO contador for
menor ou igual a 100, ele ira executar o trecho de
cdigo que imprime o nmero (System.out.println("Nmero
" + contador);) e incrementa a varivel contador
(contador++;)
31 |

www.borgesrinolfi.com.br

Programao em Java

ATENO: importante definir uma condio de


parada, pois caso no seja bem definido teremos o que
chamamos de um lao infinito, o que quer dizer que s ira
terminar quando o programa for encerrado.
Na repetio DO-WHILE a nica diferena que a
verificao da condio feito no final, ou seja, sempre ser
executado pelo menos uma vez o bloco de cdigo desejado.
Veja o mesmo exemplo acima, feito com DO-WHILE:
int contador = 1;
do{
System.out.println("Nmero
contador);
contador++;
}while(contador <= 100);

"

Cdigo 20: Estrutura do comando DO-WHILE

For

O lao for bem parecido com o while porm


as variveis de controle do lao so passadas como
parmetro na mesma instruo. Vamos ver o exemplo
com o mesmo programa feito acima utilizando for:
for(int cont=1; cont <= 100; cont++){
System.out.println("Nmero
"+cont);
}
Cdigo 21: Estrutura do comando FOR

Para percorrer colees e arrays, temos uma


forma mais simplificada da instruo for, basta dizer a
coleo e o prprio comando j controla o nmero de
32 |

www.borgesrinolfi.com.br

Programao em Java

vezes que o lao ir percorrer, como no exemplo


abaixo:
int[] numeros = {1, 2, 3, 4, 5};
for (int cont : numeros) {
System.out.println("Nmero: "

cont);
}
Cdigo 22: Estrutura do For-each

Esse lao ira percorrer as 5 posies do array


chamado numeros, e guardar a posio atual na
varivel cont para que possa ser utilizado dentro do
lao.

33 |

www.borgesrinolfi.com.br

Programao em Java

2. Orientao a Objetos
A programao Orientada a Objetos foi
desenvolvida para resolver alguns problemas da
programao procedural como, por exemplo:
Muita linha de cdigo
Difcil manuteno
Difcil avaliar impacto de mudanas
No modularizado
Basicamente a orientao objetos consiste em
trazer a programao o mais prximo possvel do
mundo real. Ou seja, no mundo real o que temos so
objetos interagindo um com outro, atravs de troca de
mensagens.

34 |

www.borgesrinolfi.com.br

Programao em Java

Como no exemplo ilustrado abaixo:

Mensagem:
Oi tudo bem?

Objeto: Paulo
Ao: Falar

Objeto: Rafaela
Ao: Ouvir

Figura 9: Troca de mensagem, principio bsico da


Orientao a Objetos

A orientao a objetos consiste em considerar


uma coleo de objetos que interagem de maneira
organizada.
Pode parecer complicado, mas veremos como
traduzir isso para o mundo computacional.
A
responsabilidade
do
programador

especificar quais sero as mensagens que cada objeto


pode receber e tambm qual ao o objeto deve fazer
ao receber a mensagem.
Por exemplo, vamos imaginar um caso real,
temos que desenvolver um software para uma locadora
que tem diversos clientes.

35 |

www.borgesrinolfi.com.br

Programao em Java

EscolherFilme
(nomeDoFilme)

Objeto: Cliente1
Ao: EscolherFilme

serAlugado()

Objeto: Atendente
Ao: ReservarFilme

Objeto: Filme
Ao: serAlugado

Figura 10: Representao de objetos do mundo real

1. O objeto cliente escolhe o filme e passa uma


mensagem para o objeto atendente com um
parmetro, que o nome do filme que o cliente
deseja.
2. O Atendente ao receber essa mensagem
reserva o filme, enviando uma mensagem ao
objeto Filme.
3. O Filme ao receber essa mensagem, colocado
em um status de alugar, atravs da ao
serAlugado.
Esses objetos so estruturas de programao
que contm informaes e os comportamentos que
representam um objeto dentro do sistema.

Classes
Uma classe uma estrutura criada para criao
de objetos.

36 |

www.borgesrinolfi.com.br

Programao em Java

Vimos que um objeto representa algo do mundo


real, e podemos ter vrios objetos do mesmo tipo, por
exemplo, pessoas so bilhes de pessoas no mundo
com as mesmas caractersticas, e para isso criarmos
uma estrutura nica que pode representar vrios
objetos. Como no modelo abaixo:

Objeto: Pessoa1
Atributos:
Nome: Joo
Idade: 18
Sexo: Masculino
Ao:
Classe: Pessoa

falar()

Atributos:
Nome
Idade
Sexo
Ao:
falar()

Objeto: Pessoa2
Atributos:
Nome: Maria
Idade: 25
Sexo: Feminino
Ao:
falar()

Figura 11: Classe estrutura que se pode gerar vrios objetos

como se a Classe fosse uma receita de um


bolo, a receita em si ela no fsica e no ocupa um
espao, no tem cheiro, porm atravs dela podemos
criar um bolo real que tem cheiro, e fsico. A receita

37 |

www.borgesrinolfi.com.br

Programao em Java

seria a Classe e a partir dela posso criar vrios bolos,


ou melhor, objetos.
Agora que j sabemos o que uma classe
vejamos como criar a classe Pessoa, definida acima,
em Java.
Criamos um arquivo chamado Pessoa.java
contendo o seguinte cdigo:
public class Pessoa {
//Variveis (Atributos)
public String nome;
public int idade;
public String sexo;
//Mtodos (aes)
public void falar(){
System.out.println("Oi, Tudo bem?");
//comando para exibir Oi, Tudo bem? na tela
}
}
Cdigo 23: Cdigo da classe Pessoa.java

Atributos
As variveis (atributos) da classe pessoa so nome,
idade e sexo, todas elas so declaradas da seguinte forma:
<modificador
de acesso>
<nome da varivel>

<tipo

de

dados>

Cdigo 24: Estrutura de declarao de varivaies

Onde os modificadores de acesso podem ser:


38 |

www.borgesrinolfi.com.br

Programao em Java

public Todas as outras classes tem acesso a essa


varivel
private Somente a prpria classe pode acessar as
variveis (no caso a classe Pessoa)
protected As classes do mesmo pacote ou
subclasses, podem acessar as variveis.

Veremos mais detalhes sobre os modificadores


no prximo capitulo.

Mtodos
Mtodos so procedimentos ou funes, que
tem a capacidade de manipular os atributos para
executar alguma ao atribuda a classe, por exemplo a
nossa classe Pessoa, tem a responsabilidade de falar, e
por isso foi especificado um mtodo chamado falar
com um cdigo para exibir uma frase na tela.
Todos os mtodos so compostos de:
<modificador de acesso> <tipo
<nome do mtodo> (<parmetros>)

de

retorno>

Cdigo 25: Estrutura bsica de um mtodo

39 |

Onde:
Modificadores de acesso - so os mesmos que
vimos para as variveis.
Tipo de Retorno trata-se do valor que ser
retornado aps a execuo do mtodo, pode ser
utilizado todos os tipos de dados j conhecidos.
Nome do Mtodo deve ser um nome coerente
com a ao que ele faz, inicia-se com letra
minscula por conveno.
www.borgesrinolfi.com.br

Programao em Java

Parmetros so variveis que o mtodo


recebe para poder manipular e auxiliar a ao
que ser feita.

Chamamos essa definio do mtodo, de


assinatura do mtodo, ou seja, no sabemos ainda a
sua implementao, mas j podemos entender o que
ela deve fazer, os parmetros que recebe e o tipo de
retorno.

Sobrecarga de mtodos
Em java podemos ter dois mtodos com o
mesmo nome, desde que tenham parmetros
diferentes, chamamos isso de sobrecarga de mtodos.
Por exemplo:
//Mtodos (aes)
public void falar(){
System.out.println("Oi,
Tudo
bem?");//comando para exibir Oi, Tudo bem?
na tela
}
public void falar(String frase){
System.out.println(frase);//comando
para exibir o contedo da varivel 'frase' na
tela
}
Cdigo 26: Dois mtodos podem ter o mesmo nome
desde que tenham parmetros diferentes

Objetos
40 |

www.borgesrinolfi.com.br

Programao em Java

Como vimos at agora a linguagem java tem


toda sua estrutura baseada em objetos interagindo
entre si atravs de passagem de parmetros utilizando
mtodos.
Veremos agora como criar, na prtica, alguns
objetos, aproveitando ainda o exemplo de pessoas.
Criaremos
uma
nova
classe
chamada
ExemploObjetos.java.
1 public class ExemploObjetos {
2
public static void main(String[] args)
{
3
Pessoa pessoa1; //a varivel
'pessoa1' do tipo Pessoa
4
5
pessoa1 = new Pessoa();
//'pessoa1' foi alocado na memria tendo
todos atributos de Pessoa
6
7
//atribuindo valor para os
atributos do objeto
8
pessoa1.nome = "Joo";
9
pessoa1.idade = 18;
10
pessoa1.sexo = "Masculino";
11
}
12 }
Cdigo 27: : Criao de objetos e atribuio de valores
a seus atributos

Na linha 3 apenas declaramos que a varivel


pessoa1 uma varivel do tipo Pessoa, ou seja, ela
ter todas as caractersticas de pessoas.

41 |

www.borgesrinolfi.com.br

Programao em Java

Na linha 5 onde efetivamente criamos (ou


como dizemos instanciamos), a palavra reservada new
quem tem a capacidade de criar o objeto, a frente da
palavra new, esta o construtor, que inicializa o objeto,
veremos mais detalhes do construtor no prximo
captulo.
Aps a criao do objeto j temos alocado na
memria o valor padro de cada atributo da classe
Pessoa, conforme vemos abaixo:

Varivel: pessoa1
Tipo: Pessoa.java
Atributos:
String nome = null;
int idade = 0;
String sexo = null;

Das linhas 8 a 10 alteramos os valores desses


atributos.
J que temos agora o objeto pronto com os
valores iniciados podemos fazer a chamada ao seu
mtodo da seguinte forma:
pessoa1.falar();
Desta forma estamos chamando o mtodo
falar(), que pelo cdigo dele escreve na tela a
mensagem Oi, Tudo bem?.

42 |

www.borgesrinolfi.com.br

Programao em Java

Para entendermos melhor a importncia dos


mtodos e dos atributos, vamos alterar o cdigo do
mtodo falar() da classe Pessoa para o cdigo abaixo:
public void falar(){
System.out.println("Oi, Tudo bem? Meu
nome : " + this.nome);//comando para exibir
Oi, Tudo bem? Meu nome : + valor da
varivel nome na tela
}
Cdigo 28: Imprimindo uma mensagem na tela

Agora

vamos

modificar

classe

ExemploObjetos.java para o cdigo abaixo:


public class ExemploObjetos {
public static void main(String[] args) {
Pessoa
pessoa1;
//a
varivel
'pessoa1' do tipo Pessoa
pessoa1 = new Pessoa(); //'pessoa1'
foi alocado na memria tendo todos atributos
de Pessoa
//atribuinto valor para os atributos
do objeto
pessoa1.nome = "Joo";
pessoa1.idade = 18;
pessoa1.sexo = "Masculino";
pessoa1.falar();
Pessoa pessoa2;
pessoa2 = new Pessoa(); //'pessoa2'
foi alocado na memria tendo todos atributos
de Pessoa
43 |

www.borgesrinolfi.com.br

Programao em Java

//atribuinto valor para os atributos


do objeto
pessoa2.nome = "Maria";
pessoa2.idade = 25;
pessoa2.sexo = "Feminino";
pessoa2.falar();
}
}
Cdigo 29: Criao de dois objetos e chamada de
mtodo

Temos agora dois objetos criados (pessoa1 e


pessoa2) com base na classe Pessoa, e chamamos o
mtodo falar() dos dois objetos. O resultado final que
devemos ver na tela o seguinte:
Oi, Tudo bem? Meu nome : Joo
Oi, Tudo bem? Meu nome : Maria

Construtores
Como pudemos ver no cdigo da classe
ExemploObjetos.java primeiro instanciamos o objeto
(new) e depois nas linhas 8 a 10 e 19 a 21, atribumos
valores aos atributos do objeto.
O construtor um mtodo que chamado no
momento da inicializao do objeto. Ele deve ter o
nome idntico ao da classe, e no tem um tipo de
retorno.

44 |

www.borgesrinolfi.com.br

Programao em Java

Para criar um construtor para


Pessoa.java utilizaremos o cdigo abaixo:

classe

//Construtor
para
inicializar
as
varivveis
public Pessoa(String nome, int idade,
String sexo) {
this.nome = nome;
this.idade = idade;
this.sexo = sexo;
}
Cdigo 30: Construtor da classe Pessoa.java

Aps essa alterao, temos que alterar a classe


ExemploObjetos.java, conforme o cdigo abaixo:
public class ExemploObjetos {
public static void main(String[] args) {
Pessoa pessoa1;
pessoa1
=
new
Pessoa("Joo",18,"Masculino");
pessoa1.falar();
Pessoa pessoa2;
pessoa2 = new Pessoa("Maria",
"Feminino");
pessoa2.falar();
}
}

25,

Cdigo 31: Criao de objetos utilizando construtores


para inicializar os atributos

Agora ao instanciarmos um objeto da classe


Pessoa, o mtodo inicializador, ou seja, o construtor j
atribuiu os valores para seus atributos, e no
precisamos atribuir um a um.
45 |

www.borgesrinolfi.com.br

Programao em Java

Anteriormente conseguimos instanciar a classe


Pessoa, sem ter definido explicitamente um construtor
padro, de padro a classe j tem um construtor que
no recebe parmetro nenhum, porm devemos tomar
cuidado, pois os atributos vo assumir o valor padro
de acordo com o tipo de dados.
Para garantirmos que todos os atributos
essenciais sejam preenchidos com valores reais,
necessrio especificar um construtor.
ATENO: como o construtor um mtodo,
podemos tambm fazer sobrecarga dele.

Pacotes e importaes
Com a orientao a objetos, cada classe um
arquivo, alm do arquivo principal, e de muitos outros
que so criados nesse tipo de projeto. Para isso
precisamos organizar muito bem os cdigos, para o
java se aproveita de uma estrutura j conhecida que
so as pastas e dentro dessas pastas colocamos
nossos arquivos.
A diferena que no Java chamamos essas
pastas de pacotes (packages).
Aps incluir o arquivo .java no diretrio
desejado, feita uma declarao desse pacote na
primeira linha do arquivo, conforme cdigo abaixo:
46 |

www.borgesrinolfi.com.br

Programao em Java

package primeiroexemplo;
public class Pessoa {
//cdigo da classe
}
Cdigo 32: Declarao de pacote (package)

Por exemplo, no cdigo acima, a classe Pessoa


foi
colocada
dentro
da
pasta
chamada
primeiroexemplo, por isso declaramos o pacote de
mesmo nome na primeira linha, usando a palavra
reservada package.
Caso o arquivo esteja dentro de uma subpasta,
separamos com o operado ., e declaramos todas as
pastas existentes, conforme exemplo abaixo, dentro da
pasta primeiroexemplo existe uma subpasta chamada
classes e dentro desta esta a classe Pessoa.
package primeiroexemplo.classes;
public class Pessoa {
//cdigo da classe
}
Cdigo 33: Declarao de pacote utilizando subpastas

Quando duas classes esto dentro do mesmo


pacote elas se conversam sem precisar de nenhuma
declarao, como no exemplo abaixo:
package primeiroexemplo;

47 |

www.borgesrinolfi.com.br

Programao em Java

public class Motor {


}
package primeiroexemplo;
public class Carro {
private Motor motor;
}
Cdigo 34: Duas classes no mesmo pacote se
conhecem facilmente

Porm se dividirmos as duas classes cada uma


em um pacote diferente, precisaremos usar o comando
import do java para podermos dizer onde se localiza a
classe desejada, conforme o cdigo abaixo:
package primeiroexemplo;
import primeiroexemplo.pecas.Motor;
public class Carro {
private Motor motor;
}
Cdigo 35: Classes em pacotes diferentes necessitam
de um import

Modificadores de acesso
As classes, mtodos e atributos so declarados
podendo ser especificado um modificador de acesso, ou
seja, quem so as classes que podero ter acesso a
essa informao.

48 |

www.borgesrinolfi.com.br

Programao em Java

No java existem quatro tipos de modificadores


de acesso, publico (public), privado (private) e protegido
(protected).

public visvel por todas as classes do


projeto.
private somente a prpria classe tem acesso
a ele mesmo.
protected todas as classes que esto no
mesmo pacote (package) pode tem acesso, e
tambm as suas subclasses, mesmo que esteja
em outro pacote (ver mais em Herana).

Dica: seja o mais restritivo possvel com suas


variveis e mtodos, se voc no tiver um bom motivo
use private.

Herana
Imagine o seguinte cenrio em nossos sistemas
temos duas classes uma representando os Clientes e
outra representando os Funcionrios, conforme o
desenho abaixo:

49 |

www.borgesrinolfi.com.br

Programao em Java

Figura 12: Classes Funcionario.java e Cliente.java tem


atributo iguais

Podemos observar que os atributos nome e


CPF so comuns as duas classes, com isso podemos
criar uma categoria maior para classifica-los, com seus
atributos em comuns, conforme diagrama abaixo:

Figura 13: Herana, unificando as caractersticas


comuns na superclasse Pessoa.java

50 |

www.borgesrinolfi.com.br

Programao em Java

As classes Funcionrio e Cliente, ficaram com


os atributos especficos deles e a classe Pessoa foi
criada com os atributos em comuns entre eles.
Dizemos que a classe Funcionario HERDA as
capacidades da classe Pessoa, ou seja, todos os
atributos e mtodos pblicos (public) e protegidos
(protected) existentes na classe Pessoa podem ser
acessados pela classe Funcionario.
A classe Funcionario chamada de classe
filha ou subclasse e a classe Pessoa chamaa de
superclasse ou classe pai.
A herana um conceito simples, mas muito
importante para orientao a objetos, com ela que
podemos reutilizar cdigos e atributos j escritos, sem
ter que reescrever, apenas herdando as suas
capacidades, chamamos isso de reusabilidade de
cdigo.
Em Java a herana expressa pela palavra
reservada extends, o cdigo das classes ilustradas
acima ficaria da seguinte forma:
public class Pessoa {
//atributos
public Integer CPF;
public String nome;
//outros cdigos da classe
51 |

www.borgesrinolfi.com.br

Programao em Java

}
Cdigo 36: Superclasse, ou classe pai, Pessoa.java

public class Cliente extends Pessoa {


//atributos
public String classificacao;
//outros cdigos da classe
}
Cdigo 37: Subclasse, ou classe filha, Cliente.java

public class Funcionario extends Pessoa {


//atributos
public Integer CTPS;
public double salario;
//outros cdigos da classe
}
Cdigo 38: Subclasse, ou classe filha, Funcionario.java

Casting
Para criar um objeto da classe Funcionario,
podemos utilizar o cdigo abaixo:
Funcionario func1 = new Funcionario();
Cdigo 39: Criao do objeto Funcionario

A varivel func1 do tipo Funcionario, porm


como a classe Funcionario estende (ou seja, herda) as
caractersticas da classe Pessoa, podemos tambm
escrever:
52 |

www.borgesrinolfi.com.br

Programao em Java

Pessoa pessoa

= new Funcionario();

Cdigo 40: Tratar o objeto funcionario como Pessoa,


afinal, pela herana o Funcionario uma Pessoa

Com isso estaremos criando um objeto


Funcionario (new Funcionario()), mas sabemos que ele
uma Pessoa, e podemos trata-lo como tal. Porm se
tentarmos fazer o inverso:
Pessoa pessoa = new Pessoa();
Funcionario func1 = pessoa;
Cdigo 41: No tem como o compilador saber se
Pessoa um Funcionario

Como a varivel pessoa do tipo Pessoa, no tem


como o compilador saber se objeto vem de um Funcionario
ou de um Cliente, causando um erro. Por isso podemos
especificar para o compilador que tipo de objetos ele , e isso
chama-se CASTING.
Funcionario func1 = (Funcionario) pessoa;
Cdigo
Funcionario

42:

Fazendo

casting

de

Pessoa

para

Caso voc tambm no saiba o tipo do objeto


pessoa, voc pode utilizar o cdigo abaixo para
verificar:
if (pessoa instanceof Funcionario) {
Funcionario func1 = (Funcionario)
pessoa;
}
Cdigo 43: Utilizando INSTANCEOF para saber qual a
instancia do objeto
53 |

www.borgesrinolfi.com.br

Programao em Java

como se fizssemos a seguinte pergunta O


objeto pessoa instanciado pela classe Funcionrio?.

Polimorfismo
a capacidade de trabalhar com objetos
referenciados de vrias formas, agrupando os objetos.
Por exemplo, no exemplo utilizado acima
tnhamos polimorfismo sendo utilizado na seguinte
linha:
Pessoa pessoa

= new Funcionario();

Cdigo 44: Polimorfismo tratar um objeto como, outra


classe (uma classe pai, ou uma interface)

Ou seja, temos um objeto Funcionrio sendo


criado (new Funcionario()), porm ele esta sendo
tratado como Pessoa (Pessoa pessoa), somente poder
executar os mtodos disponveis na classe Pessoa.
ATENO: Isso no quer dizer que o objeto
Funcionrio se transformou em Pessoa, toda e qualquer
cdigo escrito na classe Funcionrio, ser executada,
pois assim que o objeto foi criado na memria.
Para esclarecer melhor a utilidade do
polimorfismo voltemos ao exemplo acima, com o
seguinte modelo:

54 |

www.borgesrinolfi.com.br

Programao em Java

Figura 14: Herana de Pessoa, Funcionario e Cliente

Imagine que agora temos a necessidade de criar


uma classe de mala direta responsvel por imprimir
etiquetas para todas as Pessoas da empresa,
independente de ser Funcionario ou Cliente, porm,
caso seja um funcionrio, deve ser impressa nessa
etiqueta o nmero CTPS do funcionrio.
Para isso podemos criar uma classe chamada
MalaDireta
com
um
mtodo
chamado
imprimirEtiquetas, conforme modelo abaixo:
public class MalaDireta {
public void imprimirEtiquetas(Funcionario
funcionario){
System.out.println("Nome: " +
this.nome);
System.out.println("CTPS: " +
this.CTPS);
55 |

www.borgesrinolfi.com.br

Programao em Java

}
public void imprimirEtiquetas(Cliente
cliente){
System.out.println("Nome: " +
this.nome);
}
}
Cdigo 45: Desta forma teremos um mtodo para cada
objeto, se tivermos mais um objeto, teremos que escrever mais
um mtodo

A classe acima funcionaria perfeitamente para o


problema proposto, porm, caso o sistema tenha mais
uma classe que estenda as capacidades de Pessoa, ou
alguma das classes existentes (Funcionario ou Cliente)
seja removida, somos obrigados a alterar a classe
MalaDireta, adicionando ou removendo mtodos nela, o
que dificultaria e muito a manuteno desse cdigo.
Para resolvermos esse problema poderamos
utilizar o modelo abaixo:

Figura 15: Herana com a distribuio do mtodo imprimir


56 |

www.borgesrinolfi.com.br

Programao em Java

Onde temos os mtodos imprimir com os dados


das etiquetas dentro de cada entidade Cliente com uma
implementao padro que todas as suas filhas iro
utilizar, porm no caso de Funcionrio ele ter uma
implementao prpria, a instruo @Override acima
da implementao deste mtodo indica que estamos
fazendo uma Sobrescrita de Mtodos, e na classe
MalaDireta podemos criar um nico mtodo chamado
imprimirEtiquetas(Pessoa pessoa), recebendo como
parmetro um objeto da classe Pessoa, podendo ser
Funcionario ou Cliente (pois uma vez que eles
estendem a classe Pessoa, elas so uma Pessoa). Veja
abaixo como ficaria o cdigo desse modelo:
public class MalaDireta {
public void imprimirEtiquetas(Pessoa pessoa){
System.out.println(pessoa.imprimir());
}
}
Cdigo 46: Classe MalaDireta.java com o mtodo unico
que recebe Pessoa.java

public class Pessoa {


//atributos
public Integer CPF;
public String nome;
//Mtodo para imprimir etiquetas
public String imprimir(){
return "Nome: " + this.nome;

57 |

www.borgesrinolfi.com.br

Programao em Java

}
}
Cdigo 47: Classe Pessoa.java com a implementao
bsica do mtodo imprimir()

public class Cliente extends Pessoa {


//atributos
public String classificacao;
//outros cdigos da classe
}
Cdigo 48: Classe Cliente.java, ira utilizar a
implementao da superclasse, ou seja, Pessoa.java

Classe Funcionario.java
public class Funcionario extends Pessoa {
//atributos
public Integer CTPS;
public double salario;
//Mtodo
para
imprimir
etiquetas.
Sobrescrito da classe Pai, Pessoa, pois tem
caractersticas prprias.
@Override
public String imprimir() {
return
"Nome:
"
+
this.nome
+
"Carteira de trabalho: " + this.CTPS;
}
}
Cdigo 49: Classe Funcionario.java, sobrescreve o
mtodo imprimir() e tem a sua prpria implementao

Com isso podemos utilizar o cdigo abaixo em


uma classe com mtodo main, ou seja, no programa
principal:
58 |

www.borgesrinolfi.com.br

Programao em Java

public static void main(String[] args) {


MalaDireta
malaDireta
=
new
MalaDireta();
Funcionario
func1
=
Funcionario();
func1.nome = "Fucnionario 1";
func1.CPF = 123456;

new

Cliente cl1 = new Cliente();


cl1.nome = "Cliente 1";
malaDireta.imprimirEtiquetas(cl1);
malaDireta.imprimirEtiquetas(func1);
}
Cdigo 50: Classe principal, para ver o funcionamento
do polimorfismo em mtodos.

Para concluir, independente do objeto passado


como parmetro para o mtodo imprimirEtiquetas,
desde que ele seja uma classe filha de Pessoa ele ser
aceito no mtodo.

Classes e Mtodos Abstratos


Ainda no problema acima imagine que no h
implementaes padres, cada classe filha (Funcionario
e Cliente) deve, obrigatoriamente, ter a sua
implementao do mtodo imprimir, e este no seria
mais escrito na classe Pai (Pessoa.java). Para esse tipo
de problema utilizamos mtodos abstratos, ou seja, sem
implementao. A classe Pessoa passaria a ter o
seguinte cdigo:
59 |

www.borgesrinolfi.com.br

Programao em Java

public abstract class Pessoa {


public Integer CPF;
public String nome;
public abstract String imprimir();
}
Cdigo 51: Estrutura de uma classe Abstrata

Com essa alterao tambm precisamos fazer


um ajuste na classe Cliente, que no tem uma
implementao explicita do mtodo imprimir que agora
obrigatrio, a classe Cliente ficaria da seguinte forma:
public class Cliente extends Pessoa{
public String classificacao;
@Override
public String imprimir() {
return "Nome: " + this.nome;
}
}
Cdigo 52: Implementando uma classe abstrata

No mtodo principal main, no precisa de


alterao ele continua funcionando normalmente com o
mesmo resultado.
ATENO: S podemos ter mtodos abstratos
em classes abstratas, ao torna-la uma classe abstrata
NO podemos mais instanciar a classe diretamente, ou

60 |

www.borgesrinolfi.com.br

Programao em Java

seja, no podemos dar new direto na classe abstrata,


apenas em suas filhas.
Caso seja necessrio podemos ter outros
mtodos, sem ser abstratos nesta classe, ou seja,
implementado explicitamente em uma classe abstrata.

Interface
Interface como um contrato estabelecido voc
cria uma classe apenas com a assinatura dos mtodos
que deseja que sejam implementados e as classes que
implementar essa interface devem escrever todo o
cdigo dos mtodos. Veja o mesmo exemplo acima
utilizando Interface, para gerao de etiquetas.

61 |

www.borgesrinolfi.com.br

Programao em Java

Figura 16: Modelagem UML da interface


GeraEtiquetas.java

Imagine o exemplo acima reformulado, agora


queremos que alm da herana, caso alguma classe
tenha que gerar etiquetas, ela deve implementar a
interface GeraEtiquetas. como se o contrato fosse:
- Voc quer ter a capacidade de gerar
etiqueta?
- SIM
Ento
implemente
a
classe
GeraEtiqueta, e com isso voc ser
obrigado a implementar o mtodo
imprimir(), e estar apto a ser um objeto
capaz de gerar etiquetas.
62 |

www.borgesrinolfi.com.br

Programao em Java

A programao dessas classes ficaria da


seguinte forma:
public interface GeraEtiquetas {
public String imprimir();
}
Classe MalaDireta.java
public class MalaDireta {
public
void
imprimirEtiquetas(GeraEtiquetas etiqueta) {
System.out.println(etiqueta.imprimir());
}
}
Cdigo 53: Estrutura da interface GeraEtiquetas.java

public class Pessoa {


public Integer CPF;
public String nome;
}
Cdigo 54: Classe Pessoa.java

public
class
Funcionario
implements GeraEtiquetas{
public Integer CTPS;
public double salario;

extends

Pessoa

@Override
public String imprimir() {
return "Nome: " + this.nome
"Carteira de trabalho: " + this.CTPS;
}

63 |

www.borgesrinolfi.com.br

Programao em Java

}
Cdigo 55: Classe Funcionario.java estendendo as
capacidades de Pessoa e implementando a interface
GeraEtiquetas

public
class
Cliente
extends
implements GeraEtiquetas{
public String classificacao;

Pessoa

public String imprimir() {


return "Nome: " + this.nome;
}
}
Cdigo 56: Classe Cliente.java tambm estende as
capacidades de Pessoa e implementa a classe GeraEtiquetas

A vantagem de se ter interfaces que podemos


agora imprimir etiquetas de outras classes e no
apenas daquelas que herdam de Pessoa, como por
exemplo de um produto. Veja como ficaria o modelo:

64 |

www.borgesrinolfi.com.br

Programao em Java

Figura 17: Podemos agora incluir no modelo mais uma


classe para gerar etiquetas, independente da herana

Como a classe Produto assinou contrato para


ser um objeto capaz de imprimir etiquetas ele pode
utilizar
o
mtodo
da
classe
MalaDireta
imprimirEtiquetas(GeraEtiquetas etiqueta).

65 |

www.borgesrinolfi.com.br

Programao em Java

4. Excees
Excees so eventos acontecem fora do fluxo
no normal do programa, previstos ou no, e que
devemos tratar de alguma forma, seja para sugerir ao
usurio como corrigir, ou para informar que algo
aconteceu de errado, enviando uma mensagem
amigvel para o usurio do sistema.
Existem trs tipos de excees:

66 |

Checked Exceptions condies especiais


que podem ser previstas ou recuperadas, como
por exemplo, na leitura de arquivo texto, caso o
arquivo apontado no exista pode ser lanado
uma exceo (java.io.FileNotFoundException) e
ser tratada apresentando uma mensagem para o
usurio corrigir o caminho do arquivo.

Unchecked Exceptions as uncheckeds


exceptions se divide em dois grupos:
o Error define erros normalmente
externo a aplicao, so impossveis de
www.borgesrinolfi.com.br

Programao em Java

prever e de recuperar, pois so erros


graves
que
torna
impossvel
a
continuao do cdigo. Talvez voc
deseje capturar esse tipo de evento,
apenas para gravar um log, ou imprimir a
pilha de erros, para analise.
o

RuntimeExceptions

condies
internas da aplicao, porm to graves
que no possvel prever nem recuperar
o programa. Normalmente trata-se de um
bug na aplicao ou de mal uso de
alguma implementao.

ATENO: Apenas as Checked Exceptions


podem ter seus erros capturados por try-catch que
vamos ver abaixo.

Capturando e manipulando uma


exceo
Tome como exemplo o cdigo abaixo, que tem
um vetor de 10 posies e insere o nmero 0 em todas
elas.
public static void main(String[] args) {
int[] vetor = new int[10];
for (int i = 0; i < 15; i++) {
67 |

www.borgesrinolfi.com.br

Programao em Java

vetor[i] = 0;
System.out.println("Inserido
posio: " + i);
}
}

na

Cdigo 57: O nmero de posies excede o permitido


causando uma exceo

Porm no lao for, vamos at a posio 15, ou


seja, ao tentar inserir na posio 11, teremos um erro,
uma
Exception
(java.lang.ArrayIndexOutOfBoundsException), conforme
mostrado abaixo:
Exception in thread "main"
java.lang.ArrayIndexOutOfBoundsException: 10
at
javaapplication1.JavaApplication1.main(JavaAp
plication1.java:17)
Java Result: 1

Para capturarmos essa exceo e darmos um


tratamento amigvel a ela, podemos alterar o cdigo
conforme abaixo:
public static void main(String[] args) {
try {
int[] vetor = new int[10];
for (int i = 0; i < 15; i++) {
vetor[i] = 0;
System.out.println("Inserido
na posio: " + i);
}
}
catch
(ArrayIndexOutOfBoundsException e) {
68 |

www.borgesrinolfi.com.br

Programao em Java

System.err.println("Voc
o limite de posies do vetor!");
}
}

excedeu

Cdigo 58: Tratamento de exceo utilizando try-catch

Com isso dizemos o seguinte, tente (try)


executar o trecho de cdigo, se em algum momento
deste bloco, algum lanar uma exceo do tipo
ArrayIndexOutOfBoundsException, capture (catch) esse
erro e execute o trecho de cdigo do catch, no nosso
caso imprime na tela a mensagem "Voc excedeu o
limite de posies do vetor!".
Poderamos incluir instrues para tentar
recuperar o sistema ou para fechar conexo, entre
outros.
Podemos capturar todo o tipo de exceo, caso
tivermos conhecimento que ela exista, caso no
soubermos qual a exceo que pode ser lanada ou
quisermos tomar a mesma ao para qualquer tipo de
exceo, podemos capturar a exceo Exception, que
a classe pai de todas as excees.
FICA A DICA: A partir do Java 7 podemos
capturar (catch) vrias excees, e dar o mesmo
tratamento para elas, como no exemplo abaixo, onde
capturamos
trs
excees
possveis
(ClassNotFoundException,
IllegalAccessException,
InstantiationException) e imprimimos na tela a mesma
mensagem para todos:

69 |

www.borgesrinolfi.com.br

Programao em Java

public static void main(String[] args) {


try {
Class
clazz
Class.forName("java.lang.String");
Object
objeto
clazz.newInstance();

=
=

System.out.println(objeto.getClass());
}
catch
(ClassNotFoundException
|IllegalAccessException
|
InstantiationException ex) {
System.err.println("Erro ao criar
o objeto: " + ex.getMessage());
}
}
Cdigo 59: JAVA 7 - podemos tratar varias excees
com o mesmo algoritmo

Lanando sua prpria exceo


Alm das excees lanadas por algum evento
conforme vimos, podemos criar mtodos que lancem a
exceo que desejarmos.
Vamos alterar o exemplo do vetor para validar o
tamanho do vetor antes de executar o cdigo, caso seja
invalido ser capturada uma exceo j existente
chamada EmptyStackException. Essa exceo ser
lanada manualmente atravs da instruo throw no
mtodo validaTamanho(int tamanho), a instruo throws
na assinatura do mtodo indica a quem for utilizar esse
mtodo que necessrio tratar uma exceo lanada,
no caso EmptyStackException.
70 |

www.borgesrinolfi.com.br

Programao em Java

public static void main(String[] args) {


int[] vetor = new int[10];
int tamanho = 15;
try {
validaTamanho(tamanho);
for (int i = 0; i < tamanho; i++)
{
vetor[i] = 0;
System.out.println("Inserido
na posio: " + i);
}
}
catch
(ArrayIndexOutOfBoundsException e) {
System.out.println("Voc
excedeu
o limite de posies do vetor");
}catch (EmptyStackException e){
System.out.println("Tamanho
invalido de vetor!");
}
}
private
static
void
validaTamanho(int
tamanho) throws EmptyStackException {
if(tamanho > 10){
throw new EmptyStackException();
}
}
Cdigo 60: Utilizando mtodo para lanar manualmente
uma exceo

Criando sua prpria Exceo


No exemplo anterior usamos uma exceo j
existente, mas temos ainda opo de criar a nossa
prpria exceo, mantendo um cdigo melhor e
uniformizando as mensagens.
71 |

www.borgesrinolfi.com.br

Programao em Java

Para isso criamos uma classe chamada


ValidaTamanhoVetorException.java que extends a
classe Exception, e sobrescrevemos o mtodo
getMessage() para que retorne a mensagem que ns
desejamos, veja o cdigo abaixo:
public
class
ValidaTamanhoVetorException
extends Exception{
@Override
public String getMessage() {
return "Tamanho invalido de vetor!";
}
}
Cdigo 61: Criando uma classe de exceo, ela pode
ser utilizada em todo o sistema, padronizando as mensagens de
erros inesperados.

E com isso podemos fazer uma pequena


alterao no cdigo principal, conforme exemplo abaixo:
public static void main(String[] args) {
int[] vetor = new int[10];
int tamanho = 15;
try {
validaTamanho(tamanho);
for (int i = 0; i < tamanho; i++)
{
vetor[i] = 0;
System.out.println("Inserido
na posio: " + i);
}
}
catch
(ArrayIndexOutOfBoundsException e) {

72 |

www.borgesrinolfi.com.br

Programao em Java

System.out.println("Voc
excedeu
o limite de posies do vetor");
}catch
(ValidaTamanhoVetorException
e){
System.out.println(e.getMessage());
}
}
private
static
void
validaTamanho(int
tamanho) throws ValidaTamanhoVetorException{
if(tamanho > 10){
throw
new
ValidaTamanhoVetorException();
}
}
Cdigo 62: Cdigo lanando nossa prpria exception.

Instruo Finally
Ainda dentro do bloco de instruo de captura
de excees, podemos utilizar o bloco finally para
executar alguma ao aps o bloco try ou aps algum
catch, independente de ter dado certo ou no ele
tentara executar o trecho de cdigo do finally. Esta
instruo muito utilizada para fechar arquivos ou
conexes, que devem ser fechadas independe de ter
dado certo o comando ou no. Deve ser utilizado
conforme exemplo:
try {
// bloco try
} catch (IOException ex) {
// bloco catch
} finally {

73 |

www.borgesrinolfi.com.br

Programao em Java

//
bloco
que
ser
executado, independente
// de ter dado erro ou no
}

sempre

Cdigo 63: Finally executado sempre, ao final do try


ou da exceo causada, desde que a exceo no seja critica
que deixe o sistema inoperante.

Try-with-resources no Java 7
Na verso 7 do Java foi lanado um recurso,
para reduzir e tornar mais legvel o cdigo do try-catch,
trata-se de um recurso chamado de try-withresources.
O problema
Ao tentar, por exemplo, ler um arquivo o primeiro
passo abrir o arquivo, caso der algum erro ser
lanado uma exceo, porm, se der algum erro na
leitura de um arquivo j aberto, voc deve tratar o erro e
fechar o arquivo sempre (normalmente includo no bloco
finally), o que pode causar outro erro (outra exceo), e
com isso o cdigo fica mais complicado e de difcil
entendimento, veja o exemplo abaixo:
public
String
lerPrimeiraLinha(String
path) {
BufferedReader br = null;
try {
br
=
new
BufferedReader(new
FileReader(path));
return br.readLine();
} catch (IOException ex) {

74 |

www.borgesrinolfi.com.br

Programao em Java

System.out.println("Falha ao ler
arquivo: " + ex.getMessage());
} finally {
if (br != null) {
try {
br.close();
} catch (IOException ex) {
System.out.println("Falha
ao fechar buffer: " + ex.getMessage());
}
}
}
return null;
}
Cdigo 64: Cdigo necessrio para ler arquivo antes do
Java 7

A soluo
No Java 7 podemos incluir o recurso como um
parmetro na instruo try, e ele ser fechado
automaticamente aps a execuo do bloco try. Veja o
cdigo abaixo, utilizando try-with-resources:
public
String
lerPrimeiraLinha(String
path) {
try(BufferedReader
br
=
new
BufferedReader(new FileReader(path))) {
return br.readLine();
} catch (IOException ex) {
System.out.println("Falha ao ler
arquivo: " + ex.getMessage());
}
return null;
}
Cdigo 65: Cdigo mais limpo, utilizando novos
recurso do Java 7

75 |

www.borgesrinolfi.com.br

Programao em Java

Temos um cdigo bem mais limpo e fcil de


entender.
IMPORTANTE: Isso s possvel, pois o
recurso que utilizado como parmetro no try deve
implementar
as
classes java.lang.AutoCloseable ou java.io.Closeable,
no nosso caso a classe BufferedReader, na verso
Java 7 j implementa a classe AutoCloseable.

76 |

www.borgesrinolfi.com.br

Programao em Java

5. Colees
Tambm conhecidos como Collections, so
classes responsveis por auxiliar a manipulao de
grandes quantidades de dados.
Os arrays so utilizados para armazenar vrios
objetos, porm existe uma srie de dificuldades em
trabalhar com array, por exemplo, eles tm tamanho
fixo, e caso seja necessrio aumentar o tamanho,
preciso criar um novo vetor e transferir os dados de um
para o outro, ou se precisarmos inserir um elemento
nomeio do vetor, ou remover algum.
Para resolver essas complexidades e no
precisarmos reescrever cdigos para resolver
problemas comuns, o Java criou o Collections
Framework, composto de interfaces, implementaes, e
algoritmos, todos preparados para as funcionalidades
bsicas de grandes volumes de dados.

Interfaces
77 |

www.borgesrinolfi.com.br

Programao em Java

Existe um conjunto de interfaces que define os


mtodos essenciais para se trabalhar com colees
para vrios propsitos, segue abaixo um desenho de
como funciona as interfaces de colees:

Collection
Set

List

Queue

SortedSet
Figura 18: Classes que compe o Collection
Framework do Java

Map

SortedMap
Figura 19: Embora o Map, faa parte do Collection
Framework, ele no herda as capacidades da classe Collection,
uma estrutura independente.

78 |

Collection um interface que define


caractersticas em comum a todas as suas

www.borgesrinolfi.com.br

Programao em Java

classes filhas, no h implementao direta


desta classe, somente de suas subclasses.
o Set uma coleo que no contem
elementos
duplicados.
As
implementaes mais comuns desta
interface so, HashSet, LinkedHashSet e
TreeSet, veremos os detalhes de cada
implementao mais a frente.
SortedSet Um conjunto Set que
mantem os registros ordenados
o List Uma lista ordenada, que permite
objetos duplicados, utilizada onde
necessrio o controle da localizao do
objeto, pois possvel acess-lo
referenciando a posio do mesmo. As
implementaes de List so ArrayList e
LinkedList.
o Queue Uma coleo que implementa o
conceito de FIFO (First in First out),
utilizando para manter registros antes de
algum processo, utiliza as operaes
bsicas de incluso e remoo de itens.
Map - Uma lista que armazena dois objetos um
para a chave e outro para o valor, no permite
chaves duplicadas.
o SortedMap Um conjunto Map que
mantem os registros ordenados

Implementaes
79 |

www.borgesrinolfi.com.br

Programao em Java

List
Com as implementaes de lista possvel
recuperar um objeto pela posio em que ele foi
inserido (get(int)), buscar o objeto e recuperar a posio
em que ele esta, listar todos os objetos na sequencia
em que foi inserido.
Segue abaixo as diferenas entre duas das
principais implementaes da interface List:
LinkedList uma implementao mais rpida
para inserir e remover itens, porm mais
demorada para percorrer os objetos da lista.
ArrayList mais rpido para percorrer os
objetos da lista, e para acessar aleatoriamente
um objeto, a busca pode ser feita diretamente
pelo ndice. mais lento para inserir e remover
objetos.
Para instanciar uma a implementao ArrayList
fazemos da seguinte forma:
List<Funcionario>
listaFuncionarios
ArrayList<Funcionario>();

new

Cdigo 66: Criando uma lista de Funcionarios

Veja que a instruo <Funcionario>, uma


funcionalidade chamada Generics, utilizada a partir do
Java 5, onde especificamos qual tipo de objeto vamos
utilizar dentro da lista, ou seja, eu no posso inserir uma
String nessa lista, pois esta especificado o tipo
Funcionario.
80 |

www.borgesrinolfi.com.br

Programao em Java

Em seguida criamos os objetos da classe


Funcionario, que sero adicionados na lista:
Funcionario
func1
Funcionario();
func1.nome = "Bianca";

new

Funcionario
func2
Funcionario();
func2.nome = "Adolfo";

new

Cdigo 67: Criao de objetos para inserir na lista

Agora vamos adicionar os objetos func1 e func2


na lista, podemos fazer isso de duas formas, uma
especificando o ndice que devera ser inserido o objeto,
conforme abaixo:
listaFuncionarios.add(0, func1);
Cdigo 68: Inserindo o objeto na lista, determinando a
posio dele

Ou simplesmente inserindo o objeto e ele vai


inserir na prxima posio livre da lista:
listaFuncionarios.add(func2);
Cdigo 69: Adicionando o objeto na lista sem fazer
referencia a posio dele

Para percorrermos os itens da lista e imprimir os


nomes dos funcionrios, podemos fazer de duas
formas, a primeira utilizando o comando for e o
mtodo get para recuperar os objetos, conforme abaixo:

81 |

www.borgesrinolfi.com.br

Programao em Java

for (int i = 0; i < 10; i++) {


Funcionario
funcionario
listaFuncionarios.get(i);
System.out.println("Nome
Funcionario: " + funcionario.nome);
}

=
do

Cdigo 70: Percorrendo todos os objetos da lista, de


forma tradicional

Porm este mtodo alm de pouco pratico, mais


lento do que utilizando o comando foreach, muito utilizado
para percorrer Collections em geral, por ser mais rpido, veja
abaixo como ficaria o mesmo cdigo:
for
(Funcionario
funcionario
listaFuncionarios) {
System.out.println("Nome
Funcionario: " + funcionario.nome);
}

:
do

Cdigo 71: Percorrendo utilizando Foreach, a melhor


forma de percorrer uma lista de objetos

PROCURE: Pesquise mais sobre a classe Iterator,


para entender por que o foreach mais rpido para percorrer
collections.
Se quisermos remover os itens da lista podemos
utilizar tambm pelo ndice ou direto pelo objeto, conforme o
cdigo abaixo:
listaFuncionarios.remove(1);
Funcionario
listaFuncionarios.get(0);

82 |

excluir

www.borgesrinolfi.com.br

Programao em Java

listaFuncionarios.remove(excluir);
Cdigo 72: Removendo objetos da lista por indice ou
diretamente

Com isso exclumos todos os itens da nossa lista,


para podermos checar se realmente todos os itens foram
excludos, podemos checar o tamanho da lista utilizando o
mtodo size():
System.out.println("Tamanho
listaFuncionarios.size());

da

lista:

"

Cdigo 73: Imprimindo o tamanho da lista

Confira o cdigo completo da implementao de lista


abaixo:
public static void main(String[] args) {
//Instancia
uma
lista
da
implementao ArrayList
List<Funcionario> listaFuncionarios =
new ArrayList<Funcionario>();
//Criao dos objetos
inseridos na lista
Funcionario
func1
Funcionario();
func1.nome = "Bianca";

que

Funcionario
func2
Funcionario();
func2.nome = "Adolfo";

vo
=

new

new

//adiciona os objetos na lista


listaFuncionarios.add(0, func1);
listaFuncionarios.add(func2);

83 |

www.borgesrinolfi.com.br

ser

Programao em Java

//percorre todos os itens da lista


for
(Funcionario
funcionario
:
listaFuncionarios) {
//imprime
o
nome
de
cada
funcionario da lista
System.out.println("Nome
do
Funcionario: " + funcionario.nome);
}
//Remove o item na posio 1 da lista
listaFuncionarios.remove(1);
//Recupera o objeto que esta na
posio 0 da lista
Funcionario
excluir
=
listaFuncionarios.get(0);
//remove o objeto recuperado da lista
listaFuncionarios.remove(excluir);
//imprime o tamanho atual da lista na
tela
System.out.println("Tamanho da lista:
" + listaFuncionarios.size());
}
Cdigo 74: Cdigo completo da implementao de
java.util.List

SET
Set um tipo de Collections que no permite
itens duplicados, as principais implementaes so:
HashSet um tipo de implementao que
armazena os dados em uma tabela hash, tratase de uma das implementaes mais rpidas,
porm no tem garantia da ordem de insero
84 |

www.borgesrinolfi.com.br

Programao em Java

dos objetos, no momento de exibir os itens eles


apareceram em qualquer ordem.
LinkedHashSet armazena os objetos em uma
tabela hash, porm mantem uma lista
encadeada, que garantem a ordem que os
objetos foram inseridos.
TreeSet armazena os objetos na estrutura de
rvore, ordenando os objetos pelos valores.
Devido a ordenao mais lento que o
HashSet.

Segue abaixo o cdigo do exemplo anterior


agora implementado com HashSet, porm como no
sabemos as posies dos objetos, no podemos
recuperar (get), nem remover (remove) objetos pela
posio, afinal essa a caracterstica de Set.
public static void main(String[] args) {
//Instancia um SET da implementao
HashSet
Set<Funcionario>
setFuncionarios
=
new HashSet<Funcionario>();
//Criao dos objetos
inseridos no Set
Funcionario
func1
Funcionario();
func1.nome = "Bianca";

que

Funcionario
func2
Funcionario();
func2.nome = "Adolfo";

vo
=

new

new

//adiciona os objetos no Set


85 |

www.borgesrinolfi.com.br

ser

Programao em Java

setFuncionarios.add(func1);
setFuncionarios.add(func2);
//percorre todos os itens do Set
for
(Funcionario
funcionario
:
setFuncionarios) {
//imprime
o
nome
de
cada
funcionario da lista
System.out.println("Nome
do
Funcionario: " + funcionario.nome);
}
//Remove o item na posio 1 do Set
setFuncionarios.remove(func1);
//remove o objeto recuperado do Set
setFuncionarios.remove(func2);
//imprime o tamanho atual do Set
System.out.println("Tamanho do Set: "
+ setFuncionarios.size());
}
Cdigo 75: Principais operaes utilizando Set

Map
Mapas so colees onde podem ser definidos
chave e valor, onde a chave no pode ser duplicada.
As principais implementaes para Mapas so
HashMap, o TreeMap e o Hashtable, que tem as
mesmas diferenas das
and LinkedHashSet que
implementaes SET.

86 |

classes HashSet, TreeSet,


vimos junto com as

www.borgesrinolfi.com.br

Programao em Java

Segue abaixo o cdigo com as principais


operaes com Mapas comentado:
public static void main(String[] args) {
//instanciando a classe HashMap
Map<Integer, String> semana = new
HashMap<Integer, String>();
//adicionando
suas chaves
semana.put(1,
semana.put(2,
semana.put(3,
semana.put(4,
semana.put(5,
semana.put(6,
semana.put(7,
//recuperando

os

dias

da

semana

"Domingo");
"Segunda-Feira");
"Tera-Feira");
"Quarta-Feira");
"Quinta-Feira");
"Sexta-Feira");
"Sbado");
um

item

do

mapa

pela

chave
String sabado = semana.get(7);
System.out.println("O
7
dia
semana : "+ sabado);
//removendo

do

mapa

um

item

da

pela

chave
semana.remove(1);
//percorrendo o mapa por valor, desta
forma no possvel recuperar a chave do
contedo
//recuperado
for (String string : semana.values())
{
System.out.println("Dia
da
semana: " + string);
}

87 |

www.borgesrinolfi.com.br

Programao em Java

//percorrendo o mapa pela chave,


assim podemos recuperar a chave e o valor
for
(Integer
indice
:
semana.keySet()) {
String dia = semana.get(indice);
System.out.println("O
dia da semana : "+ dia);
}
}

"+indice+"

Cdigo 76: Principais operaes com a classe Map

Ordenao
Alm de toda implementao de coleo, a
Collections
Framework,
ainda
traz
alguns
implementaes prontas para busca, ordenao, entre
outras operaes que podem ser realizadas com
colees.
Porm para ordenarmos objetos do tipo
Funcionario por ordem alfabtica, precisamos primeiro
definir o critrio de busca, pois o compilado no
conhece esse tipo de objeto.
Precisamos que a classe Funcionario
implemente a classe Comparable, e sobrescreva o
mtodo compareTo esse mtodo retorna um inteiro
que funciona da seguinte maneira:
Negativo se o objeto comparado for MENOR
Zero se o objeto for IDNTICO
Positivo se o objeto comparado for MAIOR

88 |

www.borgesrinolfi.com.br

Programao em Java

Voc pode definir de que forma ele ira retornar


esses valores e a comparao seguira essas
definies.
Para isso vamos efetuar a seguinte alterao na
classe Funcionario.
public
class
Funcionario
implements
Comparable<Funcionario> {
public Integer CTPS;
public double salario;

extends
Pessoa
GeraEtiquetas,

@Override
public String imprimir() {
return "Nome: " + this.nome
"Carteira de trabalho: " + this.CTPS;
}

@Override
public int compareTo(Funcionario o) {
return nome.compareTo(o.nome);
}
}
Cdigo 77: Fazendo a classe Funcionario.java "assinar
o contrato" de uma classe Comparable

Sobrescrevemos o mtodo compareTo, e


utilizamos para fazer a comparao por nome, como a
varivel nome do tipo String e a classe String j tem
o mtodo compareTo, utilizamos este que segue os
padres definidos acima.

89 |

www.borgesrinolfi.com.br

Programao em Java

Basta chamarmos a implementao da classe


Collections, responsvel por ordenar os funcionrios,
segue abaixo o cdigo completo do mtodo principal:
public static void main(String[] args) {
//Instancia
uma
lista
da
implementao ArrayList
List<Funcionario> listaFuncionarios =
new ArrayList<Funcionario>();
//Criao dos objetos
inseridos na lista
Funcionario
func1
Funcionario();
func1.nome = "Bianca";

que

Funcionario
func2
Funcionario();
func2.nome = "Adolfo";

vo

ser

new

new

//adiciona os objetos na lista


listaFuncionarios.add(0, func1);
listaFuncionarios.add(func2);
//percorre todos os itens da lista
for
(Funcionario
funcionario
:
listaFuncionarios) {
//imprime
o
nome
de
cada
funcionario da lista
System.out.println("Nome
do
Funcionrio: " + funcionario.nome);
}
Collections.sort(listaFuncionarios);
//percorre
agora ordenada
90 |

todos

os

itens

www.borgesrinolfi.com.br

da

lista

Programao em Java

for
(Funcionario
funcionario
:
listaFuncionarios) {
//imprime
o
nome
de
cada
funcionario da lista
System.out.println("Nome
do
Funcionrio Ordenado: " + funcionario.nome);
}
}
Cdigo 78: Cdigo da Ordenao

91 |

www.borgesrinolfi.com.br

Programao em Java

6. Input e Output (I/O)


Para operaes de leitura ou escrita de arquivos
o java tem uma serie de classes que nos ajudam a
manipular essas entrada e sadas. Basicamente para
esse tipo de operao o java trabalha com bytes,
escrevendo e lendo bytes, convertendo para texto em
seguida.
Alm de podermos ler e escrever arquivos texto,
essas classes tem ainda um proposito maior, que a
troca de informaes atravs de bytes, podendo ser
utilizados para fotos, arquivos de udio, entre outros.
Java possui duas classes abstratas que so a
base de como se trabalhar com Streams:
java.io.InputStream

Classe
abstrata
representa a entrada de dados, utilizada para
leitura de bytes.
java.io.OutPutstream Classe Abstrata que
representa a sada de dados, em bytes, para
envio ou escrita de arquivos

92 |

www.borgesrinolfi.com.br

Programao em Java

Capturando o que foi digitado do


teclado
A forma mais bsica de ilustrarmos a leitura de
dados utilizando a classe InputStream utilizando a
classe oferecida pelo Java System.in, que captura o
que foi digitado no teclado.
public static void main(String[] args)
throws IOException {
InputStream digitado = System.in;
int valor;
do {
valor = digitado.read();
System.out.println("Valor
convertido em decimal : " + valor);

binrio

} while (valor == 10);


}
Cdigo 79: Utilizando InputStream para capturar o que
foi digitado pelo usurio.

A sada desse cdigo caso seja digitado o


nmero 5, seria Valor lido em decimal : 53, pois a
classe InputStream somente trabalha com Bytes e
retorna os valores em decimal.
Para que pudssemos ler o valor do texto que
foi digitado, temos que utilizar outra classe chamada
InputStreamReader que implementa a interface
Reader, que recebe como parmetro o objeto
InputStream, ainda assim temos dificuldade para ler o
93 |

www.borgesrinolfi.com.br

Programao em Java

texto, portanto devemos utilizar mais uma classe


chamada BufferedReader que uma implementao
da classe Reader e recebe um objeto do tipo
InputStreamReader.
Toda classe Buffered cria um buffer de leitura ou
escrita para poder acumular informaes e evitar
operao direta no arquivo, o que muito demorado.
Segue abaixo um exemplo da leitura do teclado
utilizando BufferedReader.
public static void main(String[] args)
throws IOException {
InputStream digitado = System.in;
InputStreamReader
isr
InputStreamReader(digitado);
System.out.println("Valor:
isr.read());

new

"

BufferedReader
br
=
new
BufferedReader(isr);
String s = br.readLine();
System.out.println("Valor digitado em
texto: " + s);
}
Cdigo 80: Convertendo os bytes gerados em Texto
novamente, com BufferedReader

Escrevendo um arquivo
A classe java.io.OutputStream utilizada para
podermos escrever informaes em arquivos, uma
94 |

www.borgesrinolfi.com.br

Programao em Java

classe abstrata e implementada pelas classes


ByteArrayOutputStream,
ObjectOutputStream.

FileOutputStream,

Como vamos tratar com arquivos vamos utilizar


a classe FileOutputStream.
public static void main(String[] args)
throws IOException {
//cria um canal output para gerar o
arquivo c:\java\arquivo.txt
OutputStream
out
=
new
FileOutputStream("c:\\java\\arquivo.txt");
//utilizamos o Writer e o Buffer para
facilitar o processo de gravao
OutputStreamWriter
writer
=
new
OutputStreamWriter(out);
BufferedWriter
bwriter
=
new
BufferedWriter(writer);
//primeira linha do arquivo
bwriter.write("Programao e
//criamos uma nova linha
apertamos a tecla enter
//Obs.: o Writer no aceita
linha como o '\n'
bwriter.newLine();
//segunda linha do arquivo
bwriter.write("Capitulo de
Output");
//fecha

buffer

para

Java");
(como se
quebra de

Input

liberar

arquivo
bwriter.close();
}
Cdigo 81: Escrevendo mensagem em arquivo texto

95 |

www.borgesrinolfi.com.br

Programao em Java

Verifique no diretrio c:\java que deve ter um


arquivo chamado arquivo.txt com o contedo que
pedimos para criar.

Lendo o arquivo gerado


A classe java.io.InputStream utilizada para
podermos ler informaes em bytes, uma classe
abstrata
e

implementada
pelas
classes
ObjectInputStream,
AudioInputStream,
ByteArrayInputStream, ou FileInputStream.
Como vamos tratar com arquivos vamos utilizar
a classe FileInputStream.
public static void main(String[] args)
throws IOException {
//cria um canal input para ler o
arquivo c:\java\arquivo.txt
InputStream
in
=
new
FileInputStream("c:\\java\\arquivo.txt");
//utilizamos o Reader e o Buffer para
facilitar o processo de leitura
InputStreamReader
reader
=
new
InputStreamReader(in);
BufferedReader
breader
=
new
BufferedReader(reader);
String texto = breader.readLine();
while (texto != null) {
System.out.println(texto);
texto = breader.readLine();
}

96 |

www.borgesrinolfi.com.br

Programao em Java

//fecha

buffer

para

liberar

arquivo
breader.close();
}
Cdigo 82: Fazendo a leitura do arquivo gerado

O resultado esperado no console de sada :


Programao e Java
Capitulo de Input e Output
Cdigo 83: Resultado esperado no console

Scanner e PrintStream
Com a classe java.util.Scanner, criada a partir
do Java 5, podemos ler (Input) com mais facilidade e
em conjunto com a classe java.io.PrintStream,
podemos agora escrever facilmente um programa
capaz de ler o que foi digitado e escrever em um
arquivo texto, veja como ficaria este cdigo:
public static void main(String[] args)
throws IOException {
//Utilizamos a classe Scanner para
receber os dados digitados (Input)
Scanner s = new Scanner(System.in);
//A Classe PrintStream para abrir um
Writer com o arquivo c:\java\arquivo.txt
PrintStream
ps
=
new
PrintStream("c:\\java\\arquivo.txt");
String texto; //variavel utilizada
para guardar linha a linha
do{
texto = s.nextLine(); //recupera
a primeira linha do input (que foi digitada)
97 |

www.borgesrinolfi.com.br

Programao em Java

ps.println(texto);
//grava
a
linha digitada no arquivo atraves da classe
PrintStream
}while(!"sair".equals(texto));
//ira
fazer isso ate que voc digite 'sair'
ps.close();
//fecha
para liberar o arquivo
}

PrintStream

Cdigo 84: A partir do JAVA 5, ficou mais facil


manipular arquivos

Verifique o arquivo c:\java\arquivo.txt e veja que


o que foi digitado esta gravado no arquivo.

98 |

www.borgesrinolfi.com.br

Programao em Java

7. Serializao
Um objeto a criao de uma estrutura no
modelo de determinada classe, onde todos os seus
atributos (variveis) so alocados na memria, para uso
posterior no programa, porm assim que o programa
fechado todos os objetos so removidos da memria.
A Serializao de objetos o fato de podermos
transformar esses objetos na memria em bytes e com
isso podermos armazen-los em arquivos ou transferir
via rede.
Este conceito muito utilizado quando
precisamos armazenar algum objeto com informaes
que no queremos manter no banco de dados, e sim
junto da aplicao, por exemplo, ultima data de abertura
do sistema.
Para que o objeto seja serializavel, sua classe
deve implementar a interface java.io.Serializable, no
h mtodos nessa interface, ela existe apenas para
classificar os objetos que podem ser serializados ou
no.
Para vermos como serializar e des-serializar um
objeto, vamos criar uma classe simples chamada Carro
implementando Serializable, com alguns atributos e
mtodos, segue o cdigo da classe abaixo:
import java.io.Serializable;
99 |

www.borgesrinolfi.com.br

Programao em Java

public class Carro implements Serializable{


//Atributos
da
classe
serializados)
private String marca;
private String modelo;
private String cor;
private int ano;

(Estes

sero

//Construtor da classe (No chamado no


momento da des-serializao)
public Carro(String marca, String modelo,
String cor, int ano) {
this.marca = marca;
this.modelo = modelo;
this.cor = cor;
this.ano = ano;
}
//Mtodos da classe, os mtodos
chamados em tempo de execuo e no
serializaveis
public String getMarca() {
return marca;
}
public void setMarca(String marca) {
this.marca = marca;
}
public String getModelo() {
return modelo;
}
public void setModelo(String modelo) {
this.modelo = modelo;
}

100 |

www.borgesrinolfi.com.br

so
so

Programao em Java

public String getCor() {


return cor;
}
public void setCor(String cor) {
this.cor = cor;
}
public int getAno() {
return ano;
}
public void setAno(int ano) {
this.ano = ano;
}
}
Cdigo
Serializable

85:

Classe

Carro.java

implementando

Vamos
utilizar
a
classe
java.io.ObjectOutputStream para serializar os objetos
em um arquivo chamado carros.dat, esses objetos no
podem ser visveis no arquivo, pois o que ser gravado
l uma estrutura de bytes, de forma que o Java
consiga recuperar depois.
A classe java.io.FileOutputStream ira auxiliar
na gravao dos objetos no arquivo.
J a classe java.io.ObjectInputStream ira desserializar o objeto, e a classe java.io.FileInputStream vai
auxiliar na leitura do arquivo gerado.

101 |

www.borgesrinolfi.com.br

Programao em Java

No momento da des-serializao como no tem


como o compilador saber se a classe des-serializada
existe no seu projeto, ele obriga o tratamento da
exceo ClassNotFoundException para caso a classe,
no caso Carro, no seja encontrada.
Segue o cdigo completo para Serializao e
Des-serializao dos objetos:
import
import
import
import
import
import

java.io.File;
java.io.FileInputStream;
java.io.FileOutputStream;
java.io.IOException;
java.io.ObjectInputStream;
java.io.ObjectOutputStream;

public class ExemploSerializacao {


public static void main(String[] args)
throws IOException {
//Criao dos objetos que vo ser
serializados
Carro carroA = new Carro("Ferrari",
"F458", "Vermelha", 2010);
Carro carroB = new Carro("Porshe",
"911", "Amarelo", 2008);
//****
SERIALIZANDO
OS
OBJETOS
CRIADOS ****
//Utilizamos o FileOutputStream para
gravarmos no arquivo chamado carros.dat
//E a classe ObjectOutputStream para
serializar os objetos gravando no arquivo.
ObjectOutputStream
oos
=
new
ObjectOutputStream(new
FileOutputStream(new
File("carros.dat")));

102 |

www.borgesrinolfi.com.br

Programao em Java

//serializando os objetos
oos.writeObject(carroA);
oos.writeObject(carroB);
//fechando o arquivo
oos.close();

//**** DES-SERIALIZANDO OS OBJETOS


SERIALIZADOS ****
//Utilizamos o FileInputStream para
lermos o arquivo chamado carros.dat
//E a classe ObjectInputStream para
DES-serializar
os
objetos
gravados
no
arquivo.
ObjectInputStream
ois
=
new
ObjectInputStream(new
FileInputStream(new
File("carros.dat")));
try {
//DES-serializando os objetos
Carro
carroC
=
(Carro)
ois.readObject();
Carro
carroD
=
(Carro)
ois.readObject();
//imprimindo
os
atributos
dos
objetos
para
verificar
os
parametros
restaurados
System.out.println("Carro
A:
Marca: " + carroC.getMarca() + " Modelo: " +
carroC.getModelo()
+
"
Cor:
"
+
carroC.getCor()
+
"
Ano:
"
+
carroC.getAno());
System.out.println("Carro
B:
Marca: " + carroD.getMarca() + " Modelo: " +
carroD.getModelo()
+
"
Cor:
"
+

103 |

www.borgesrinolfi.com.br

Programao em Java

carroD.getCor()
carroD.getAno());

"

Ano:

"

} catch (ClassNotFoundException ex) {


System.out.println("Erro:
"
+
ex.getMessage());
}

//fechando o arquivo
ois.close();

}
}
Cdigo 86: Serializando e Des-Serializando objetos

Podemos ver a sada desse programa como:


Carro A: Marca: Ferrari
Vermelha Ano: 2010
Carro B: Marca: Porshe
Amarelo Ano: 2008

Modelo:

F458

Cor:

Modelo:

911

Cor:

Cdigo 87: Resultado esperado no console

Transient e static
Podemos definir que algum atributo para que
no seja serializado, e com isso termos apenas parte do
objeto transformado em bytes, basta para isso
incluirmos a palavra reservada transient no atributo que
no deseja armazenar.
Com isso ao des-serializar o objeto, o parmetro
que estiver marcado como transiente ser restaurado
104 |

www.borgesrinolfi.com.br

Programao em Java

com o valor padro zero se for numrico ou nulo se


for objeto (String ou outros)
Para testarmos basta incluirmos a instruo
transient entre o modificador de acesso e o nome da
varivel na classe Carro.java e executar novamente o
programa principal, vamos fazer o teste com o
parmetro ano, altere a declarao conforme a linha
abaixo:
private transient int ano;
Cdigo 88: Utilizao do transient

Ao rodar novamente o programa principal, veremos o


seguinte resultado:
Carro A: Marca: Ferrari
Vermelha Ano: 0
Carro B: Marca: Porshe
Amarelo Ano: 0

Modelo:

F458

Cor:

Modelo:

911

Cor:

Cdigo 89: Novo resultado esperado

O parmetro ano aparece com o valor padro


0, pois no foi guardado na serializao.
No caso dos atributos definidos como static,
estes tambm no so serializados, pois so valores
estticos que no se alteram, caso tenha sido alterado
no cdigo fonte, esse novo valor ser considerado no
momento da des-serializao.

Regras de Serializao
105 |

www.borgesrinolfi.com.br

Programao em Java

A serializao de objetos deve ser utilizada com


alguns cuidados, principalmente se houver um grande
volume de objetos a ser serializado.
Ao des-serializar um objeto, o mtodo
Construtor no chamado, o objeto simplesmente
montado novamente de acordo com os parmetros
gravados.
No caso de uma herana, se a superclasse
(classe pai) implementar Serializable, automaticamente
suas subclasses (classes filhas) sero serializveis.
Porm,
caso
a
subclasse
implemente
Serializable e a superclasse no implementar, o mtodo
construtor da superclasse ser executado, mas o da
subclasse no.
Valores iniciais de variveis no sero
considerados, se em algum momento eles foram
alterados, ao efetuar a des-serializao ele ser
restaurado com o valor que estava no momento da
serializao.

Externalizable
Assim como a interface java.io.Serializable,
todas
as
classes
que
implementem

106 |

www.borgesrinolfi.com.br

Programao em Java

java.io.Externalizable tambm podem ser persistido e


transformado em bytes.
Com a classe java.io.Serializable a persistncia
das classes feita de forma automtica, ns no
precisamos saber qual a implementao utilizada para
que isso acontea.
J com a classe java.io.Externalizable voc
quem implementa a persistncia a sua maneira
escrevendo os mtodos readExternal e writeExternal.
Este mtodo bem mais complexo pois voc
quem deve implementar e fazer o adicionar, remover e
atualizar os objetos, porm isso permite que voc use
uma implementao de terceiros (como por exemplo
JBOSS Serialization) ou faa uma implementao mais
rpida, que atenda melhora a sua necessidade.

Controle de Verso
Imagine que um objeto serializado, e aps sua
serializao, h uma alterao na classe, includo um
atributo a mais por exemplo.
Para manter a consistncia entre os objetos
persistentes (armazenados) e as classes que lhe deram
origem podemos utilizar o atributo static final long
serialVersionUID.
Trata-se de um nmero 64bits atribudo a classe
com um algoritmo hash (SHA-1) ou manualmente pelo
107 |

www.borgesrinolfi.com.br

Programao em Java

programador, assim, para manter a compatibilidade


entre diferente verses deve ser atribudo o mesmo
serialVersionUID para ambas as verses da classe.

Dica: Procure saber mais sobre sobrescrita dos


mtodos readObject e writeObject para obter mais
detalhes de como interceptar a serializao e desserializao de objetos, e poder resolver o problema de
controle de verso e valores de atributos.

108 |

www.borgesrinolfi.com.br

Programao em Java

8. Reflexo
Reflexo a forma de recuperar informaes de
uma classe em tempo de execuo, informaes como
atributos, mtodos ou o prprio nome da classe.
Alm de permitir recuperar as informaes de
uma classe, ainda podemos executar aes com as
informaes recuperadas, como por exemplo, instanciar
uma classe utilizando o nome dela, ou executar um
mtodo desta classe a partir do nome do mtodo.
Em java podemos fazer isso facilmente
utilizando Java Reflection API, que so classes dos
pacotes java.lang e java.lang.reflection.
Vamos ver como instanciar e executar um
mtodo em tempo de execuo usando reflexo em
java, para isso vamos criar uma classe chamada
Calculadora.java com o mtodo soma e multiplicao,
segue abaixo a classe Calculadora.java:
public class Calculadora {
109 |

www.borgesrinolfi.com.br

Programao em Java

public double soma(double valor1, double


valor2) {
return valor1 + valor2;
}
public
double
multiplicao(double
valor1, double valor2) {
return valor1 * valor2;
}
}
Cdigo 90: Classe Calculadora.java com mtodo de
soma e multiplicao

E agora o programa principal onde feita a


chamada de uma classe atravs de reflexo:
public static void main(String[] args) {
try {
//carrega a classe atravs do seu
nome
Class
classe
=
Class.forName("javaapplication1.Calculadora")
;
//Cria a instancia do
calculadora
como
se
fizssemos
Calculadora()
Object
obj
classe.newInstance();

objeto
new
=

// configura o mtodo soma e


define dois parmetros do tipo double
Method
soma
=
classe.getMethod("soma",
double.class,
double.class);

110 |

www.borgesrinolfi.com.br

Programao em Java

// executa o mtodo passando os


dois parametros definidos
System.out.println(soma.invoke(obj, 5, 10));
} catch (Exception e) {
System.err.println("Erro:
e.getMessage());
e.printStackTrace();
}

"

}
Cdigo 91: Criando uma instancia por reflexo e
executando um mtodo passando parmetros.

Para recuperarmos as informaes de uma


classe que no conhecemos os detalhes, temos varias
opes, segue abaixo um programa extraindo todos os
detalhes da classe Funcionario utilizada em exemplos
anteriores:
public static void main(String[] args) {
try {
//carrega a classe
Class
classe
=
Class.forName("javaapplication1.Funcionario")
;
//recuperando
o
nome
superclasse (classe pai)
Class
superclasse
classe.getSuperclass();
System.out.println("@@@
Superclasse: " + superclasse.getName());
//recuperando atributos

111 |

www.borgesrinolfi.com.br

da
=

Programao em Java

Field[]
atributos
=
classe.getDeclaredFields();
System.out.println("@@@ Nome dos
atributos atributo: ");
for (Field field : atributos) {
System.out.println(">>>> " +
field.getName());
}
//recuperando os construtores
Constructor[]
contrutores
classe.getConstructors();
for (Constructor constructor
contrutores) {
System.out.println("@@@
Construtor: " + constructor.getName());
//parametros do construtor
Class[]
parametros
constructor.getParameterTypes();
for
(Class
class1
parametros) {
System.out.println(">>>>
Parametro: " + class1.getName());
}
}

=
:

=
:

//recuperando a lista de mtodos


da classe e seus valores
Method[]
metodos
=
classe.getMethods();
System.out.println("@@@
Mtodos:
");
for (Method method : metodos) {
System.out.println(">>>> Nome
de mtodo: " + method.getName());
System.out.println(">>>>
Valor retornado: " + method.getReturnType());

112 |

www.borgesrinolfi.com.br

Programao em Java

Class<?>[]
parametros
=
method.getParameterTypes();
System.out.println(">>>>
Parametros recebidos: ");
for
(Class<?>
class1
:
parametros) {
System.out.println("----- " + class1.getName());
}
}
//recuperando
as
interfaces
implementadas na classe
System.out.println("@@@@
Interfaces Implementadas: ");
Type[]
intfs
=
classe.getGenericInterfaces();
if (intfs.length != 0) {
for (Type intf : intfs)
System.out.println(">>>>>>
intf.toString());
}

Interface:

} catch (Exception e) {
System.err.println("Erro:
e.getMessage());
e.printStackTrace();
}

"

"

}
Cdigo 92: Recuperando informaes de classes
atraves de reflexo

IMPORTANTE: Reflection muito bom e ajuda


em vrios momentos onde no sabemos qual classe
instanciar e isso deve ser decidido no decorrer do
113 |

www.borgesrinolfi.com.br

Programao em Java

programa,
porm
no
podemos
fazer
uso
indiscriminado desta funcionalidade, o desempenho no
o mais rpido, pois existem mais passos que o normal
para instanciar uma classe em tempo de execuo.

114 |

www.borgesrinolfi.com.br

Programao em Java

9. Padres de Projetos
A programao orientada a objetos foi criada
por Alan
Kay,
autor
da
linguagem
de
programao Smalltalk. Porm antes disso algumas das
ideias da Orientao a Objetos j eram aplicadas,
sendo que a primeira linguagem a realmente utilizar
estas ideias foi a linguagem Simula 67, criada por Ole
Johan Dahl e Kristen Nygaard em 1967.
Portanto temos aproximadamente 45 anos de
programao Orientada a Objetos, e milhares de
sistemas desenvolvidos, todos utilizando a mesma
forma de estruturao de classes, passado um tempo
descobriu-se que muitas pessoas tinham os mesmos
problemas no momento de estruturar as classes e
trabalhar com orientao a objetos.
Pensando
nisso,
em
1987
os programadores Kent
Beck e Ward
Cunningham propuseram os primeiros padres de
projeto para a rea da cincia da computao.

115 |

www.borgesrinolfi.com.br

Programao em Java

Trata-se de padres com uma soluo


consolidada para problemas do dia-a-dia que todos j
enfrentaram ou iro enfrentar no desenvolvimento ou
manuteno de um sistema Orientado a Objetos.
Os Design Patterns como so conhecidos os
padres de projetos, s ficaram famosos em 1995 com
a publicao do livro Design Patterns: Elements of
Reusable
Object-Oriented
Software
(editora
Addison-Wesley, 1995) dos autores Erich Gamma,
Richard Helm, Ralph Johnson e John Vlissides, que
se tornou referencia mundial no mundo dos padres do
projetos. Este livro define 23 principais padres de
projetos.
Devido ao grande sucesso do livro, os quatro
autores ficaram conhecidos como Gang of Four ou
GoF, ou seja, gangue dos quatro, e os 23 padres
descritos no livro ficou conhecido como padres GoF,
pois apesar desses serem os mais famosos, ainda
existem outros padres alm dos 23 do GoF.
Os 23 padres GoF, so classificados em trs
categorias: padres de criao, estruturais e
comportamentais.

116 |

Padres de criao: relacionados criao de


objetos;
Padres estruturais: tratam das associaes
entre classes e objetos;

www.borgesrinolfi.com.br

Programao em Java

Padres
comportamentais:
tratam
das
interaes e divises de responsabilidades entre
as classes ou objetos;
Segue abaixo a lista dos 23 padres GoF:

Padres de criao
1.
2.
3.
4.
5.

Abstract Factory
Builder
Factory Method
Prototype
Singleton

Padres estruturais
6. Adapter
7. Bridge
8. Composite
9. Decorator
10. Facade
11. Flyweight
12. Proxy

Padres comportamentais
13. Chain of Responsibility
14. Command
15. Interpreter
16. Iterator
17. Mediator
18. Memento
117 |

www.borgesrinolfi.com.br

Programao em Java

19. Observer
20. State
21. Strategy
22. Template Method
23. Visitor
Veremos agora em detalhes os principais
padres de cada tipo.

118 |

www.borgesrinolfi.com.br

Programao em Java

Singleton (Padro de Criao)


A ideia deste padro garantir a existncia de
uma nica instancia de determinada classe. Esse
padro muito utilizado, por exemplo, para classes
responsveis por log do sistema, para que no precise
de uma instancia nova toda vez que for feito um log do
sistema. Ou ento para classes de conexo de banco
de dados, que tambm no faz sentido terem mais de
uma instancia da mesma classe.
Segue a modelagem UML que representa o
padro Singleton:

Figura 20: Modelagem UML do padro Singleton

public class ExemploSingletonLog {


// Instancia esttica privada da mesma
classe
private static ExemploSingletonLog me;
private final String caminho;
119 |

www.borgesrinolfi.com.br

Programao em Java

// Mtodo pblico esttico de acesso


nico ao objeto
public
static
ExemploSingletonLog
getInstance() {
//Verifica
a
existencia
de
uma
instancia da classe
if (me == null) {
//caso no exista, cria uma nova
instancia na memria
me
=
new
ExemploSingletonLog("c:\\erro.log");
}
//retorna a instancia existente
return me;
}
//construtor com o caminho de gravao do
log
//Construtor PRIVATE, portanto s pode
ser acessado internamente
private
ExemploSingletonLog(String
caminhoLog) {
caminho = caminhoLog;
}
public
void
logarErro(String
mensagemErro) {
try {
//cria um canal output para gerar
o arquivo c:\\erro.log
OutputStream
out
=
new
FileOutputStream(caminho, true);
//utilizamos o Writer e o Buffer
para facilitar o processo de gravao
OutputStreamWriter writer = new
OutputStreamWriter(out);

120 |

www.borgesrinolfi.com.br

Programao em Java

BufferedWriter
BufferedWriter(writer);

bwriter

new

//primeira linha do arquivo


bwriter.write(mensagemErro);
//fecha o buffer para liberar o
arquivo
bwriter.close();
} catch (Exception e) {
System.err.println("Erro:
e.getMessage());
e.printStackTrace();
}

"

}
}
Cdigo 93: Implementao Java do padro Singleton

Para executar o cdigo acima, em uma classe


principal digite o cdigo abaixo:
public static void main(String[] args) {
ExemploSingletonLog
singleton
=
ExemploSingletonLog.getInstance();
singleton.logarErro("O
ERRO
ACONTECEU!");
}
Cdigo 94: Singleton funcionando na prtica

121 |

www.borgesrinolfi.com.br

Programao em Java

Factory
Criao)

Method

(Padro

de

O padro Factory Method, como prprio nome


diz, se prope a criar uma classe para fazer o papel de
fbrica de objetos, onde atravs de determinados
parmetros, ela quem faz a deciso de qual objeto
ser instanciado.

Os elementos deste padro so:


Creator declara o factory method (mtodo
de fabricao) que retorna o objeto da classe
Product. Este elemento tambm pode definir
uma implementao bsica que retorna um
objeto de uma classe ConcreteProduct
(produto concreto) bsica;
ConcreteCreator sobrescreve o factory
method e retorna um objeto da classe
ConcreteProduct;
Product define uma interface para os objetos
criados pelo factory method;
ConcreteProduct uma implementao para
a interface Product.
Veja o diagrama UML do padro.

122 |

www.borgesrinolfi.com.br

Programao em Java

Figura 21: Modelagem UML do padro Factory Method

Para implementarmos um caso real vamos olhar


a modelagem UML abaixo:

Figura 22: Modelo prtico do padro Factory Method

Temos a seguinte analogia com os elementos


definidos no padro:
Elemento Padro
Elemento caso Real
123 |

www.borgesrinolfi.com.br

Programao em Java

Creator
ConcreteCreator
Product
ConcreteProduct

FabricaCarro.java
FabricaCarroConcreta.java
Carro.java
CarroConcreto.java
CaminhoneteConcreto.java

Tabela 6: Elementos do padro Factory e do exemplo


prtico

Segue o cdigo em Java do exemplo acima:


FabricaCarro.java Classe abstrata que define
os mtodos necessrios para uma fabrica de carro.
Poderia facilmente ser uma interface.
public abstract class FabricaCarro {
public Carro
public
tipo);

carro;

abstract

Carro

criaCarro(String

}
Cdigo 95: Classe abstrata FabricaCarro.java

FabricaCarroConcreta.java Implementao
da classe abstrata FabricaCarro.java, com a
implementao do mtodo criaCarro(String tipo), onde
feita a deciso sobre qual objeto ser instanciado de
acordo com o tipo passado como parmetro.
public
class
FabricaCarro {

FabricaCarroConcreta

@Override
124 |

www.borgesrinolfi.com.br

extends

Programao em Java

public Carro criaCarro(String tipo) {


if ("carro".equals(tipo)) {
return new CarroConcreto();
}
else
if
("caminhonete".equals(tipo)) {
return new CaminhoneteConcreto();
} else {
throw
new
IllegalArgumentException(" Tipo de carro no
suportado.");
}
}
}
Cdigo 96: Classe concreta que implmenta a
FabricaCarro

Carro.java Interface que define as


caractersticas que um carro deve ter. Poderia ser
construdo como classe abstrata caso fosse necessrio
implementar algo na classe, para que suas subclasses
pudessem herdar a implementao.
public interface Carro {
public void acelera();
public void freia() ;
}
Cdigo 97: Interface que define a estrutura de carro

CarroConcreto.java implementao da
interface Carro.java, com as caractersticas de um
carro.

125 |

www.borgesrinolfi.com.br

Programao em Java

public class CarroConcreto implements Carro {


public Integer velocidade = 0;
public void acelera() {
System.out.println("[CARRO]
acelerando...");
velocidade += velocidade + 1;
System.out.println("Velocidade
= " + velocidade);
}
public void freia() {
System.out.println("[CARRO]
freiando...");
velocidade += velocidade - 1;
System.out.println("Velocidade
= " + velocidade);
}
}

Carro

atual

Carro

atual

Cdigo 98: Implementao da interface carro

CaminhoneteConcreto.java implementao
da interface Carro.java, com as caractersticas de uma
caminhonete.
public class
Carro {

CaminhoneteConcreto

implements

public Integer velocidade = 0;


public void acelera() {
System.out.println("[CAMINHONETE]
Caminhonete acelerando...");
velocidade += velocidade + 2;
System.out.println("Velocidade
atual
= " + velocidade);

126 |

www.borgesrinolfi.com.br

Programao em Java

}
public void freia() {
System.out.println("CAMINHONETE]
Caminhonete freiando...");
velocidade += velocidade - 2;
System.out.println("Velocidade
atual
= " + velocidade);
}
}
Cdigo 99: Segunda implementao da interface Carro
para gerar caminhonete

Classe principal onde criada uma instancia da


FabricaCarroConcreta.java e assim podemos fabricar
carros e caminhonetes somente passando parmetros
para a fabrica.
public static void main(String[] args) {
FabricaCarro
fabrica
=
new
FabricaCarroConcreta();
Carro
caminhonete
fabrica.criaCarro("caminhonete");
caminhonete.acelera();
caminhonete.freia();

Carro
carro
fabrica.criaCarro("carro");
carro.acelera();
carro.freia();
}

Cdigo 100: Testando o padro Factory

127 |

www.borgesrinolfi.com.br

Programao em Java

Template
Comportamental)

Method

(Padro

Este padro traz a ideia de construir uma classe


abstrata com o esqueleto do algoritmo, chamando
mtodos abstratos que devem ser implementados pelas
suas subclasses, permitindo que cada subclasse
aproveite o esqueleto criado da sua maneira prpria, e
que o algoritmo proposto siga a ordem definida de
execuo independente da sua implementao.
Este padro muito utilizado em frameworks,
pois permite incluir novas classes e integraes sem
que se conhea realmente o esqueleto criado.
O Template Method composto de dois
componentes:
AbstractClass (ClasseAbstrata.java)
Classe abstrata que define os templates
methods baseados em mtodos abstratos que sero
implementados nas ConcreteClasses.
ConcreteClass
(ClasseConcreta1
e
ClasseConcreta2)
Classes concretas que implementam os
mtodos abstratos definidos pela AbstractClass e que
so utilizados pelos templates methods.
O diagrama UML deste modelo apresentado
abaixo:

128 |

www.borgesrinolfi.com.br

Programao em Java

Figura 23: Modelagem UML do padro Template Method

Veja a seguir um cdigo escrito em java da


modelagem apresentada acima:
//Clase onde ser definido o algoritmos
esqueleto
public abstract class ClasseAbstrata {
//este o mtodo que contem o algoritmo
que ir chamar os mtodos abstratos
public void metodoTemplate() {
//algoritmo definido mesm sem conhecer
a implementao dos mtodos
operacao1();
operacao2();
}
//Mtodos abstratos que sero definidos nas
classes concretas
public abstract void operacao2();
public abstract void operacao1();

129 |

www.borgesrinolfi.com.br

Programao em Java

}
Cdigo 101: Implementao da classe abstrata que
implementa o mtodo template

Veja que no possvel saber como feita a


implementao dos mtodos operacao1 e operacao2,
mas mesmo assim, conhecendo a sua assinatura pode
utiliza-lo no mtodo template.
A implementao de como funciona os mtodos
operacao1 e operacao2, ficara com as classes
concretas.
public
class
ClasseAbstrata {

ClasseConcreta1

extends

//Implementao dos mtodos abstratos


public void operacao1() {
System.out.println("Classe
concreta
1: OPERACAO 1!");
}
public void operacao2() {
System.out.println("Classe
1: OPERACAO 2!");

concreta

}
}
Cdigo 102: Classe concreta 1, implementando os
metodos

public
class
ClasseAbstrata {

130 |

ClasseConcreta2

www.borgesrinolfi.com.br

extends

Programao em Java

//Implementao dos mtodos abstratos


public void operacao1() {
System.out.println("Classe
concreta
2: OPERACAO 1!");
}
public void operacao2() {
System.out.println("Classe
2: OPERACAO 2!");

concreta

}
}
Cdigo 103: Classe concreta 2

Para ver a execuo do padro Template


Method acontecer, utilize o cdigo abaixo em uma
classe principal com o mtodo main.
public static void main(String[] args) {
//Cria
a
instancia
das
classes
concretas utilizando polimorfismo
ClasseAbstrata
concreta1
=
new
ClasseConcreta1();
ClasseAbstrata
concreta2
=
new
ClasseConcreta2();
//executa o metodo tmeplate, onde
cada objeto sabe como executar o seu e ira
exibir informaes diferentes
//mesmo chamado o mesmo mtodo
concreta1.metodoTemplate();
concreta2.metodoTemplate();
}
Cdigo 104: Padro Template Method na prtica

131 |

www.borgesrinolfi.com.br

Programao em Java

Faade (Padro Estrutural)


Faade um padro estrutural e seu nome vem
do francs, e significa fachada. O objetivo deste padro
encapsular toda a complexidade de determinado
processo, e uma classe que seja mais fcil de utilizar e
manter.
Esse padro composto dos seguintes
elementos:
Facade - Classe intermediria que simplifica o
acesso aos Component.
Client - Classe que usa os Component de
forma indireta atravs do Facade.
Component
- Classes que compem o
subsistema.
O diagrama
especificado abaixo:

UML

do

padro

faade

Figura 24: Modelagem UML do Padro Faade

132 |

www.borgesrinolfi.com.br

Programao em Java

Por exemplo, para gravarmos um arquivo


necessrio
chamarmos
4
classes
diferentes
(OutputStream, FileOutputStream, OutputStreamWriter
e BufferedWriter), e para ler o arquivo mais 4 classes
(InputStream, FileInputStream, InputStreamReader e
BufferedReader), o que se torna razoavelmente
complexo, por isso poderamos encapsular essa lgica
em uma classe facade, e com isso disponibilizar uma
forma mais fcil para essas operaes.
Vamos ver como ficaria na prtica este exemplo:
Elemento do
Padro
Facade
Client
Component

133 |

Classe do exemplo
ArquivoFacade.java
Classe principal, mtodo main

OutputStream,
FileOutputStream,
OutputStreamWriter
e
BufferedWriter para o
mtodo
gravarArquivo(String
msg, String caminho)

InputStream,
FileInputStream,
InputStreamReader
e
BufferedReader para o
mtodo lerArquivo(String
caminho)

www.borgesrinolfi.com.br

Programao em Java

Tabela 7: Compoentes do Padro Faade e exemplo


real

Classe ArquivoFacade.java que representa a


fachada para simplificar o processo de gravao e
leitura de arquivo.
public class ArquivoFacade {
public
void
gravarArquivo(String
msg,
String caminho) {
try {
//cria um canal output para gerar
o arquivo conforme especificado
OutputStream
out
=
new
FileOutputStream(caminho);
//utilizamos o Writer e o Buffer
para facilitar o processo de gravao
OutputStreamWriter writer = new
OutputStreamWriter(out);
BufferedWriter
bwriter
=
new
BufferedWriter(writer);
//primeira linha do arquivo
bwriter.write("Programao

Java");
//criamos uma nova linha (como se
apertamos a tecla enter
//Obs.:
o
Writer
no
aceita
quebra de linha como o '\n'
bwriter.newLine();
//segunda linha do arquivo
bwriter.write("Capitulo de Input
e Output");
//fecha o buffer para liberar o
arquivo
134 |

www.borgesrinolfi.com.br

Programao em Java

bwriter.close();
} catch (Exception e) {
System.err.println("Erro:
e.getMessage());
e.printStackTrace();
}
}

"

public void lerArquivo(String caminho) {


try {
//cria um canal input para ler o
arquivo no caminho especificado
InputStream
in
=
new
FileInputStream(caminho);
//utilizamos o Reader e o Buffer
para facilitar o processo de leitura
InputStreamReader reader = new
InputStreamReader(in);
BufferedReader
breader
=
new
BufferedReader(reader);
String
breader.readLine();

texto

while (texto != null) {


System.out.println(texto);
texto = breader.readLine();
}
//fecha o buffer para liberar o
arquivo
breader.close();
} catch (Exception e) {
System.err.println("Erro:
e.getMessage());
e.printStackTrace();
}
}
135 |

www.borgesrinolfi.com.br

"

Programao em Java

}
Cdigo 105: Implementao da classe Facade,
encapsulando a lgica de gravao e leitura de arquivos

Veremos que o a classe principal (Client) ficou


muito fcil gravar e ler um arquivo, e podemos utilizar
esta facilidade em qualquer lugar.
public static void main(String[] args) {
ArquivoFacade
facade
=
new
ArquivoFacade();
facade.gravarArquivo("Mensagem
de
teste!", "C:\\arquivo.txt");
facade.lerArquivo("C:\\arquivo.txt");
}
Cdigo 106: Utilizando o faade na prtica

DICA: Pudemos ver que os padres de projetos


trazem
uma
serie
de
benefcios
para
o
desenvolvimento, muito importante que voc veja
como funciona os 23 padres do GoF para que voc
tenha sadas no momento que encontrar algum
problema que parece no ter soluo.

136 |

www.borgesrinolfi.com.br

Programao em Java

10.

137 |

Referencias

http://docs.oracle.com/javase/tutorial/java/nutsan
dbolts/datatypes.html - 02/10/2012 - 23:07
http://docs.oracle.com/javase/tutorial/java/nutsan
dbolts/variables.html
http://docs.oracle.com/javase/tutorial/java/nutsan
dbolts/flow.html

www.borgesrinolfi.com.br

Programao em Java

ndice de Figuras
Figura 1: MeuPrograma.java ......................................... 9
Figura 2: MeuPrama.java passa por um compilador ..... 9
Figura 3: Esquema de compilao Java...................... 10
Figura 4: Funcionamento multiplataforma Java ........... 11
Figura 5: Prompt de comando do Windows................. 13
Figura 6: Verifique o diretrio onde se localiza o arquivo
................................................................................... 13
Figura 7: Arquivo compilado .class e cdigo fonte .java
................................................................................... 14
Figura 8: Resultado da execuo do primeiro programa
................................................................................... 15
Figura 9: Troca de mensagem, principio bsico da
Orientao a Objetos .................................................. 35
Figura 10: Representao de objetos do mundo real .. 36
Figura 11: Classe estrutura que se pode gerar vrios
objetos ........................................................................ 37
Figura 12: Classes Funcionario.java e Cliente.java tem
atributo iguais ............................................................. 50
Figura 13: Herana, unificando as caractersticas
comuns na superclasse Pessoa.java .......................... 50
Figura 14: Herana de Pessoa, Funcionario e Cliente 55
Figura 15: Herana com a distribuio do mtodo
imprimir ....................................................................... 56
Figura
16:
Modelagem
UML
da
interface
GeraEtiquetas.java ..................................................... 62
Figura 17: Podemos agora incluir no modelo mais uma
classe para gerar etiquetas, independente da herana
................................................................................... 65
138 |

www.borgesrinolfi.com.br

Programao em Java

Figura 18: Classes que compe o Collection Framework


do Java ....................................................................... 78
Figura 19: Embora o Map, faa parte do Collection
Framework, ele no herda as capacidades da classe
Collection, uma estrutura independente. .................. 78
Figura 20: Modelagem UML do padro Singleton ..... 119
Figura 21: Modelagem UML do padro Factory Method
................................................................................. 123
Figura 22: Modelo prtico do padro Factory Method123
Figura 23: Modelagem UML do padro Template
Method ...................................................................... 129
Figura 24: Modelagem UML do Padro Faade ........ 132

139 |

www.borgesrinolfi.com.br

Programao em Java

ndice de Tabelas
Tabela 1: Tipos primitivos existentes em Java ............ 18
Tabela 2: Tipos de Casting possveis .......................... 22
Tabela 3: Operadores de Atribuio............................ 24
Tabela 4: Operadores Relacionais em Java ................ 27
Tabela 5: Operadores Lgicos em Java ...................... 27
Tabela 6: Elementos do padro Factory e do exemplo
prtico ....................................................................... 124
Tabela 7: Compoentes do Padro Faade e exemplo
real............................................................................ 134

140 |

www.borgesrinolfi.com.br

Programao em Java

ndice de Cdigos
Cdigo 1: Fonte da classe OlaMundo.java .................. 12
Cdigo 2: Compilando a classe OlaMundo.java .......... 14
Cdigo 3: Executando um programa java ................... 15
Cdigo 4: Forma de declarao de varivel ................ 19
Cdigo 5: Exemplo de declarao de varivel............. 20
Cdigo 6: Declarao de constantes........................... 20
Cdigo 7: Atribuindo valores ....................................... 20
Cdigo 8: Atribuio de valor em um segundo momento
................................................................................... 21
Cdigo 9: Erro por tipos de dados incompativeis ........ 21
Cdigo 10: Casting de tipo de dados .......................... 21
Cdigo 11: Outros tipos de casting de variaveis.......... 22
Cdigo 12: Operadores aritmticos em Java .............. 23
Cdigo 13: Incrementando um nmero ....................... 25
Cdigo 14: Incrementando um numero de forma mais
limpa no cdigo ........................................................... 25
Cdigo 15: Utilizando ps-incremento em java ........... 25
Cdigo 16: Estrutura if-else ......................................... 29
Cdigo 17: Estrutura if-else aninhada ......................... 29
Cdigo 18: Estrutura do comando switch .................... 30
Cdigo 19: Estrutura do comando while ...................... 31
Cdigo 20: Estrutura do comando DO-WHILE ............ 32
Cdigo 21: Estrutura do comando FOR ...................... 32
Cdigo 22: Estrutura do For-each ............................... 33
Cdigo 23: Cdigo da classe Pessoa.java .................. 38
Cdigo 24: Estrutura de declarao de varivaies ........ 38
Cdigo 25: Estrutura bsica de um mtodo ................ 39

141 |

www.borgesrinolfi.com.br

Programao em Java

Cdigo 26: Dois mtodos podem ter o mesmo nome


desde que tenham parmetros diferentes ................... 40
Cdigo 27: : Criao de objetos e atribuio de valores
a seus atributos........................................................... 41
Cdigo 28: Imprimindo uma mensagem na tela .......... 43
Cdigo 29: Criao de dois objetos e chamada de
mtodo ........................................................................ 44
Cdigo 30: Construtor da classe Pessoa.java ............. 45
Cdigo 31: Criao de objetos utilizando construtores
para inicializar os atributos .......................................... 45
Cdigo 32: Declarao de pacote (package) .............. 47
Cdigo 33: Declarao de pacote utilizando subpastas
................................................................................... 47
Cdigo 34: Duas classes no mesmo pacote se
conhecem facilmente .................................................. 48
Cdigo 35: Classes em pacotes diferentes necessitam
de um import ............................................................... 48
Cdigo 36: Superclasse, ou classe pai, Pessoa.java .. 52
Cdigo 37: Subclasse, ou classe filha, Cliente.java .... 52
Cdigo 38: Subclasse, ou classe filha, Funcionario.java
................................................................................... 52
Cdigo 39: Criao do objeto Funcionario .................. 52
Cdigo 40: Tratar o objeto funcionario como Pessoa,
afinal, pela herana o Funcionario uma Pessoa ....... 53
Cdigo 41: No tem como o compilador saber se
Pessoa um Funcionario ........................................... 53
Cdigo 42: Fazendo casting de Pessoa para
Funcionario ................................................................. 53
Cdigo 43: Utilizando INSTANCEOF para saber qual a
instancia do objeto ...................................................... 53

142 |

www.borgesrinolfi.com.br

Programao em Java

Cdigo 44: Polimorfismo tratar um objeto como, outra


classe (uma classe pai, ou uma interface) .................. 54
Cdigo 45: Desta forma teremos um mtodo para cada
objeto, se tivermos mais um objeto, teremos que
escrever mais um mtodo ........................................... 56
Cdigo 46: Classe MalaDireta.java com o mtodo unico
que recebe Pessoa.java.............................................. 57
Cdigo 47: Classe Pessoa.java com a implementao
bsica do mtodo imprimir() ........................................ 58
Cdigo 48: Classe Cliente.java, ira utilizar a
implementao da superclasse, ou seja, Pessoa.java 58
Cdigo 49: Classe Funcionario.java, sobrescreve o
mtodo imprimir() e tem a sua prpria implementao 58
Cdigo 50: Classe principal, para ver o funcionamento
do polimorfismo em mtodos. ..................................... 59
Cdigo 51: Estrutura de uma classe Abstrata ............. 60
Cdigo 52: Implementando uma classe abstrata......... 60
Cdigo 53: Estrutura da interface GeraEtiquetas.java . 63
Cdigo 54: Classe Pessoa.java .................................. 63
Cdigo 55: Classe Funcionario.java estendendo as
capacidades de Pessoa e implementando a interface
GeraEtiquetas ............................................................. 64
Cdigo 56: Classe Cliente.java tambm estende as
capacidades de Pessoa e implementa a classe
GeraEtiquetas ............................................................. 64
Cdigo 57: O nmero de posies excede o permitido
causando uma exceo .............................................. 68
Cdigo 58: Tratamento de exceo utilizando try-catch
................................................................................... 69
Cdigo 59: JAVA 7 - podemos tratar varias excees
com o mesmo algoritmo .............................................. 70
143 |

www.borgesrinolfi.com.br

Programao em Java

Cdigo 60: Utilizando mtodo para lanar manualmente


uma exceo .............................................................. 71
Cdigo 61: Criando uma classe de exceo, ela pode
ser utilizada em todo o sistema, padronizando as
mensagens de erros inesperados. .............................. 72
Cdigo 62: Cdigo lanando nossa prpria exception. 73
Cdigo 63: Finally executado sempre, ao final do try
ou da exceo causada, desde que a exceo no seja
critica que deixe o sistema inoperante. ....................... 74
Cdigo 64: Cdigo necessrio para ler arquivo antes do
Java 7 ......................................................................... 75
Cdigo 65: Cdigo mais limpo, utilizando novos recurso
do Java 7 .................................................................... 75
Cdigo 66: Criando uma lista de Funcionarios ............ 80
Cdigo 67: Criao de objetos para inserir na lista ..... 81
Cdigo 68: Inserindo o objeto na lista, determinando a
posio dele ................................................................ 81
Cdigo 69: Adicionando o objeto na lista sem fazer
referencia a posio dele ............................................ 81
Cdigo 70: Percorrendo todos os objetos da lista, de
forma tradicional ......................................................... 82
Cdigo 71: Percorrendo utilizando Foreach, a melhor
forma de percorrer uma lista de objetos ...................... 82
Cdigo 72: Removendo objetos da lista por indice ou
diretamente ................................................................. 83
Cdigo 73: Imprimindo o tamanho da lista .................. 83
Cdigo 74: Cdigo completo da implementao de
java.util.List ................................................................. 84
Cdigo 75: Principais operaes utilizando Set........... 86
Cdigo 76: Principais operaes com a classe Map ... 88

144 |

www.borgesrinolfi.com.br

Programao em Java

Cdigo 77: Fazendo a classe Funcionario.java "assinar


o contrato" de uma classe Comparable ...................... 89
Cdigo 78: Cdigo da Ordenao ............................... 91
Cdigo 79: Utilizando InputStream para capturar o que
foi digitado pelo usurio. ............................................. 93
Cdigo 80: Convertendo os bytes gerados em Texto
novamente, com BufferedReader ............................... 94
Cdigo 81: Escrevendo mensagem em arquivo texto . 95
Cdigo 82: Fazendo a leitura do arquivo gerado ......... 97
Cdigo 83: Resultado esperado no console ................ 97
Cdigo 84: A partir do JAVA 5, ficou mais facil
manipular arquivos ...................................................... 98
Cdigo 85: Classe Carro.java implementando
Serializable ............................................................... 101
Cdigo 86: Serializando e Des-Serializando objetos . 104
Cdigo 87: Resultado esperado no console .............. 104
Cdigo 88: Utilizao do transient ............................. 105
Cdigo 89: Novo resultado esperado ........................ 105
Cdigo 90: Classe Calculadora.java com mtodo de
soma e multiplicao................................................. 110
Cdigo 91: Criando uma instancia por reflexo e
executando um mtodo passando parmetros.......... 111
Cdigo 92: Recuperando
informaes de classes
atraves de reflexo ................................................... 113
Cdigo 93: Implementao Java do padro Singleton
................................................................................. 121
Cdigo 94: Singleton funcionando na prtica ............ 121
Cdigo 95: Classe abstrata FabricaCarro.java .......... 124
Cdigo 96: Classe concreta que implmenta a
FabricaCarro ............................................................. 125
Cdigo 97: Interface que define a estrutura de carro 125
145 |

www.borgesrinolfi.com.br

Programao em Java

Cdigo 98: Implementao da interface carro ........... 126


Cdigo 99: Segunda implementao da interface Carro
para gerar caminhonete ............................................ 127
Cdigo 100: Testando o padro Factory ................... 127
Cdigo 101: Implementao da classe abstrata que
implementa o mtodo template ................................. 130
Cdigo 102: Classe concreta 1, implementando os
metodos .................................................................... 130
Cdigo 103: Classe concreta 2 ................................. 131
Cdigo 104: Padro Template Method na prtica ..... 131
Cdigo 105: Implementao da classe Facade,
encapsulando a lgica de gravao e leitura de arquivos
................................................................................. 136
Cdigo 106: Utilizando o faade na prtica ............... 136

146 |

www.borgesrinolfi.com.br

Você também pode gostar