Você está na página 1de 44

Projeto Fbrica de Programador Mdulo 2

Sumrio
1 ORIENTAO AO ALUNO ............................................................................................. 3
2 CLASSES E OBJETOS .................................................................................................. 3
2.1 Propriedades............................................................................................................ 3
2.2 Mtodos ................................................................................................................... 4
3 MTODOS GETTERS E SETTERS ............................................................................... 5
4 RELACIONAMENTOS ENTRE OBJETOS DO TIPO TEM UM ..................................... 5
5 HERANA - RELACIONAMENTO DE OBJETOS DO TIPO UM ............................. 10
5.1 Instanciando Polimorficamente .............................................................................. 17
5.2 Fazendo Converses (Casting) .............................................................................. 18
5.3 Sistema de Cadastro de Pessoas .......................................................................... 19
6 MTODOS E PROPRIEDADES ESTTICAS ............................................................... 20
7 SOBRECARGA E SOBRESCRITA DE MTODOS ...................................................... 22
7.1 Sobrescrevendo o Mtodo toString() ...................................................................... 23
7.2 Sobrescrevendo o Mtodo equals(Object obj) ........................................................ 24
7.3 Utilizando a IDE para Gerar o Mtodo Equals e Hashcode .................................... 24
7.4 HashCode .............................................................................................................. 25
7.5 A Palavra Reservada This ...................................................................................... 25
8 CONSTRUTORES ........................................................................................................ 26
8.1 Construtor Sobrecarregado .................................................................................... 26
8.2 Sobrecarregando o Construtor de Cidade .............................................................. 28
8.3 Lembrando dos Estticos ....................................................................................... 28
9 SOBRECARGA DE CONSTRUTORES ........................................................................ 29
10 MTODOS SOBRECARREGADOS ............................................................................. 29
11 CLASSES ABSTRATAS ............................................................................................... 30
12 INTERFACES ............................................................................................................... 31
12.1 Implementando as Interfaces ................................................................................. 32
13 GENRICOS - UM GERENCIADOR DE REGISTROS GENRICO ............................. 37
14 TRABALHANDO COM COLEES ............................................................................. 38
14.1 List ......................................................................................................................... 39
14.2 Exemplo de Uso da Interface List com ArrayList .................................................... 39
14.3 Set ......................................................................................................................... 40
14.4 Map ........................................................................................................................ 41
15 EXCEPTIONS ............................................................................................................... 41
15.1 Lanando uma Exception Unchecked (No verificadas)......................................... 42
15.2 Lanando uma Exception Checked (Verificadas) ................................................... 43

Verso: 2.0
2 Edio

www.fabricadeprogramador.com.br
Projeto Fbrica de Programador Mdulo 2

1 ORIENTAO AO ALUNO

Este material continuao do mdulo 1 do projeto Fbrica de Programador, nosso foco


ensinar os conceitos prticos de Orientao a Objetos de modo didtico, com uma linguagem
menos formal para auxiliar os desenvolvedores iniciantes a darem seus primeiros passos de
modo prtico e rpido, sem a necessidade de um embasamento terico aprofundado. Logo,
este material no foca os conceitos tericos da computao. Para voc se aprofundar na
teoria da computao recomendamos que leia livros voltados para esse fim.

2 CLASSES E OBJETOS

No modulo 1 (Java e Algoritmos) vimos os conceitos bsicos de classe como sendo a estrutura
bsica dos objetos. Se voc ainda tem dvidas sobre o que so classe e objetos
recomendamos a leitura da matria do mdulo 1.
O que precisamos entender, que um sistema composto por vrios objetos. Um objeto
uma instncia da classe e cada objeto ocupa um espao na memria podendo ser acessado
por meio das variveis de referncia. As variveis de referncia guardam o endereo do objeto
e funciona com um controle remoto onde podemos acessar seus mtodos e propriedades de
acordo de suas visibilidades.

2.1 Propriedades
Os objetos possuem propriedades que servem para definir ou armazenar as caractersticas,
campos ou atributos do objeto. No caso de um cliente, por exemplo, temos as propriedades:
nome, CPF e RG.
Exemplo de classe Cliente em Java

www.fabricadeprogramador.com.br Pgina: 3
Projeto Fbrica de Programador Mdulo 2

Neste exemplo criamos a classe Cliente e instanciamos dois objetos com o comando new, no
qual, cada objeto uma cpia da classe na memria, com a mesma estrutura da classe. Os
dados dos objetos so definidos no objeto. O objeto que possui nome Jo da Silva
totalmente independente do objeto que possui o nome Maria da Silva, embora os dois
objetos vieram da mesma classe, eles no se conhecem por que esto em posies de
memria diferentes.

2.2 Mtodos
Os mtodos como j vimos no modulo 1, so as funes que o objeto realiza. Um objeto
Calculadora pode possuir os mtodos: somar(), multiplicar(), subtrair (), e dividir().

Exemplo de criao de mtodo

class Calculadora{

public double somar(double n1, double n2){


return n1+n2;
}
}

Exemplo de invocao por meio de um objeto instanciado

public class ProgramaPrincipalMetodos {

public static void main(String[] args) {


Calculadora c = new Calculadora();
System.out.println(c.somar(10, 20));
}
}

Representao grfica da classe (UML)


O diagrama de classes um dos diagramas da UML (Unified Modeling Language ou
Linguagem de Modelagem Unificada) que uma linguagem visual utilizada para modelar
softwares que utilizam o padro orientao a objetos.
Voltando a classe Cliente podemos fazer sua representao grfica utilizando o diagrama
como abaixo.

Diagrama de Classe Cdigo Java


public class Cliente {

private String nome;


private String cpf;
private String rg;
}

www.fabricadeprogramador.com.br Pgina: 4
Projeto Fbrica de Programador Mdulo 2

3 MTODOS GETTERS E SETTERS

No mdulo 1 estudamos sobre os mtodos encapsuladores getters e setters. Estes mtodos


so encapsuladores de propriedades e servem para atribuio (set) e acesso (get) s
mesmas.

Exemplo

public class Cliente {


private String nome;

public String getNome() {


return nome;
}

public void setNome(String nome) {


this.nome = nome;
}
}

Normalmente utilizamos os mtodos getters e setters com modificadores de acesso pblico e


das propriedades privadas. O modificador de acesso pblico permite a varivel de instncia a
acessar o mtodo e o modificador de acesso privado probe o acesso da propriedade pela
instncia. Para acessar uma propriedade privada somente um mtodo da prpria classe pode
faz-lo.

Cliente cliente = new Cliente();


//Atribuindo o nome
cliente.setNome("Jo da Silva");
//Acessando o nome
System.out.println(cliente.getNome());

4 RELACIONAMENTOS ENTRE OBJETOS DO TIPO TEM UM

muito comum termos que relacionar os objetos de um sistema. Um sistema em


funcionamento nada mais que um conjunto de objetos trocando mensagens entre si. Em um
corpo humano os rgos se comunicam entre si, onde cada um faz a sua funo. Um software
no diferente, pois precisamos arquitetar e estruturar nossos objetos de modo que eles se
comuniquem e sirvam uns aos outros.
Pensemos em um caso: Para definirmos uma cidade para um cliente como faramos? Fcil,
basta acrescentarmos um campo ou propriedade chamado Cidade na classe Cliente do tipo
String. Certo? Sim, pode ser, mas na maioria dos casos uma cidade ser um objeto a parte e
independente do cliente, ento, neste caso, ao invs de colocarmos um atributo ou
propriedade do tipo String em nosso Cliente ns colocaremos uma propriedade do tipo cidade
que ainda iremos construir. Podemos dizer que o cliente tem uma cidade vinculada a ele.

www.fabricadeprogramador.com.br Pgina: 5
Projeto Fbrica de Programador Mdulo 2

Classe Cliente sem Relacionamento com Classe Cliente tem Relacionamento com

Classe Cidade Classe Cidade

public class Cliente { public class Cidade {

private String nome; private String nome;


private String cpf; private String uf;
private String rg;
}
private String cidade;
public class Cliente {
}
private String nome;
private String cpf;
private String rg;
private Cidade cidade;
//getters and Setters
}
No primeiro caso, no teramos o reaproveitamento das cidades e necessitaramos sempre
repetir o nome de uma mesma cidade vrias vezes para clientes diferentes.

Exemplo
Cliente jao = new Cliente();
jao.setNome("Jo");
jao.setCidade("Campo Grande");

Cliente maria = new Cliente();


maria.setNome("Maria");
maria.setCidade("Campo Grande");

No segundo caso podemos construir apenas um objeto Cidade e reutiliz-lo em vrios


clientes. Na verdade, quem se relaciona so os objetos, porm, na classe que escrevemos
isso. Basicamente, o que devemos fazer setar uma instncia de Cidade na propriedade
cidade do Cliente.

Cidade cg = new Cidade();


cg.setNome("Campo Grande");
cg.setUf("MS");

Cliente jao = new Cliente();


jao.setNome("Jo");
jao.setCidade(cg);//Relacionamento com objeto Cidade

Cliente maria = new Cliente();


maria.setNome("Maria");
maria.setCidade(cg);//Relacionamento com objeto Cidade

Diagrama de Classe da UML

www.fabricadeprogramador.com.br Pgina: 6
Projeto Fbrica de Programador Mdulo 2

No mundo real, vrios clientes do sistema podem ter nascido em uma cidade. Na memria
podemos imaginar vrios objetos do tipo Cliente e vrios objetos do tipo Cidade onde uma ou
mais instncias de clientes podem estar vinculados a uma mesma instncia de cidade.

Ao acessar um objeto tipo Cidade que est relacionado com um objeto tipo Cliente podemos,
a partir da instncia do Cliente, navegar no objeto Cidade porque a propriedade cidade nada
mais que uma referncia para um objeto do tipo Cidade. Com o mtodo getCidade()
acessamos esta referncia que foi setada para o cliente da instncia jao.

//Imprimindo dados da cidade do jao


System.out.println(jao.getCidade().getNome() + " " +
jao.getCidade().getUf());

Podemos, ainda, pensar na possibilidade de representarmos os estados de uma cidade como


sendo objetos a parte. Ao invs de termos uma propriedade String uf, poderamos ter uma
propriedade do tipo Estado vinculado ao tipo Cidade, no qual, teramos uma classe para
represent-lo como no diagrama de classe abaixo:

www.fabricadeprogramador.com.br Pgina: 7
Projeto Fbrica de Programador Mdulo 2

Na memria, agora temos um objeto do tipo Estado relacionado ao objeto do tipo Cidade.

Criao Classe Estado Alterao da Classe Cidade


public class Estado { public class Cidade {

private String nome; private String nome;


private String uf; private Estado estado;
//getters and setters //getters and setters
} }

Agora nosso programa principal deve ser alterado para que possamos utilizar a propriedade
UF em um objeto do tipo Estado e no mais diretamente na cidade como estava. Assim, j
iremos corrigir o erro gerado: The method setUf(String) is undefined for the type Cidade,
dizendo que no existe mais o mtodo setUf(String) na cidade.
Com uma instncia de estado basta setarmos ele na cidade em sua nova propriedade de
relacionamento estado. Para imprimir o estado da cidade do cliente, utilizamos a navegao
por meio do mtodo get. Primeiro acessamos o cliente, depois a cidade do cliente e por fim o
estado da cidade conforme o cdigo abaixo:

www.fabricadeprogramador.com.br Pgina: 8
Projeto Fbrica de Programador Mdulo 2

1. public class ProgramaPrincipal {


2.
3. public static void main( String[] args ) {
4. //Construo do Objeto Estado
5. Estado ms = new Estado();
6. ms.setNome("Mato Grosso do Sul");
7. ms.setUf("MS");
8.
9. //Construo do Objeto Cidade
10. Cidade cg = new Cidade();
11. cg.setNome("Campo Grande");
12. //Relacionamento com o objeto Estado
13. cg.setEstado(ms);
14.
15. Cliente jao = new Cliente();
16. jao.setNome("Jo da Silva");
17. jao.setCpf("999999999-99");
18. //Relacionamento com objeto Cidade
19. jao.setCidade(cg);
20.
21. //Imprimindo dados da cidade do jao
22. System.out.println(jao.getCidade().getNome()+ " " +
jao.getCidade().getEstado().getUf() +
23. " "+ jao.getCidade().getEstado().getNome());
24. }
25. }

www.fabricadeprogramador.com.br Pgina: 9
Projeto Fbrica de Programador Mdulo 2

5 HERANA - RELACIONAMENTO DE OBJETOS DO TIPO UM

Em muitos casos, podemos ter


a necessidade de trabalhar
com classes mais genricas e
classes mais especficas.
Vamos pensar na seguinte
situao:
Uma empresa necessita de
um sistema de cadastros que
possa ter o cadastro de vrias
pessoas, tais como Clientes,
Fornecedores e Funcionrios.
Estes trs tipos de cadastros
possuem campos em comum
(mais genricos) e campos
especficos que fazem parte
exclusivamente daquele
cadastro. Ns ainda no
estamos trabalhando com tela
em Java neste ponto do
estudo, mas fizemos um
rascunho (prottipo) quando
estvamos conversando com
o cliente, levantando suas
necessidades (levantamento
de requisitos) e pudemos
observar que o cliente deseja
algo semelhante s telinhas ao
lado.
O que vemos em comum
nestes cadastros solicitados
por nosso cliente?
Primeiramente, que todos os
cadastros, podemos
considerar, so de uma
mesma famlia mais genrica de objetos que podemos chamar de Pessoa. Podemos ver que
todos, por se tratarem de pessoa, possuem um campo (propriedade) nome e tambm cidade,
independente se Cliente, Fornecedor ou Funcionrio. Entre os cadastros temos uma
variao de campos, em que cada formulrio, alm dos campos em comum, possui campos
especficos, como no caso do funcionrio que possui praticamente os mesmos campos de
cliente, exceto um novo campo chamado cargo.
Nesta situao vamos trabalhar com um tipo de relacionamento chamado de Herana ou
relacionamento um. Neste tipo de relacionamento ns criamos classes que contero
propriedades e mtodos mais genricos. Essas classes servem de superclasse ou classe
base, para que outras possam estender, ou seja, esta classe contm propriedades e mtodos
que podem ser herdados.
As classes mais especficas ou classes filhas possuem a palavra reservada extends para
especificar qual ser sua classe base. Em outras palavras, as classes filhas que estendem as
superclasses esticam a classe base por meio do extends.

www.fabricadeprogramador.com.br Pgina: 10
Projeto Fbrica de Programador Mdulo 2

A classe base ou superclasse tem suas caractersticas e a classe filha herda suas
caractersticas e tambm adiciona novas propriedades e mtodos especficos dela. Na
instncia do objeto da classe filha podemos ver os mtodos e propriedades que foram
estendidos. Seno existisse herana, ns teramos que criar vrios campos ou propriedades
repetidas em cada classe.

Classes sem Herana Tentativa 1

Desta forma, criamos uma classe individual para cada Cadastro sem herana e sem a
reutilizao de campos.

public class Cliente{ public class Fornecedor{ Public class Funcionario{

private String nome; private String nome; private String nome;


private String private String cpf;
private String cpf; razaSocial; private private String rg;
private String rg; String cnpj; private private String cargo;
private Cidade cidade; Cidade cidade; private Cidade cidade;
}
}
}

Classes com Herana sendo 1 classe Genrica e 3 Especficas Tentativa 2

www.fabricadeprogramador.com.br Pgina: 11
Projeto Fbrica de Programador Mdulo 2

Desta forma, criamos uma classe Pessoa contendo os campos public class Pessoa {
comuns para todos dos cadastros. Mas ainda parece que
ficaram campos repetidos em Cliente e Funcionario. No private String nome;
private Cidade cidade;
poderamos colocar RG e CPF em Pessoa, seno
comprometeramos o Fornecedor que Pessoa Jurdica. //getters e setters
}

public class Cliente public class Fornecedor public class Funcionario


extends Pessoa{ extends Pessoa { extends Pessoa{

private String cpf; private String razaSocial; private String cpf;


private String rg; private String cnpj; private String rg;
private String cargo;
}
} }

Classes com Herana com mais classes Genricas e Especficas Tentativa 3

Deste jeito, pensamos de forma mais genrica ainda, criando uma classe Pessoa e classes
filhas Pessoa Fsica e Pessoa Jurdica. Agora as classes Cliente e Funcionrio estendem
da classe PessoaFisica e a classe Fornecedor estende da classe PessoaJuridica. Assim,
at se precisarmos em outras partes do sistema futuramente representar clientes do tipo
PessoaJuridica com este modelo teremos mais suporte para isso.

Classe mais Genrica Classes Filhas mais Especficas, mas ainda so Genricas
para suas filhas

www.fabricadeprogramador.com.br Pgina: 12
Projeto Fbrica de Programador Mdulo 2

public class Pessoa { public class public class PessoaJuridica


PessoaFisica extends extends Pessoa {
private String nome; Pessoa {
private Cidade cidade; private String cnpj;
private String cpf; private String razaSocial;
//getters e setters
private String rg;
//getters e setters //getters e setters

}
}
}

Classes Filhas das Filhas ainda mais Especficas

public class Cliente public class Fornecedor public class Funcionario


extends PessoaFisica{ extends PessoaJuridica { extends PessoaFisica {

//Todos campos comuns //Todos campos comuns foram //Todos campos comuns
//Foram herdados //herdados //Foram herdados

} } private String cargo;


}

Programa Principal
Crie um programa principal para testar o acesso propriedade nome a partir da instncia de
Cliente.
public class ProgramaPrincipalCliente {
public static void main(String[] args) {

Cliente cli = new Cliente();


cli. ??? // O que ser que vai aparecer depois do ponto?
}
}

Observe a diferena entre o ponto de vista do objeto e da classe.

Do ponto de Vista do Objeto


Acessando os mtodos Get e Set do ponto de vista do objeto, ou seja, da instncia em um
Programa Principal, por exemplo, a IDE deve mostrar os mtodos herdados e acessveis.

www.fabricadeprogramador.com.br Pgina: 13
Projeto Fbrica de Programador Mdulo 2

Do ponto de Vista da Classe


Se tentarmos acessar as propriedades privadas da classe base pela classe filha, acreditando
que ela estar acessvel, ento nos deparamos com a situao de que isso no possvel. A
Herana respeita os modificadores de acesso das propriedades, e isso s seria possvel se
nossa propriedade no fosse private e sim protected. Ao deixarmos uma propriedade
protected estamos permitindo que a mesma seja acessvel diretamente pelas classes filhas,
livres de ter que acessar pelos mtodos encapsuladores, como se a propriedade tivesse sido
declara dentro da prpria classe filha.
A figura abaixo ilustra os mtodos acessveis pela classe Cliente. Vemos que possuem
mtodos getters e setters de Object, Pessoa e PessoaFisica.

Tudo estende de java.lang.Object


A classe java.lang.Object a classe base padro do Java, tudo estende de Object mesmo se
no colocarmos o comando extends Object. S podemos herdar uma classe por vez, no
havendo herana mltipla como em outras linguagens, ou seja, cada classe filha s pode ter
uma classe base e essa classe base tambm pode ter outra classe base e assim por diante
at chegar no topo da hierarquia que a classe Object.

www.fabricadeprogramador.com.br Pgina: 14
Projeto Fbrica de Programador Mdulo 2

Protected do ponto de vista da classe


Se colocarmos na propriedade nome da classe Pessoa o modificador protected, podemos
acess-lo diretamente pela classe filha. Faa a seguinte experincia, na classe Cliente,
adicione um mtodo calcularPontuacao para tentarmos acessar de dentro do mtodo a
propriedade nome da classe Pessoa.
public class Pessoa { public class Cliente extends
protected String nome; PessoaFisica{
public void calculaPontuacao(){
} }
}

Na IDE (Eclipse ou Netbeans) voc j pode ver que isso possvel utilizando o recurso de
auto complete (ctrl+ espao) como na imagem abaixo.

www.fabricadeprogramador.com.br Pgina: 15
Projeto Fbrica de Programador Mdulo 2

Assim, podemos acessar essa propriedade de forma direta para atribuirmos um valor ou para
recuperarmos seu valor para impresso. Uma forma utilizada tambm por meio do comando
this ficando this.nome.

Protected do ponto de vista da instncia


Podemos acessar da instncia uma propriedade protected diretamente? Resposta: Vai
depender dos pacotes. Se a classe que possui a instncia de Cliente como o
ProgramaPrincipal estiver no mesmo pacote que a classe Cliente ento sim, a propriedade
fica de livre acesso, podendo ser acessada diretamente como se ela fosse do modificador
default. E as classes estiverem em pacotes diferentes ento no possvel acessar a
propriedade protected, precisando, assim, utilizar os mtodos encapsuladores getters e
setters.

Instncia em classe no mesmo pacote Instncia em classe em pacote diferente

Mova a classe Pessoa que possui a


propriedade protected para um pacote
diferente, temp, por exemplo.

package br.com.fabricadeprogramador
.temp;
//imports aqui
public class Pessoa {
protected String nome;
//restante da classe aqui
}

Na instncia tente acessar

Neste exemplo, podemos ver claramente a


possibilidade de acesso da propriedade nome
pela instncia de cliente no programa principal.
Para ficar fcil de entender pense que do ponto Veja que aparecem os mtodos, mas no a
de vista da instncia a regra a mesma do propriedade nome.
modificador default.

www.fabricadeprogramador.com.br Pgina: 16
Projeto Fbrica de Programador Mdulo 2

5.1 Instanciando Polimorficamente


possvel declarar uma varivel do tipo mais genrico apontando para um objeto de uma
classe filha bem mais especfico? Sim, a isso chamamos de atribuies polimrficas. Veja no
exemplo abaixo.

package br.com.fabricadeprogramador.sistemacadastro;

import br.com.fabricadeprogramador.temp.Pessoa;

public class ProgramaPrincipalPolimorfismo {


public static void main(String[] args) {

Object objeto = new Funcionario();

Pessoa pessoa = new Funcionario();

PessoaFisica pessoaFisica = new Funcionario();

Funcionario funcionario = new Funcionario();

}
}

Quando uma classe filha estende uma classe base, dizemos que um objeto da classe filha
um (a) do objeto classe base.
Exemplo
Podemos declarar variveis de um tipo mais genrico para armazenar referncias a objetos
mais especficos. Uma varivel do tipo Object pode apontar para um objeto do tipo Funcionario
porque o mesmo passa no teste um, ou seja, um funcionrio um Object, mesmo que
no herda diretamente, mas no topo da hierarquia sabemos que tudo herda de Object. Uma
varivel do tipo Pessoa pode apontar para um objeto Funcionario porque funcionrio uma
Pessoa. Uma varivel do tipo PessoaFisica pode apontar para um objeto do tipo Funcionario
porque funcionrio uma PessoaFisica. Uma varivel do tipo Funcionario pode apontar
para um objeto Funcionario porque funcionrio um Funcionario.
A figura abaixo mostra que todos podem apontar para um Funcionrio, porm, os que esto
mais abaixo ou especficos podem ver mais detalhes do objeto, porque a varivel de
referncia limita o acesso as propriedades e mtodos do objeto de acordo com seu tipo.
Um tipo Object embora aponte para um objeto Funcionario no pode ter acesso a tudo do
funcionrio, podendo acessar apenas o que corresponde ao tipo Object. Um objeto funcionrio
constitudo de vrias partes, sendo a parte de Object, a parte de Pessoa, a parte de
PessoaFisica e a parte de Funcionario. A soma destas heranas o funcionrio completo,
mas quem pode ter acesso completo apenas uma referncia do tipo Funcionario. A varivel
do tipo Object a mais limitada quanto ao acesso ao objeto Funcionrio e a varivel do tipo
Funcionrio a mais completa.

www.fabricadeprogramador.com.br Pgina: 17
Projeto Fbrica de Programador Mdulo 2

5.2 Fazendo Converses (Casting)


possvel fazermos converses de tipos desde que os objetos sejam da mesma famlia. Em
nosso exemplo anterior temos uma instncia de funcionrio sobre uma referncia do tipo
Object. O Objeto instanciado e do tipo Funcionrio, mas a referncia declarada foi do tipo
Object, ento essa varivel de referncia mesmo podendo acessar o objeto, est limitada pelo
seu tipo declarado no podendo acessar tudo de um objeto Funcionario.
Mas ser possvel a varivel do tipo Object invocar o mtodo setCargo(String)? Sim, se
fizermos uma converso ou casting. Fazer um casting na varivel Object objeto para o tipo
Funcionrio como esticar a capacidade dela para que ela possa acessar o objeto completo.
O que estamos fazendo tornando a viso de varivel que mais genrica em uma lupa
para ver os detalhes de um objeto mais especfico. Veja:

Setando um cargo no funcionrio fazendo casting


((Funcionario)objeto).setCargo("Motorista");

Getando o cargo do funcionrio


objeto.getCargo();

Se tentarmos acessar diretamente o mtodo getCargo na varivel que fizemos o casting, no


teremos acesso e receberemos a seguinte mensagem:

The method getCargo() is undefined for the type Object

Isso porque o casting no altera o tipo original da varivel mantendo como sendo do tipo
Object. Para acessarmos o mtodo getCargo temos que fazer novamente um casting da
seguinte forma:

www.fabricadeprogramador.com.br Pgina: 18
Projeto Fbrica de Programador Mdulo 2

((Funcionario)objeto).getCargo();

Assim como podemos esticar a visibilidade tambm podemos encolher. Para um objeto do
tipo Funcionrio podemos fazer um casting para torn-lo de o tipo mais Genrico como:
Funcionario funcionario = new Funcionario();
((PessoaFisica) funcionario).setCpf("99009");

5.3 Sistema de Cadastro de Pessoas


Um exemplo de uso de atribuies polimrficas seria criarmos um sistema de cadastro
Genrico, no qual podemos passar por parmetro uma instncia de qualquer objeto da famlia
de Pessoa, ou seja, qualquer objeto de uma classe que estenda da classe Pessoa. No
exemplo abaixo a varivel genrica Pessoa recebe um objeto como parmetro e o armazena
em um vetor Genrico de Pessoa.
public class SistemaCadastro {
Pessoa pessoas[] = new Pessoa[3];
int numEntradas = 0;

/** Entrada Generica


* @param pessoa
*/
public void cadastrar (Pessoa pessoa){
if(numEntradas < pessoas.length){
pessoas[numEntradas] = pessoa;
numEntradas++;
}
}
}

Agora na hora de imprimir teremos que utilizar a tcnica de converso para imprimir os dados
especficos de um objeto Pessoa. Como nosso vetor de pessoas genrico e armazena
vrios tipos de pessoas diferentes, como Cliente, Fornecedor e Funcionrio ento temos que
utilizar o instanceof para verificar qual o tipo do objeto da referncia para realizar a converso
e acessar as propriedades especficas.

/**
* Impressao de forma especifica
*/
public void imprimir (){
for (int i = 0; i < pessoas.length; i++) {
System.out.println(pessoas[i].getNome()+ "");

www.fabricadeprogramador.com.br Pgina: 19
Projeto Fbrica de Programador Mdulo 2

//Funcionario
if(pessoas[i] instanceof Funcionario){

//casting
Funcionario func = (Funcionario) pessoas[i] ;
System.out.print(func.getSalario() + " " + func.getCargo());
}
//Faa para Cliente

//Faa para Fornecedor


}
}

Convertendo de String para Inteiro


Quando os objetos no so da mesma famlia hierrquica no podemos utilizar a mesma
tcnica de casting. possvel fazermos uma converso de uma String para nmero inteiro
ento? Da seguinte forma, no.
String numeroStr = "10";
Integer n = (Integer)numeroStr;

A soluo para este caso a chamada a um o mtodo static de converso parseInt da classe
Integer ou chamada de um construtor especial que suporta uma entrada String.

String numeroStr = "10";


Integer n1 = Integer.parseInt(numeroStr);
Integer n2 = new Integer(numeroStr);

6 MTODOS E PROPRIEDADES ESTTICAS

Um mtodo esttico um mtodo que no est ligado a instncia do objeto. Para invocar um
mtodo esttico basta colocarmos o nome da classe, um ponto e nome do mtodo como:
Integer.parseInt("10");

Uma propriedade esttica uma propriedade da classe e no do objeto. Isso quer dizer que
o valor dela no pode ser diferente para cada instncia. Para toda instncia de Integer a
propriedade MAX_VALUE sempre ter o mesmo valor.
Integer maximoInt = Integer.MAX_VALUE;

www.fabricadeprogramador.com.br Pgina: 20
Projeto Fbrica de Programador Mdulo 2

As propriedades estticas no servem para manter o estado do objeto. Entende-se por


estado do objeto os valores atribudos em suas propriedades para uma determinada instncia.
No exemplo abaixo os objetos esto com estados diferentes porque suas propriedades no
so estticas e os dados atribudos so diferentes.
Funcionario jao = new Funcionario();
jao.setNome("Jo da Silva");
jao.setCargo("Cientista da Computao");

Funcionario maria = new Funcionario();


maria.setNome("Maria da Silva");
maria.setCargo("Analista de Sistemas");

Em nosso caso, ser comum utilizarmos mtodos estticos em nossa aplicao para criarmos
classes com mtodos utilitrios.
Exemplo
public class ValidacaoUtil {

public static void validarCpf(String cpf) {


//implementao aqui
}

public static void validarCnpj(String cnpj) {


//implementao aqui
}

public static void validarEmail(String email) {


//implementao aqui
}

A invocao dos mtodos estticos no necessita de instncia.

public static void main(String[] args) {


ValidacaoUtil.validarCnpj("10.797.626/0001-88");
ValidacaoUtil.validarCpf("905.044.567-92");
ValidacaoUtil.validarEmail("contato@htcursos.com");
}

O main esttico! O mtodo principal public static void main(String[] args) esttico, por se
tratar de um mtodo principal no sendo necessrio a JVM instanciar um objeto do nosso
programa principal para invoca-lo. Um mtodo esttico somente pode alterar valores de
variveis tambm estticas. O cdigo abaixo no pode ir funcionar por que a propriedade
no esttica e est tentando ser acessar por um mtodo esttico.

www.fabricadeprogramador.com.br Pgina: 21
Projeto Fbrica de Programador Mdulo 2

public class ValidacaoUtil {

String cpf; //propriedade no esttica

public static void validarCpf(String cpf) {

//Cannot make a static reference to the non-static field numero


this.cpf =cpf;
}
}

Ao utilizarmos mtodos estticos, tambm no utilizamos a palavra reservada this, porque ela
quer dizer esta instncia atual e com os mtodos estticos no estamos trabalhando com a
instncia. Certo?
O cdigo abaixo pode ser feito.
public class ValidacaoUtil {

static String cpfEstatico;


// propriedade esttica
public static void validarCpf(String cpf) {
cpfEstatico = cpf;
}
}

7 SOBRECARGA E SOBRESCRITA DE MTODOS

Em Java vimos que a classe mais genrica a java.lang.Object. A classe Object do java
possui vrios mtodos implementados, abaixo vamos listar dois deles: toString( ) e equals(
Object obj).
public String toString() {}
Retorna uma String representando
uma verso texto do objeto.
Exemplo de chamada:
Cliente cli = new Cliente(); Ao tentarmos imprimir uma varivel de
instancia do objeto o mtodo toString
System.out.println(cli); invocado automaticamente.

System.out.println(cli.toString()); Por padro o mtodo retorna uma


String com uma referncia ao objeto
como:
br.com.fabricadeprogramador.sist
emacadastro.Cliente@13d9c02

public boolean equals(Object obj) {} Este mtodo verifica se o objeto atual


igual ao outro passado no parmetro.

www.fabricadeprogramador.com.br Pgina: 22
Projeto Fbrica de Programador Mdulo 2

Exemplo de chamada: Seu critrio de igualdade a referncia,


1. Cliente cli1 = new Cliente(); ou seja, somente se os objetos
estiverem na mesma posio de
2. cli1.setNome("jo"); memria, ento, sero considerados
3. iguais.
4. Cliente cli2 = new Cliente(); No exemplo ao lado temos 2 clientes
5. cli2.setNome("jo"); com o mesmo nome, porm em objetos
diferentes, ou seja, em posies
6. diferentes de memria, logo o retorno
7. boolean iguais = cli2.equals(cli1); ser false na comparao da linha 7.
8. System.out.println(iguais);

Os mtodos da classe base Object que acabamos de estudar j possuem uma implementao
padro. Mas seria possvel modificarmos essa implementao? E se quisermos considerar
que duas instncias diferentes de objetos do tipo Cliente com o mesmo CPF sejam
considerados clientes iguais, mesmo que esto em posies de memria diferentes? Neste
caso ns temos que modificar o mtodo equals da classe Object, porm se fosse possvel
fazer isso diretamente na classe Object ns comprometeramos todos os objetos do sistema
porque todos herdam de Object.
Ento ser possvel modificarmos somente o mtodo toString da classe Cliente para fazer
essa adaptao para nossa necessidade especfica? Sim, possvel, isso conhecido como
sobrescrita de mtodo, ou seja, escrever uma por cima ou sobre do mtodo herdado da
classe base na classe filha.

7.1 Sobrescrevendo o Mtodo toString()

public class Cliente extends PessoaFisica{


public String toString() {

return getNome() + " "+ getCpf();

//demais mtodos

Desta forma agora ao executarmos o cdigo abaixo a sada ser o nome e o CPF
concatenados do objeto Cliente.

Cliente cli1 = new Cliente();


cli1.setNome("jo");
cli1.setCpf("999.999.999-99");

System.out.println(cli);

www.fabricadeprogramador.com.br Pgina: 23
Projeto Fbrica de Programador Mdulo 2

7.2 Sobrescrevendo o Mtodo equals(Object obj)


Queremos que o critrio de comparao seja o CPF e o RG do cliente, ou seja, se dois clientes
com mesmo CPF e RG so comparados pelo mtodo equals ento o retorno deve ser true.
public class Cliente extends PessoaFisica{

public boolean equals(Object obj) {

//Se os objetos estiverem na mesma posio de memria


if (this == obj)
return true;

//Convertendo (casting) o tipo Object para o tipo PessoaFisica


PessoaFisica outro = (PessoaFisica) obj;

//se no forem iguais retorna falso


if(!cpf.equals(outro.cpf))
return false;

//se no forem iguais retorna falso


if(!rg.equals(outro.rg))
return false;

//se no passou
return true;
}

public String toString()


return getNome() + " "+ getCpf();
}
}

7.3 Utilizando a IDE para Gerar o Mtodo Equals e Hashcode


Melhorando o mtodo hashcode e equals de Cliente utilizando a ferramenta da IDE eclipse
ou Netbeans. No eclipse o acesso pelo menu source / generator hashcode and equals.

public boolean equals(Object obj){

if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;

PessoaFisica other = (PessoaFisica)obj;

www.fabricadeprogramador.com.br Pgina: 24
Projeto Fbrica de Programador Mdulo 2

if (cpf == null) {
if (other.cpf != null)
return false;
} else if (!cpf.equals(other.cpf))
return false;

if (rg == null) {
if (other.rg != null)
return false;
} else if (!rg.equals(other.rg))
return false;
return true;
}

7.4 HashCode
Muito usado nas estruturas de dados que iremos ver mais a frente, mas, por esse momento,
precisamos entender que este um nmero que representa um objeto toda vez que os valores
de suas propriedades estipuladas no mtodo estiverem iguais, o mesmo hashcode deve ser
gerado, neste exemplo quando uma pessoa possuir o mesmo RG e o mesmo CPF um cdigo
de hashcode ser gerado idntico porque o mtodo utiliza dos dados destas propriedades
para dar origem ao nmero de hashcode. Em estrutura de armazenamento HashMap e
HashSet iremos ver isso na prtica.

public int hashCode() {


final int prime = 31;
int result = 1;
result = prime * result + ((cpf == null) ? 0 : cpf.hashCode());
result = prime * result + ((rg == null) ? 0 : rg.hashCode());
return result;
}

7.5 A Palavra Reservada This


A palavra reservada this sempre ser usada dentro da classe para fazer referncia instncia
atual. No exemplo anterior no trecho de cdigo abaixo podemos ler: se a referncia da
instncia atual (this) for igual a referncia instncia obj ento return true.
if (this == obj)
return true;

www.fabricadeprogramador.com.br Pgina: 25
Projeto Fbrica de Programador Mdulo 2

8 CONSTRUTORES

Os construtores so como um mtodo chamado somente no momento de construirmos um


objeto. Um objeto construdo quando alocado na memria. No iremos trat-lo como
mtodo por no acessarmos pela varivel de referncia por meio do operador de acesso
ponto. Mas tem uma sintaxe parecida com a de um mtodo, exceto por no possuir tipo de
retorno. O construtor sempre leva o nome da Classe. O construtor chamado por meio do
operador new. Exemplo: new Cliente();

Construtor Padro

Este o construtor sem parmetros de entrada. Todo construtor ao ser chamado executa
primeiro o construtor da classe base. O objeto vai sendo construdo de cima para baixo, ou
seja, primeiro o construtor da classe Object executado e depois o construtor das classes
filhas na ordem da herana. A chamada super() invoca o construtor da classe base. Mesmo
se no escrevermos um construtor padro na classe, o compilador ir escrever no bytecode
gerado, mesmo que no aparea em nosso cdigo fonte, exceto quando ns escrevermos
algum construtor sobrecarregado, que veremos logo a frente.
public class Pessoa {
protected String nome;
private Cidade cidade;

public Pessoa() {
super();
}
}

Chamada ao construtor padro de Pessoa


Pessoa pessoa = new Pessoa();

8.1 Construtor Sobrecarregado


um construtor que possui parmetros de entrada, ou seja, uma nova verso de um
construtor. Podemos criar vrias verses de construtores, em que cada verso suporta tipos
diferentes de entradas como parmetros. No exemplo abaixo temos o construtor padro e um
construtor sobrecarregado que suporta uma String e uma Cidade como entrada, sendo o
primeiro para iniciar o objeto com um valor setado nas propriedades nome e cidade de
Pessoa.
Sobrecarregando o construtor de Pessoa

www.fabricadeprogramador.com.br Pgina: 26
Projeto Fbrica de Programador Mdulo 2

public class Pessoa {


protected String nome;
private Cidade cidade;

public Pessoa() {
super();
}
public Pessoa(String nome, Cidade cidade) {
super();
this.nome = nome;
this.cidade = cidade;
}
}

Exemplo de chamada
new Pessoa("Jo", new Cidade());

Se ao instanciarmos um objeto da classe Cliente j quisermos informar o seu nome? Temos


que criar um construtor sobrecarregado na classe Cliente.

public class Cliente extends PessoaFisica{

public Cliente() {
super();
}

public Cliente(String nome) {


//Mtodo Herdado
setNome(nome);
}
}

Agora j podemos fazer a chamada ao construtor sobrecarregado da forma abaixo.


new Cliente("Jo");

www.fabricadeprogramador.com.br Pgina: 27
Projeto Fbrica de Programador Mdulo 2

8.2 Sobrecarregando o Construtor de Cidade

public class Cidade {

private String nome;


private Estado estado;

public Cidade() {
super();
}

public Cidade(String nome) {


super();
this.nome = nome;
}

public Cidade(String nome, Estado estado) {


super();
this.nome = nome;
this.estado = estado;
}
}

Agora com o construtor sobrecarregado podemos, no momento da construo do objeto


Pessoa, j passarmos dois objetos como parmetro de entrada, sendo uma instncia de String
e uma instncia de Cidade.
Pessoa pessoa = new Pessoa("Jo", new Cidade(Campo Grande));

8.3 Lembrando dos Estticos


Agora como j conhecemos o uso dos construtores vamos utiliz-lo combinando com uma
propriedade esttica para armazenar a quantidade de clientes que j foram instanciados.
public class Cliente extends PessoaFisica{

private static int quantidadeCliente=0;

public Cliente() {
quantidadeCliente++;
}

public static int getQuantidadeCliente() {


return quantidadeCliente;
}
}

www.fabricadeprogramador.com.br Pgina: 28
Projeto Fbrica de Programador Mdulo 2

Imprimindo o nmero de instncias de Objetos cliente

package br.com.fabricadeprogramador.sistemacadastro.construtores;

import br.com.fabricadeprogramador.sistemacadastro.Cliente;

public class ProgramaPrincipalClientes {

public static void main(String[] args) {


new Cliente();
new Cliente();
new Cliente();
System.out.println(Cliente.getQuantidadeCliente());
}
}

9 SOBRECARGA DE CONSTRUTORES

Exemplos de uso de construtores sobrecarregados nos tipos bsicos do Java.

Construtores sobrecarregado do tipo java.lang.Integer


//Construtor sobrecarregado parmetro String
Integer numero1 = new Integer("10");
//Construtor sobrecarregado parmetro int
Integer numero2 = new Integer(10);

Alguns construtores Sobrecarregados do java.lang.String


String texto1 = new String();
String texto2 = new String(new byte[3]);
String texto3 = new String(new char[3]);
String texto4 = new String("Fbrica de Programador");
String texto5 = new String(new StringBuffer());

10 MTODOS SOBRECARREGADOS

Assim como sobrecarregamos os construtores tambm sobrecarregamos os mtodos. Ao


sobrecarregarmos os mtodos temos que tomar o cuidado para sempre deixar o modificador
de acesso com o mesmo nvel ou mais alto. Um mtodo private no pode ser sobrescrito. Se
o mtodo for default, o mesmo pode ser sobrescrito por default ou por public. Se o mtodo
for public no pode ser sobrescrito por default.

public class ValidacaoUtil {


static String cpfEstatico; // propriedade no esttica

www.fabricadeprogramador.com.br Pgina: 29
Projeto Fbrica de Programador Mdulo 2

public static void validarCpf(String cpf) {


//valida CPF com os pontos (mascara)
}

public static void validarCpf(Integer cpf){


//valida CPF sem os pontos (mascara)
}
}

11 CLASSES ABSTRATAS

Classes abstratas so classes que possuem mtodos abstratos, ou seja, apenas a declarao
do mtodo sem sua implementao. Quando uma classe possui um mtodo abstrato ento a
classe vira abstrata. Uma classe abstrata no pode ser instanciada, por que possuem
mtodos sem implementao. Declaramos um mtodo abstrato quando no queremos uma
implementao genrica padro. Desta forma as classes filhas so obrigadas a implementar
o mtodo abstrato. Dizemos que as classes filhas assinam um contrato onde elas concordam
em implementar os mtodos abstratos da classe base abstrata. No exemplo abaixo vamos
mostrar um caso, no qual definimos que uma classe que estende de Funcionrio deve possuir
uma implementao especfica para o mtodo calculoSalario. Assim a classe filha Analista e
Diretor devem implementar o mtodo abstrato conforme seu tipo especfico.

public abstract class Funcionario extends PessoaFisica {


private String cargo;

public String getCargo() {


return cargo;
}
public void setCargo(String cargo) {
this.cargo = cargo;
}
public abstract double calculoSalario();
}

Agora a classe que estende funcionrio deve implementar o mtodo abstrato da classe base.
Um Analista que um Funcionrio que tem seu clculo de salrio diferente de um diretor com
5% a mais de diferena do salrio base.

public class Analista extends Funcionario{

public double calculoSalario() {


return getSalario() + (getSalario()*5/100);
}
}

www.fabricadeprogramador.com.br Pgina: 30
Projeto Fbrica de Programador Mdulo 2

Um Diretor um Funcionrio e logo deve implementar o mtodo abstrato da classe base com
10% a mais de diferena do salrio base.

public class Diretor extends Funcionario {

public double calculoSalario() {


return getSalario() + (getSalario()* 10/100);
}
}

12 INTERFACES

As interfaces nos permitem definir apenas o padro de funcionamento ou comportamento dos


objetos. Ela uma classe 100% abstrata no tendo propriedades e nem mtodos concretos
(no abstratos). Usamos interfaces quando queremos trabalhar de forma mais genricas na
famlia dos objetos sem entrar nos detalhes da implementao. Como analogia podemos
pensar nos componentes de um carro do mundo real. Eles so todos baseados em interfaces.
A interface Roda do carro diz que a rodas so de 4 furos e seu tamanho 15. Existem vrios
modelos de rodas para esse carro. A interface o modelo de encaixe que define o padro e
a roda propriamente dita a implementao da interface. Podemos trocar de roda quando
quisermos desde que obedea esse padro estabelecido pela interface Roda. Assim para
todos os componentes do carro, podemos trocar de som, trocar de volante, de rodas e de
peas porque o modelo dos componentes foi padronizado em interfaces. Isso garante que
podemos trocar de fabricante de pneus, de sons e etc.
Em nosso sistema vamos criar um Interface que ir padronizar um Pedido de um sistema de
pedidos. Nesta interface iremos apenas definir ou declarar os mtodos que o sistema de
pedidos deve possuir. Com o cdigo abaixo iremos construir a Interface Pedido, ou seja, o
padro que uma implementao de Pedido deve assumir.
public interface Pedido {

public Integer getCodigo()

public Double calcularValorTotal()


public void adicionarItem(ItemPedido itemPedido);
public void removerItemPedido(ItemPedido itemPedido);
public void imprimirItens();
public ItemPedido[] ordenarItensPedidos();
public ItemPedido[] getItensPedidos();
}

Um pedido ser constitudo de vrios itens que iremos chamar de ItemPedido. Vrios objetos
podem ser considerados como Itens a serem pedidos em sistema comercial. Por exemplo,
em uma escola podemos ter objetos Livros e Cursos que podem compor um Pedido que
uma compra. Em uma pizzaria podemos ter Pizza, Refrigerante, Sucos como sendo itens do
Pedido e assim por diante. Na maioria das vezes neste caso uma classe Produto poderia ser
utilizada para representar os itens de um Pizzaria de forma mais genrica.

www.fabricadeprogramador.com.br Pgina: 31
Projeto Fbrica de Programador Mdulo 2

Vamos criar uma Interface para definir a representao de um Item de um Pedido.

public interface ItemPedido {


//utilizado para garantir uma ordenao
public Integer getCodigo() ;
public void setCodigo(Integer codigo);

public Double getValor() ;


public void setValor(Double valor);

public String getDescricao() ;


public void setDescricao(String descricao);
}

Com esta interface ns garantimos alguns mtodos para cada ItemPedido.

12.1 Implementando as Interfaces


Vamos agora fazer a implementao da interface ItemPedido. Esta interface faz com que um
objeto possa possuir o comportamento padro de um itemPedido. Um exemplo de item que
pode compor um pedido um Curso. Ento faamos a classe Curso implementar a Interface
ItemPedido por meio da palavra reservada implements.

public class Curso implements ItemPedido {

// propriedade para os mtodos definidos na interface


private Integer codigo;
private Double valor;
private String descricao;
// Propriedade especificas
private String conteudo;
private String publicoAlvo;
private String cargaHoraria;
public Integer getCodigo() {
return codigo;
}
public void setCodigo(Integer codigo) {
this.codigo = codigo;
}

www.fabricadeprogramador.com.br Pgina: 32
Projeto Fbrica de Programador Mdulo 2

public Double getValor() {


return valor;
}
public void setValor(Double valor) {
this.valor = valor;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
//Outros mtodos aqui
}

Um outro exemplo de um ItemPedido pode ser um Livro.

import java.util.Date;

public class Livro implements ItemPedido {


//propriedade para os mtodos definidos na interface
private Integer codigo;
private Double valor;
private String descricao;
// Propriedade especificas
private String autor;
private String editora;
private Date dataPublicacao;

public Integer getCodigo() {


return codigo;
}
public void setCodigo(Integer codigo) {
this.codigo = codigo;
}

www.fabricadeprogramador.com.br Pgina: 33
Projeto Fbrica de Programador Mdulo 2

public Double getValor() {


return valor;
}
public void setValor(Double valor) {
this.valor = valor;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
//Outros mtodos aqui
}

Agora vamos implementar o Pedido utilizando uma classe PedidoImpl, em que o sufixo Impl
apenas uma abreviao de Implementao como conveno. A classe que implementa a
interface decide como trabalhar os mtodos.
public class PedidoImpl implements Pedido {
private Integer codigo;
private Date data;
private Cliente cliente;
private ItemPedido itens[];

public Integer getCodigo() {


// Implementao aqui
}
public Double calcularValorTotal() {
// Implementao aqui
}
public void adicionarItem(ItemPedido itemPedido) {
// Implementao aqui
}
public void removerItemPedido(ItemPedido itemPedido) {
// Implementao aqui
}
public void imprimirItens() {
// Implementao aqui
}
public ItemPedido[] ordenarItensPedidos() {
// Implementao aqui
}
public ItemPedido[] getItensPedidos() {
// Implementao aqui
}

www.fabricadeprogramador.com.br Pgina: 34
Projeto Fbrica de Programador Mdulo 2

// Outros mtodos aqui


}

Programa Principal de exemplo para construo de um Pedido


public class ProgramaPrincipalPedido {

public static void main(String[] args) {


Pedido pedido = new PedidoImpl();

int codigoItem = 1;

ItemPedido livro = new Livro();


livro.setCodigo(codigoItem);
livro.setValor(120.50);
livro.setDescricao("Livro de Java");

ItemPedido curso1 = new Curso();


curso1.setCodigo(++codigoItem);
curso1.setDescricao("Desenvolvimento para Android");

ItemPedido curso2 = new Curso();


curso2.setCodigo(++codigoItem);
curso2.setDescricao("Fbrica de Programador");

pedido.adicionarItem(livro);
pedido.adicionarItem(curso1);
pedido.adicionarItem(curso2);

pedido.imprimirItens();

double total = pedido.calcularValorTotal();


System.out.println(total);

pedido.removerItemPedido(curso1);
double novoTotal = pedido.calcularValorTotal();
System.out.println(novoTotal);
pedido.ordenarItensPedidos();
pedido.imprimirItens();
}
}

Annimos - Um gerenciador de Registros Genrico


Uma classe annima pode ser construda a partir de uma instncia de um objeto que
construdo de forma oculta ao tentarmos iniciar uma Interface. Podemos alterar o

www.fabricadeprogramador.com.br Pgina: 35
Projeto Fbrica de Programador Mdulo 2

ProgramaPrincipalPedido para incluir um objeto que no possui uma classe, porm ele
implementa a interface ItemPedido. Um objeto annimo com referncia.
ItemPedido curso2 = new Curso();
curso2.setCodigo(++codigoItem);
curso2.setDescricao("Fbrica de Programador");

//Construo de um objeto anonimo do tipo ItemPedido

ItemPedido itemAnonimo = new ItemPedido() {


public void setValor(Double valor) {
//Implementao do anonimo aqui
}
public void setDescricao(String descricao) {
//Implementao do anonimo aqui
}
public void setCodigo(Integer codigo) {
//Implementao do anonimo aqui
}
public Double getValor() {
//Implementao do anonimo aqui
return null;
}
public String getDescricao() {
//Implementao do anonimo aqui
return null;
}
public Integer getCodigo() {
//Implementao do anonimo aqui
return null;
}
};
pedido.adicionarItem(livro);
pedido.adicionarItem(curso1);
pedido.adicionarItem(curso2);
pedido.adicionarItem(itemAnonimo);

Construindo a instncia de um objeto annimo e j passando como parmetro no


mtodo sem referncia
pedido.adicionarItem(new ItemPedido() {
public void setValor(Double valor) {
//Implementao do anonimo aqui
}

www.fabricadeprogramador.com.br Pgina: 36
Projeto Fbrica de Programador Mdulo 2

public void setDescricao(String descricao) {


//Implementao do anonimo aqui
}
public void setCodigo(Integer codigo) {
//Implementao do anonimo aqui
}
public Double getValor() {
//Implementao do anonimo aqui
return null;
}
public String getDescricao() {
//Implementao do anonimo aqui
return null;
}
public Integer getCodigo() {
//Implementao do anonimo aqui
return null;
}
});

13 GENRICOS - UM GERENCIADOR DE REGISTROS GENRICO

A interface genrica Gerenciador Registro padroniza o comportamento de um objeto que tem


a funo de gerenciar registros. Essa interface garante que se o objeto ter um a funo de
gerenciar registro em um arquivo de texto, um vetor ou at mesmo em um banco de dados,
ele dever realizar no mnimo os mtodos que esto declarados nela.
public interface GerenciadorRegistro<T> {
public void salvar(T obj);
public void excluir(T obj);
public void pesquisar(T obj);
public void imprimirTodos();
}

Conforme falamos, este gerenciador define as operaes bsicas de um gerenciador de


registros onde podemos utilizar esta interface para construir um Gerenciador de registro de
Pedido, de Clientes, Cidades, Estados e etc.
O tipo parametrizado <T> quer dizer que o tipo do objeto que o mtodo dever suportar com
parmetro de entrada e de retorno vai ser definido pela classe que implementar a interface.
Uma classe pode dizer que <T> Cidade por exemplo desde modo:
GerenciadorRegistro<Cidade>, ou dizer que Estado, GerenciadorRegistro<Estado>, ou
Pedido como: GerenciadorRegistro<Pedido>. O que precisamos entender que o <T> que
faz a classe ficar genrica.
Exemplo de implementao para um Gerenciador de Registros (GR) de Cidades

www.fabricadeprogramador.com.br Pgina: 37
Projeto Fbrica de Programador Mdulo 2

public class GRCidade implements GerenciadorRegistro<Cidade> {


public void salvar(Cidade obj) {
// Implementao aqui
}
public void excluir(Cidade obj) {
// Implementao aqui
}
public void pesquisar(Cidade obj) {
// Implementao aqui
}
public void imprimirTodos() {
// Implementao aqui
}
}

No exemplo acima o GRCidade que define qual ser a estrutura de armazenamento e


independente disso deve possuir os mtodos da interface implementados para garantir seu
funcionamento como Gerenciador de Registros.

14 TRABALHANDO COM COLEES

Estrutura da API do java para tratar colees de objetos.

www.fabricadeprogramador.com.br Pgina: 38
Projeto Fbrica de Programador Mdulo 2

14.1 List
Uma lista dinmica de objetos organizada em vetor e acessvel por meio de ndices que aceita
objetos duplicados. Na API () padro do Java iremos utilizar vrias classes que utilizam tipos
genricos como uma lista de objetos da Interface List<E>.
java.util.List<E> uma interface que possui uma implementao padro em java
java.util.ArrayList<E>. Esta interface define o comportamento padro de uma Lista Dinmica.
Um ArrayList nos permite armazenar objetos em um Array Dinmico de objetos, ou seja, a
alocao do objeto na posio do vetor dinmica na qual o ArrayList que controla o nmero
de posies. No exemplo abaixo podemos ver que da interface java.util.List estende outra
Interface chamada Collection. Isso quer dizer que a classe que implementar List<E> dever
tambm implementar os mtodos herdados de Collection.

public interface List<E> extends Collection<E> {

int size();
boolean isEmpty();
boolean add(E e);
//Outros mtodos declarados aqui
}

14.2 Exemplo de Uso da Interface List com ArrayList


Um ArrayList uma lista, portanto podemos fazer a atribuio polimrfica declarando uma
varivel do tipo da Interface apontando para uma instncia de ArrayList.

public class ProgramaPrincipalArrayList {


public static void main(String[] args) {

List<Cliente> clientes = new ArrayList<Cliente>(); clientes.add(new


Cliente());

Cliente clienteAcessado = clientes.get(0);

Cliente clienteRemovido = clientes.remove(0);


}
}

Adicionando mais objetos na lista


clientes.add(new Cliente("Jo"));
clientes.add(new Cliente("Maria"));
clientes.add(new Cliente("Maria"));
clientes.add(new Cliente("Jos"));

Iterando sobre o Set por meio do ndice

www.fabricadeprogramador.com.br Pgina: 39
Projeto Fbrica de Programador Mdulo 2

for (int i = 0; i < clientes.size(); i++) {


Cliente cliente = clientes.get(i);
System.out.println(cliente.getNome());
}

Iterando sobre o Set por meio do objeto Iterator


for (Iterator iterator = clientes.iterator(); iterator.hasNext();) {
Cliente cliente = (Cliente) iterator.next();
System.out.println(cliente.getNome());
}

Iterando sobre o Set por meio do For Each


for (Cliente cliente : clientes) {
System.out.println(cliente.getNome());
}

14.3 Set
No permite registros duplicados. Utilize os mtodos equals e hashcode para definir o critrio
de igualdade. Sua organizao no permite acesso por ndice.

Adicionando no conjunto
//Atribuindo os nomes em um conjunto
Set<String> nomes = new HashSet<String>();
nomes.add("Maria");
nomes.add("Jos");
nomes.add("Maria");

Verificando se um objeto est no conjunto


//verificando se contam um objetos no conjunto
boolean contem = nomes.contains("Maria") ;
System.out.println("Contem Maria? " + contem );

Removendo do conjunto
//removendo objeto do conjunto
nomes.remove("Maria");

Iterando sobre o Set por meio do For Each


for (String nome : nomes) {
System.out.println(nome);
}

www.fabricadeprogramador.com.br Pgina: 40
Projeto Fbrica de Programador Mdulo 2

Iterando sobre o Set por meio do objeto Iterator


Iterator<String> iterador = nomes.iterator();
while (iterador.hasNext()) {
String nome = (String) iterador.next();
System.out.println(nome);
}

14.4 Map
Armazena os elementos na forma de pares chaves/valor. As chaves so exclusivas no
podendo ser duplicadas. Os acessos aos objetos so feitos pela chave que so nicas.
public class ProgramaPrincipalMap {
public static void main(String[] args) {
Map<String, String> linguagensProgramacao = new
HashMap<String,String>();

linguagensProgramacao.put("Java", "Web, Mvel e Desktop");


linguagensProgramacao.put("PHP", "Web");
linguagensProgramacao.put("Java Script", "Web Navegador de Internet");
}
}

Removendo do Map por meio da chave


linguagensProgramacao.remove("PHP");

Imprimindo por meio da chave


//Imprimindo por meio de chave
System.out.println(linguagensProgramacao.get("Java"));

Imprimindo por meio de um conjunto de chaves


//Imprimindo por meio de um Set de Chaves
Set<String> keys = linguagensProgramacao.keySet();
for (String k : keys) {
System.out.println(linguagensProgramacao.get(k));
}

15 EXCEPTIONS

Quando executamos um mtodo ou um construtor algo perigoso pode acontecer. Uma


exceo um objeto java contendo informao de um erro ocorrido em tempo de execuo.
Ao tentarmos realizar um clculo aritmtico por exemplo 10/0. O que acontece? Uma exceo.
Um objeto de exceo instanciado automaticamente pela JVM e enviado para nosso
mtodo. Existem excees que a JVM lana automaticamente e outras que so lanadas

www.fabricadeprogramador.com.br Pgina: 41
Projeto Fbrica de Programador Mdulo 2

programaticamente, ou seja, um mtodo via programao a instncia um objeto de exceo


e lana.
Vamos entender um pouco mais:

Na API do Java temos uma famlia que forma uma hierarquia de classes com Excees
nativas. Na figura acima temos um exemplo de como essa a estrutura dessa herana.
A classe mais genrica que corresponde a famlia das Exceptions Throwable. Logo, temos
a Exception e RuntimeException. Podemos classific-las em dois grupos:
1. Grupo das filhas diretamente de Exception (Checked)
2. Grupo das filhas de RuntimeException (Uncheck)

15.1 Lanando uma Exception Unchecked (No verificadas)


Este tipo de exceo ocorre por alguma falha na lgica de programao. Como exemplo,
pense em um vetor que possui apenas trs posies e o cdigo tenta acessar uma posio
que no existe. O Compilador no verifica esse tipo de situao e quando rodarmos o
programa em tempo de execuo uma exceo ser lanada. Uma exceo um objeto
derivado ou herdado da classe java.lang.Exception. Este objeto contm vrias informaes
sobre o erro ocorrido.
No caso abaixo ser lanada uma exceo na linha 7 ao tentar atribuir um valor na posio 3
do vetor que no existe pois o mesmo tem apenas 3 posies sendo 0, 1 e 2.
1. public class ProgramaPrincipalException {
2. public static void main(String[] args) {

www.fabricadeprogramador.com.br Pgina: 42
Projeto Fbrica de Programador Mdulo 2

3. int [] vetor = new int[3];


4. vetor[0]=10;
5. vetor[1]=20;
6. vetor[2]=30;
7. vetor[3]=40;
8. }
9. }
10.

A Exception lanar uma mensagem como:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3


at
br.com.fabricadeprogramador.sistemacadastro.sobrescrita.ProgramaPrincipalE
xception.main(ProgramaPrincipalException.java:7)
java.lang.ArrayIndexOutOfBoundsException: 3

15.2 Lanando uma Exception Checked (Verificadas)


Uma exceo Verificada uma classe que estende diretamente da classe base
java.lang.Exception, logo este mtodo no da famlia de RuntimeException.

Criando uma classe CPFInvalidException derivada de java.lang.Exception.


Essa classe ser utilizada para lanar um objeto Exception contendo informao sobre um
CPF Invlido. Iremos utilizar esse um objeto dessa classe em um mtodo de validao de
CPF.
public class CPFInvalidException extends Exception {

//Construtor padro
public CPFInvalidException() {
//passando para o construtor sobrecarregado da classe base
uma mensagem
//padro
super("CPF invlido!");
}

Em nossa classe ValidacaoUtil vamos implementar uma simples validao que verifica se o
CPF informado no parmetro vlido ou no.
Consideramos que para ser vlido o CPF o mesmo deve conter 11 dgitos e se isso no for
verdade ento um objeto da classe CPFInvalidException ser instanciado (new) e lanado
(throws). Para isso ser possvel devemos declarar na assinatura do mtodo que ele poder
fazer o lanamento throws CPFInvalidException.

www.fabricadeprogramador.com.br Pgina: 43
Projeto Fbrica de Programador Mdulo 2

//Na assinatura do mtodo temos que declarar um possvel lanamento de


Exception do tipo CPFInvalidException
public static void validarCpf(String cpf) throws CPFInvalidException {
if(cpf.length()!=11){
//Instnciando e lanando uma Exception
throw new CPFInvalidException();
}
}

Uma verificao consiste em tratar a Exception. Temos basicamente duas formas de tratar a
Exception, sendo uma delas usando o try catch, no qual ns pegamos o objeto da exceo
lanada e outra atravs de uma redeclarao throws onde dizermos que no queremos
pegar o objeto Exception lanado.
Agora vamos programar no programa principal uma chamada ao mtodo validarCpf que deve
ser verificado. agora que acontece a verificao, quando formos invocar o mtodo que diz
que pode lanar uma Exception. Ao tentar invocar o mtodo sem fazer a verificao o
compilador avisa.

public class ProgramaPrincipalException2 { public Uma mensagem do


static void main(String[] args) { compilador diz que a
ValidacaoUtil.validarCpf("905.098.531-90"); exceo deve ser
manipulada:
}
Unhandled exception type
} CPFInvalidException

Forma 1 Uma forma de fazer o


public class ProgramaPrincipalException2 { public tratamento pegar o
static void main(String[] args) { objeto por meio da
try { estrutura try-cath. O try
ValidacaoUtil.validarCpf("905.098.531-90");
tenta executar o mtodo e
} catch (CPFInvalidException e) { se a exceo for lanada
//Tratamento da Exception
pelo mtodo validarCpf
e.printStackTrace();
ento o catch recebe como
parmetro o objeto o
}
CPFInvalidException que
} foi lanado. A varivel
}
(CPFInvalidException e)
um parmetro do bloco
cath funcionando como
uma referncia ao objeto
CPFInvalidException
lanada.

Forma 2 Uma outra forma


public class ProgramaPrincipalException2 { redeclarar na assinatura
public static void main(String[] args) do mtodo main que
throws CPFInvalidException { possui uma chamada ao
ValidacaoUtil.validarCpf("905.098.531-90"); mtodo validarCpf
informando que o mtodo
} no vai pegar a exceo.

www.fabricadeprogramador.com.br Pgina: 44
Projeto Fbrica de Programador Mdulo 2

} throws
CPFInvalidException

Parabns pela concluso de mais uma fase do projeto Fbrica de Programador! No prximo
mdulo iremos aprender a fazer aplicaes mais interessantes, voltadas para Web.

www.fabricadeprogramador.com.br Pgina: 45