Upload
ras-oliveira
View
258
Download
0
Embed Size (px)
Citation preview
Programação Orientada a Objetos com Java
Ricardo Terra
Ricardo Terra ([email protected]) POO 8 de julho de 2011 1 / 526
Conteúdo
1 IntroduçãoVisão Geral de POO
2 UML
3 Java
4 POO
5 Padrões de Projeto
6 Tópicos Relevantes
7 Materiais Complementares
8 Extras
Ricardo Terra ([email protected]) POO 8 de julho de 2011 2 / 526
Introdução – Visão Geral de POO
Origem da POO
SimulaFoi a primeira linguagem de programação a introduzir osconceitos subjacentes a programação orientada a objetos(objetos, classes, subclasses, métodos virtuais, coletor de lixoetc)Mas, não foi amplamente desenvolvida
SmalltalkLinguagem puramente orientada a objetos
AtualmenteC++Object PascalJavaPythonEiffel
Ricardo Terra ([email protected]) POO 8 de julho de 2011 4 / 526
Introdução – Visão Geral de POO
Linguagem para criação de modelos
UMLPadrão OMG (Object Management Group)Mais utilizada nos dias de hojeUtilizaremos bastante o Diagrama de Classe, um dos seus 14diagramas, em nossa disciplina
Booch
OOSE (Object-Oriented Software Engineering)
OMT (Object Modeling Technique)
Ricardo Terra ([email protected]) POO 8 de julho de 2011 5 / 526
Introdução – Visão Geral de POO
Paradigma de Programação
DefiniçãoConjunto de regras e/ou hipóteses que governam adefinição de um modelo
Aplicação na computação/informáticaAuxiliar na condução do processo de busca da solução(modelo conceitual) de um problema
Ricardo Terra ([email protected]) POO 8 de julho de 2011 6 / 526
Introdução – Visão Geral de POO
Exemplos de paradigma de programação
Procedural (imperativo)É um paradigma de programação que descreve acomputação como ações (instruções) que mudam o estado(variáveis) de um programa. Muito parecido com ocomportamento imperativo das linguagens naturais queexpressam ordens, programas imperativos são umasequência de comandos para o computador executar
Orientado a objetosÉ um paradigma de programação que utiliza “objetos” e ainteração entre eles para projetar aplicações e programasde computador. Suas técnicas de programação podemincluir características como encapsulamento, polimorfismo eherança. Esse paradigma não era comumente usado nodesenvolvimento de aplicações de grande porte até iníciode 1990. Atualmente, várias linguagens modernas suportamPOO
Ricardo Terra ([email protected]) POO 8 de julho de 2011 7 / 526
Introdução – Visão Geral de POO
Objeto“Objeto é uma coisa, uma entidade, alguma coisa quevocê levanta ou chuta, qualquer coisa que você possaimaginar que tenha sua própria identidade.” (MikeO’Docherty, 2005)
Possuem características (atributos)
Possuem comportamentos (métodos)
Assume responsabilidades no domínio do problema
Ricardo Terra ([email protected]) POO 8 de julho de 2011 8 / 526
Introdução – Visão Geral de POO
Classe“Uma classe encapsula características comuns a grupos deobjetos.” (Mike O’Docherty, 2005)
Pode ser pensada de várias formas:Um conjunto de especificações que caracterizam comoseus membros devem serUm molde que produz objetos com a mesma forma...
EnfimDesenvolvedores utilizam classes para descrever elementosde programação que alguns tipos de objetos terão
Ricardo Terra ([email protected]) POO 8 de julho de 2011 9 / 526
Introdução – Visão Geral de POO
ClasseAtributos
Representam as informações (características) que os objetosda classe terãoPor exemplo, uma pessoa tem um nome, idade, peso etc
MétodosRepresentam as ações (comportamentos) que os objetos daclasse realizarãoPor exemplo, uma pessoa respira, come, bebe etc
EncapsulamentoClasse é a menor unidade modular de POO, isto é, não existenada menor que uma classeAssim, classe é definida como um grupo de atributos,métodos e outros membros que são tratado como umaúnica unidade modular
Ricardo Terra ([email protected]) POO 8 de julho de 2011 10 / 526
Introdução – Visão Geral de POO
Herança
Basicamente, é a habilidade de definir novas classesbaseadas em classes existentes
Suponha:Um animal
Animal morre
Um mamífero é um animalMamífero morreMamífero mama (novo)
Um leão é um mamíferoLeão morreLeão mamaLeão ruge (novo)
Ricardo Terra ([email protected]) POO 8 de julho de 2011 11 / 526
Introdução – Visão Geral de POO
Herança requer o entendimento dos conceitos desuperclasse e subclasses
Superclasses são as classes mais genéricas em sua hierarquiaSubclasses são as classes mais específicas em sua hierarquia
Com base no exemplo anterior:Animal
superclasse de Mamífero e Leão
Mamíferosuperclasse de Leão
subclasse de Animal
Leãosubclasse de Animal e Mamífero
Ricardo Terra ([email protected]) POO 8 de julho de 2011 12 / 526
Introdução – Visão Geral de POO
Sobreposição
Você sobrepõe uma operação quando deseja que umaoperação herdada seja realizada diferentemente pelasubclasse
Por exemplo, uma cobra se alimenta de ratos, mas um tipoespecífico de cobra (subclasse) se alimenta diferentemente
Assim, é necessário sobrepor o método alimentar:Classe Cobra
void alimentar ( Rato comida) { /∗ mata e come ∗/ }
Classe Cascavel
@Overridevoid alimentar ( Rato comida) { /∗ come mesmo vivo ∗/ }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 13 / 526
Introdução – Visão Geral de POO
Sobrecarga
Você sobrecarrega uma operação quando deseja que amesma operação também seja realizada por entradasdiferentes
Por exemplo, uma cobra se alimenta de ratos, mas um tipoespecífico de cobra (subclasse) se alimenta também deratazanas
Assim, é necessário sobrecarregar o método alimentar:Classe Cobra
void alimentar ( Rato comida) { /∗ mata e come ∗/ }
Classe Cascavel
@Overridevoid alimentar ( Rato comida) { /∗ come mesmo vivo ∗/ }void alimentar ( Ratazana comida) { /∗ come também ∗/ }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 14 / 526
Introdução – Visão Geral de POO
PolimorfismoHabilidade de um objeto poder ser tratado como qualqueruma de suas classes mais genéricas (superclasses)
Com base no exemplo anterior:Leão pode ser visto como um animal
Contudo, se for visto como animal, só poderá morrer
Um leão pode ser visto como um mamíferoContudo, se for visto como mamífero, só poderá morrer emamar
Ricardo Terra ([email protected]) POO 8 de julho de 2011 15 / 526
Introdução – Visão Geral de POO
Repasso
Ricardo Terra ([email protected]) POO 8 de julho de 2011 16 / 526
Introdução – Visão Geral de POO
Agenda TelefônicaAtributos
lista de contatos
Operaçõesinserir contatoalterar contatoexcluir contato
Ricardo Terra ([email protected]) POO 8 de julho de 2011 17 / 526
Introdução – Visão Geral de POO
Contato (para uma agenda telefônica)Atributos
nomeendereçotelefoneemail
Operaçõesobter/alterar nomeobter/alterar endereçoobter/alterar telefoneobter/alterar email
Ricardo Terra ([email protected]) POO 8 de julho de 2011 18 / 526
Introdução – Visão Geral de POO
Cavalo (como ele é)Atributos
pesoalturacorraça...
Operaçõesandarcomerpuxar carroçarelinchar...
Ricardo Terra ([email protected]) POO 8 de julho de 2011 19 / 526
Introdução – Visão Geral de POO
Exercícios: modele as seguintes classesConta
Equação (de 2o grau)
Escola
Filme
Telefone
Ricardo Terra ([email protected]) POO 8 de julho de 2011 20 / 526
Conteúdo
1 Introdução
2 UMLDiagrama de Classe
3 Java
4 POO
5 Padrões de Projeto
6 Tópicos Relevantes
7 Materiais Complementares
8 Extras
Ricardo Terra ([email protected]) POO 8 de julho de 2011 21 / 526
UML – Diagrama de Classe
Classe x ObjetoAs classes formam o alicerce do diagrama de classes. Paratrabalhar com diagrama de classes, você precisa ter umanoção clara da diferença entre classes e objetos
Assim:
Classe é a definição/molde para um recurso. Ela incluiinformações que descrevem os recursos de uma entidade ecomo ela pode ser utilizada
Objeto, ao contrário, é uma instância de uma classe.Pode-se dizer que um objeto é uma entidade identificável deforma exclusiva de acordo com as regras definidas pelaclasse
Ricardo Terra ([email protected]) POO 8 de julho de 2011 23 / 526
UML – Diagrama de Classe
Importância“Se alguém chegar perto de você em um beco escuro edisser: “Psiu, quer ver um diagrama UML?”, esseprovavelmente seria um diagrama de classes. A maioriados diagramas UML que vejo são diagramas de classes.”(FOWLER, 2005)
“O diagrama de classes provavelmente é o diagrama maisutilizado da UML. Na verdade, o diagrama de classes é aferramenta de modelagem principal para descrever aprópria UML.” (PENDER, 2004)
Ricardo Terra ([email protected]) POO 8 de julho de 2011 24 / 526
UML – Diagrama de Classe
Definição
Um diagrama de classes descreve os tipos de objetospresentes no sistema e os vários tipos de relacionamentoestáticos existentes entre eles
Os diagramas de classe também mostram os atributos eoperações de uma classe e as restrições que se aplicam àmaneira como os objetos estabelecem dependência
Ricardo Terra ([email protected]) POO 8 de julho de 2011 25 / 526
UML – Diagrama de Classe
Uma classe é uma descrição de um conjunto de objetosque partilham os mesmos atributos, operações, relações esemântica
Por exemplo, na classe Pessoa, é dito que uma pessoa temnome, idade, altura etc. Contudo, não diz qual é o nome, aidade, a altura etc
Se algo tem um nome, uma idade, uma altura etc, esse algoé um objeto de Pessoa
Ricardo Terra ([email protected]) POO 8 de julho de 2011 26 / 526
UML – Diagrama de Classe
Uma classe é descrita em seus aspectos estruturais por seusatributos e em seus aspectos comportamentais por suasoperações
Uma classe é representada como abaixo:
Ricardo Terra ([email protected]) POO 8 de julho de 2011 27 / 526
UML – Diagrama de Classe
É errado pensar que uma classe deve corresponder a umaentidade humana, uma coisa física, algo que você vê outoca etc
Por exemplo, pode-se representar entidades mais abstratas:
Venda, Saudade, Amor etc
Ricardo Terra ([email protected]) POO 8 de julho de 2011 28 / 526
UML – Diagrama de Classe
AtributosSão propriedades (características) semelhantes que osobjetos de uma classe possuem
Por exemplo, na classe Pessoa, o nome, a idade, a alturasão seus atributos
Um atributo pode ser de um tipo primitivo, uma coleção,um arranjo, um objeto de outra classe etc
Os valores dos atributos diferenciam objetos. Por exemplo,na classe Carro, sabe-se, dentre outras propriedades, queo meu carro é prata. Como o seu é preto, não pode ser omesmo carro
Em outras palavras, o valor do atributo cor diferenciou osobjetos
Ricardo Terra ([email protected]) POO 8 de julho de 2011 29 / 526
UML – Diagrama de Classe
Atributos e operações permitem que sejam especificadosdetalhes de sua visibilidade e de sua multiplicidade(abordaremos isso a frente)
A sintaxe básica de um atributo é:[visibilidade] nome : [tipo] { = valor-inicial }
Exemplos:+ nome : String
- salario : double = 1000.00
# nota : int
∼ cor : double
Ricardo Terra ([email protected]) POO 8 de julho de 2011 30 / 526
UML – Diagrama de Classe
Operações
São comportamentos (ações) que os objetos de umaclasse possuem
Por exemplo, na classe Pessoa, comer, beber, dormir sãosuas operações
Os valores dos atributos diferenciam objetos. Contudo, elesinfluenciam nas operações. Por exemplo, na classe Pessoa,uma pessoa que pesa 100kg certamente vai comer maisque uma que pesa 45kg
Existem operações que não sofrem influência dos atributos,mas não é comum
Ricardo Terra ([email protected]) POO 8 de julho de 2011 31 / 526
UML – Diagrama de Classe
A sintaxe básica de uma operação é:[visibilidade] nome ( [parâmetros] ) : [retorno]
Exemplos:- mostrar( ) : void
+ calcularTaxa( valorDolar : double ) : double
# somar( a : int , b: int ) : int
∼ delta( ): double
Ricardo Terra ([email protected]) POO 8 de julho de 2011 32 / 526
UML – Diagrama de Classe
Atributos e operações estáticos
Um atributo ou operação que não pertence a umainstância da classe, mas à classe como um todo sãochamados de atributo ou operação estático
Atributos e operações estáticos são compartilhados portodas as instâncias da classe, não pertencendo a umainstância específica
Ricardo Terra ([email protected]) POO 8 de julho de 2011 33 / 526
UML – Diagrama de Classe
Por exemplo, na classe ContaPoupanca, a taxa derendimento é comum a todas as contas poupanças
Logo, é um atributo estático
Atributos ou operações estáticos são representados comum sublinhado. Observe:
Ricardo Terra ([email protected]) POO 8 de julho de 2011 34 / 526
UML – Diagrama de Classe
Visibilidade
É possível especificar como os atributos e operações serãovistos no sistema
Eis os níveis de visibilidade:(+) PÚBLICO: Todas as classes visualizam
(-) PRIVADO: Somente a própria classe visualiza
(#) PROTEGIDO: Todas as classes do mesmo pacote etambém as subclasses visualizam
(∼) PACOTE: Todas as classes do mesmo pacote visualizam
Ricardo Terra ([email protected]) POO 8 de julho de 2011 35 / 526
UML – Diagrama de Classe
Exemplo (hipotético, cunho acadêmico)
Somente a própria classe tem acesso direto aos atributos
Qualquer classe pode ligar ou desligar o veículo
Somente classes do mesmo pacote ou subclasses podem acelerar ou frear oveículo
Somente a própria classe pode ativar o ABS
Somente classes do mesmo pacote podem saber o consumo do veículo
Ricardo Terra ([email protected]) POO 8 de julho de 2011 36 / 526
UML – Diagrama de Classe
Associação
Uma das maneiras de se criar um atributo é através de umaassociação
Associação é uma linha cheia entre duas classesLogo veremos navegabilidade
Por exemplo, uma NotaFiscal possui pelo menos umobjeto do tipo ItemNotaFiscal e um ItemNotaFiscalestá vinculado a uma única NotaFiscal
Ricardo Terra ([email protected]) POO 8 de julho de 2011 37 / 526
UML – Diagrama de Classe
Observe que não é necessário (nem correto) explicitar queNotaFiscal possui uma coleção de ItemNotaFiscal
A própria associação diz isso
Código Java correspondente
public class NotaFiscal {private Collection <ItemNotaFiscal > i tensNotaF iscal ;. . .
}
public class ItemNotaFiscal {. . .
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 38 / 526
UML – Diagrama de Classe
Navegabilidade
É possível definir a navegabilidade de uma associação
No exemplo anterior, a navegabilidade é só ocorre deNotaFiscal para ItemNotaFiscal
Isto é, o ItemNotaFiscal não sabe a NotaFiscal em quese encontra
Nos próximos slides veremos como a navegabilidade mudao projeto
Ricardo Terra ([email protected]) POO 8 de julho de 2011 39 / 526
UML – Diagrama de Classe
Original: Somente a NotaFiscal conhece ItemNotaFiscal
Código Java correspondente
public class NotaFiscal {private Collection <ItemNotaFiscal > i tensNotaF iscal ;. . .
}
public class ItemNotaFiscal {. . .
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 40 / 526
UML – Diagrama de Classe
Somente o ItemNotaFiscal conhece a NotaFiscal
Código Java correspondente
public class NotaFiscal {. . .
}
public class ItemNotaFiscal {private NotaFiscal notaFiscal ;. . .
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 41 / 526
UML – Diagrama de Classe
Ambas as classes se conhecem (Associação Bidirecional)
Código Java correspondente
public class NotaFiscal {private Collection <ItemNotaFiscal > i tensNotaF iscal ;. . .
}
public class ItemNotaFiscal {private NotaFiscal notaFiscal ;. . .
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 42 / 526
UML – Diagrama de Classe
Composição
Tipo especial de associação em que se deseja indicar umaideia de todo e parte
A parte não vive sem o todo
É representado por um losango preenchido ao lado daentidade que representa o todo
No exemplo abaixo, seria impossível existir umItemNotaFiscal sem estar vinculado a uma NotaFiscal
Ricardo Terra ([email protected]) POO 8 de julho de 2011 43 / 526
UML – Diagrama de Classe
Agregação
Tipo especial de associação em que se deseja indicar umaassociação mais forte
Contudo, a entidade agregada tem vida sozinha
É representado por um losango vazio ao lado da entidadeque representa o todo
No exemplo abaixo, um Motor está agregado a um Carro,mas é possível existir um motor sem estar em um carro
Ricardo Terra ([email protected]) POO 8 de julho de 2011 44 / 526
UML – Diagrama de Classe
MultiplicidadeA multiplicidade em uma associação indica o número deobjetos que um objeto da classe pode ter de uma outraclasse
Multiplicidades são números simples ou intervalos denúmeros
Tabela: Multiplicidade mais comuns
0..1 Uma instância opcional1 Exatamente uma instância
0..* Zero ou mais instâncias1..* Pelo menos uma instância
Ricardo Terra ([email protected]) POO 8 de julho de 2011 45 / 526
UML – Diagrama de Classe
Casamento Tradicional
Poliginia
Poliandria
???
Ricardo Terra ([email protected]) POO 8 de julho de 2011 46 / 526
UML – Diagrama de Classe
Classes AssociativasAlgumas associações de muitos para muitos exige anecessidade da criação de uma classe associativa entre asduas classes associadas
No exemplo abaixo existe a classe Paciente com seusatributos e a classe Exame com seus atributos. Dorelacionamento entre Paciente e Exame, tem-se a data darealização e o diagnóstico
Ricardo Terra ([email protected]) POO 8 de julho de 2011 47 / 526
UML – Diagrama de Classe
Generalização
Trata-se da ação de uma classe herdar toda a estrutura deuma outra classe
Uma subclasse sempre herda de sua superclasse:AtributosOperaçõesRelacionamentos
Uma subclasse pode:Adicionar atributos e operaçõesAdicionar relacionamentosSobrepor (override) operações herdadasSobrecarregar (overload) operações herdadas
A herança é completa, isto é, não tem como uma classeherdar somente certos atributos ou operações
Ricardo Terra ([email protected]) POO 8 de julho de 2011 48 / 526
UML – Diagrama de Classe
ContaCorrente e ContaPoupanca herdam ContaIsto é, são subclasses imediatas de Conta
Ricardo Terra ([email protected]) POO 8 de julho de 2011 49 / 526
UML – Diagrama de Classe
Classe AbstrataSe for um bom observador, percebeu que a classe Contano último slide estava em itálico
Isso indica que a classe é abstrata
Uma classe abstrata é uma classe que não tem instâncias
É utilizada somente como mecanismo de reúso e paraprovêr a capacidade polimórfica
Ricardo Terra ([email protected]) POO 8 de julho de 2011 50 / 526
UML – Diagrama de Classe
PacotesOs pacotes em um diagrama de classes são altamenteutilizados, pois, na implementação do sistema, aorganização das classes são sempre feitas utilizandopacotes
Ricardo Terra ([email protected]) POO 8 de julho de 2011 51 / 526
UML – Diagrama de Classe
Notas e comentáriosComo em qualquer diagrama UML, podem ser inseridosnotas e comentários
Ricardo Terra ([email protected]) POO 8 de julho de 2011 52 / 526
UML – Diagrama de Classe
CuidadoDiagrama de Classes não é um modelo ER
O maior perigo com os diagramas de classes é que vocêpode focar exclusivamente na estrutura e ignorar ocomportamento
Ricardo Terra ([email protected]) POO 8 de julho de 2011 53 / 526
UML – Diagrama de Classe
Exercício de Fixação 01
A gráfica ABC trabalha com diversos autores que escrevem oslivros que ela publica. Alguns autores escreveram apenas umlivro, enquanto outros já escreveram vários. Além disso, algunslivros foram escritos por vários autores, porém um livro devepossuir pelo menos um autor. A gráfica ABC trabalha tambémcom diversas impressoras, porém um livro só pode ser impressoem uma única impressora.
Deve ser possível buscar os livros de um autor, saber qual foi aimpressora em que o livro foi impresso, saber a quantidade depáginas que uma impressora já imprimiu e a quantidade depáginas que ela imprimiu de um determinado livro, entre outros.
Ricardo Terra ([email protected]) POO 8 de julho de 2011 54 / 526
UML – Diagrama de Classe
Exercício de Fixação 01 – Solução
Ricardo Terra ([email protected]) POO 8 de julho de 2011 55 / 526
UML – Diagrama de Classe
Exercício de Fixação 02
Um veículo tem chassi, modelo, peso, ano de fabricação. Umveículo não existe por si só, ele deve ser um avião ou um carro.Todo veículo liga e desliga. Um carro acelera e frea e um aviãodecola, voa e pousa.
Ricardo Terra ([email protected]) POO 8 de julho de 2011 56 / 526
UML – Diagrama de Classe
Exercício de Fixação 03
Um imóvel possui um endereço, área (em m2) e um proprietário. Oimóvel pode ser uma casa ou um apartamento. Caso seja casa,possuirá também o número do registro do lote e, caso sejaapartamento, possuirá o número do andar e um flag indicando sepossui ou não elevador. Um proprietário possui cpf, nome e telefone.Pelo menos, as seguintes operações devem existir:
Alterar a área de um imóvel
Alterar o proprietário de um imóvel
Alterar o flag se possui ou não elevador do apartamento
Recuperar a quantidade de imóveis de um proprietário
Alterar o telefone de um proprietário
PS: Atenção com os parâmetros e com o tipo de retorno das operações
Ricardo Terra ([email protected]) POO 8 de julho de 2011 57 / 526
UML – Diagrama de Classe
Exercício de Fixação 04Uma pessoa possui cpf e nome. Um professor é uma pessoa que também possui umatitulação e a IES (Instituição de Ensino Superior) vinculada. Um aluno também é umapessoa e possui a informação de qual período se encontra e qual o seu curso (um cursopossui um registro do MEC, um nome e sua área de concentração). Uma palestrapossui um nome e um assunto e pode ser ministrada por diversos professores. Para cadaprofessor ministrando cada palestra, deve constar a data e a localização (rua, número,bairro, cidade, estado e telefone) deste evento e, um aluno, pode assistir vários eventos.Pelo menos as seguintes operações devem existir:
Alterar a área de um imóvelAlterar o nome de uma pessoaAlterar a titulação de um professorAlterar a IES de um professorAlterar o período em curso de um alunoAlterar o curso de um alunoAlterar o registro do MEC de um cursoAlterar o nome de uma palestraAlterar a data de um eventoAlterar a localização de um eventoAlterar o telefone de uma localização
Ricardo Terra ([email protected]) POO 8 de julho de 2011 58 / 526
Conteúdo
1 Introdução
2 UML
3 JavaIntroduçãoTipos BásicosOperadoresComandos condicionaisComandos de repetiçãoArranjosMétodos
4 POO
5 Padrões de Projeto
6 Tópicos Relevantes
7 Materiais Complementares
8 ExtrasRicardo Terra ([email protected]) POO 8 de julho de 2011 59 / 526
Java – Introdução
Logo Mascote – Duke
Ricardo Terra ([email protected]) POO 8 de julho de 2011 61 / 526
Java – Introdução
ObjetivosApaixonar-se por Java
Diferenciar:Programação Estruturada (Pascal, C...)Programação Orientada a Objetos (Java, C++...)
Pré-requisitosLógica de Programação
Linguagem C
Ricardo Terra ([email protected]) POO 8 de julho de 2011 62 / 526
Java – Introdução
Edições Java
Java SE – Java Standard Edition (Versão Atual: 6)
www.oracle.com/technetwork/java/javase
Java EE – Java Enterprise Edition
www.oracle.com/technetwork/java/javaee
Java ME – Java Micro Edition
www.oracle.com/technetwork/java/javame
Ricardo Terra ([email protected]) POO 8 de julho de 2011 63 / 526
Java – Introdução
Tipos de Aplicações
AppletsAplicação que normalmente utiliza o navegador do clientepara prover a interface do usuárioProcessamento realizado no servidor
ApplicationsDispensa explicação
ServletsExecução em servidores webExemplos: JSP, JSF, Struts etc
MidletsExecução em pequenos dispositivos
PortletsExecução em portais
Ricardo Terra ([email protected]) POO 8 de julho de 2011 64 / 526
Java – Introdução
Falácias sobre JavaJava é muito fácil de aprender
Java é muito difícil de aprender
Java é um ambiente de programação
Todos os programas Java executam em páginas web
JavaScript é uma versão mais simples de Java
Java é interpretado e, portanto, muito lerdo paraaplicações sérias em uma plataforma específica
Leia artigo “Análise Comparativa do Código Gerado porCompiladores Java e C++” publicado no SBLP 2010
Ricardo Terra ([email protected]) POO 8 de julho de 2011 65 / 526
Java – Introdução
Principais Características da Linguagem Java
Compilação para bytecodes
Provê portabilidade (saberemos logo o porquê)
Suporte a multi-programação
Suporte a threads
OO
Segura
Não existe ponteirosGerência automática de memória (não existe mais malloc,free etc)
Eficiente
JIT Compiler, otimizações dinâmicas etc
Ricardo Terra ([email protected]) POO 8 de julho de 2011 66 / 526
Java – Introdução
Java SE – Componentes – Entendimento Visual
Ricardo Terra ([email protected]) POO 8 de julho de 2011 67 / 526
Java – Introdução
Java SE – ComponentesAPI – Application Programming Interface
Biblioteca com diversas classe e funções úteis para serutilizada no desenvolvimento de aplicações
JVM – Java Virtual MachineMáquina virtual em que a aplicação Java é executadaContém implementação de toda API Java
JRE – Java Runtime EnvironmentAmbiente de execução de aplicativos JavaContém a JVM
JDK – Java Development KitAmbiente de desenvolvimento de aplicativos Java(compilação, depuração etc)Contém o JRE
Ricardo Terra ([email protected]) POO 8 de julho de 2011 68 / 526
Java – Introdução
Ricardo Terra ([email protected]) POO 8 de julho de 2011 69 / 526
Java – Introdução
FuncionamentoCompilador
Entrada: código fonteSaída: bytecodes
BytecodesCódigo intermediário a ser interpretado pela JVMIndependente de plataforma
JVMClass Loader: carrega o bytecode para a memóriaBytecode Verifier: confere a consistência do bytecodeInterpreter: interpreta os bytecodes para código de máquina
Ricardo Terra ([email protected]) POO 8 de julho de 2011 70 / 526
Java – Introdução
Java SE – Funcionamento – Entendimento Visual
Ricardo Terra ([email protected]) POO 8 de julho de 2011 71 / 526
Java – Introdução
Hello Terra – Código
1 public class Hel loTer ra {
3 public s t a t i c void main( S t r i ng [ ] args ) {System . out . p r i n t l n ( " Hel lo Terra ! " ) ;
5 }
7 }
Hello Terra – Explicação Superficial
Case-sensitiveTodo o programa sensível a caixa: A 6= a
Método mainPonto de entrada de uma aplicação Java
System.out.println (sop)Impressão em tela
Ricardo Terra ([email protected]) POO 8 de julho de 2011 72 / 526
Java – Introdução
Compilação e Execução
Compilar: javac HelloTerra.java
Executar: java HelloTerra
No entanto, o Eclipse faz tudo para você sem que perceba =)
Ricardo Terra ([email protected]) POO 8 de julho de 2011 73 / 526
Java – Introdução
Java e outras linguagens
Linguagem realmente orientada por objetosMenos que Eiffel
Sintaxe muito baseada na sintaxe de Cif, switch, while, do..while, for ...
Tipos de dados básicos similares ao da linguagem C
Remoção de várias características perigosas de CPonteirosAritmética de ponteirosGerenciamento automático de memória (não existe maismalloc, free etc)
API bem completaWeb, GUI (Graphical User Interface), Networking etc
Ricardo Terra ([email protected]) POO 8 de julho de 2011 74 / 526
Java – Introdução
ClassesUma vez que vimos Diagrama de Classes, o entendimentofica fácil
Define um TAD (Tipo Abstrato de Dados)
Contém:atributos (propriedades)métodos (comportamento)
Ricardo Terra ([email protected]) POO 8 de julho de 2011 75 / 526
Java – Introdução
Classe Pessoa – Exemplo Simples
1 public class Pessoa {private S t r i ng nome;
3
public S t r i ng getNome( ) {5 return t h i s .nome;
}7
public void setNome( S t r i ng nome ) {9 t h i s .nome = nome;
}11
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 76 / 526
Java – Introdução
Estrutura de um Arquivo Java
Pacote
onde o arquivo se encontra
Importsdo que o arquivo necessita
Classe Pública
Apenas uma por arquivoDeve ter o mesmo nome do arquivo
Classes Não Públicas
Conceito Avançado (não veremos)
Ricardo Terra ([email protected]) POO 8 de julho de 2011 77 / 526
Java – Introdução
Estrutura de uma Classe JavaAtributos
propriedadesestáticos depois dinâmicos
Construtorescomo seus objetos são criadosordenados pela quantidade deparâmetros
Métodoscomportamentosestáticos depois dinâmicos
Ricardo Terra ([email protected]) POO 8 de julho de 2011 78 / 526
Java – Introdução
Classe Pessoa – Exemplo Mais Completo
package pojo ;2
import java . u t i l . Date ;4
public class Pessoa {6 public f i n a l s t a t i c S t r i ng ESPECIE = "Homo Sapiens " ;
private S t r i ng nome;8 private Date dataNascimento ;
10 public Pessoa ( ) { }
12 public Pessoa ( S t r i ng nome, Date dataNascimento) {t h i s .nome = nome;
14 t h i s . dataNascimento = dataNascimento ;}
16
public S t r i ng getNome( ) {18 return t h i s .nome;
}20 public void setNome( S t r i ng nome ) {
t h i s .nome = nome;22 }
public Date getDataNascimento ( ) {24 return t h i s . dataNascimento ;
}26 public void setDataNascimento ( Date dataNascimento ) {
t h i s . dataNascimento = dataNascimento ;28 }
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 79 / 526
Java – Introdução
ComentáriosAlgumas vezes se deseja explicar um código, explicitar umainformação em linguagem natural
Eles não deixam o programa mais lento e seu uso éaltamente recomendável
Três tipos:Comentário para bloco de linha (semelhante a C)/*
blablabla*/
Comentário até final de linha (semelhante a C)// blablabla
Comentário JavaDoc (gera manual do sistema)/*
@author Ricardo Terra
*/
Ricardo Terra ([email protected]) POO 8 de julho de 2011 80 / 526
Java – Introdução
Classe Matematica – Exemplo Comentário
1 /∗∗∗ Classe com atr ibutos e operacoes matematicas
3 ∗ @author Ricardo Terra∗/
5 public class Matematica {/∗∗
7 ∗ Atr ibuto P I com apenas 6 casas decimais∗/
9 public s t a t i c f i n a l double P I = 3.141569; // Constante P I
11 /∗∗∗ Metodo que calcula a area de uma circunferencia
13 ∗ @param raio Raio da circunferencia∗ @return Area da Circunferencia
15 ∗/public s t a t i c double areaCircunferencia ( double ra io ) {
17 /∗∗ A funcao pow da classe Math eleva a uma potencia ,
19 ∗ no caso ao quadrado∗/
21 return P I ∗ Math .pow( raio , 2 ) ;}
23
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 81 / 526
Java – Introdução
Classe Matematica – JavaDoc gerado
Ricardo Terra ([email protected]) POO 8 de julho de 2011 82 / 526
Java – Introdução
Padrões BluePrintsNomes de classes
CamelCase com primeira letra em caixa altaEx: Animal, AnimalSelvagem, GuardaChuva ...
Nome de identificadores, atributos ou métodosCamelCase com primeira letra em caixa baixaEx: nome, nomeCompleto, comer(), comerMuito() ...
Nome de pacotesSempre em caixa baixaEx: com.terra.pojo, com.terra.dataaccessobject ...
Evitem caracteres especiais:_, -, ç, ã, á, ê, é ...
Ricardo Terra ([email protected]) POO 8 de julho de 2011 83 / 526
Java – Tipos Básicos
IdentificadoresAtribuição como em C
int valor;
double saldo = 324.20;
Declaração de uma variável pode ocorrer em qualquerlocal, evidentemente, antes do uso
Diferentemente de C, Pascal, Object Pascal ...
Regras de identificadorPrimeiro caracter deve ser letra, _ ou $
São case-sensitive
Logicamente, identificadores deve ser diferente daspalavras reservadas da linguagem
6= de for, while, int ...
Ricardo Terra ([email protected]) POO 8 de julho de 2011 85 / 526
Java – Tipos Básicos
Tipos Primitivosboolean (1 bit)→ true e false
char (16 bits sem sinal)→ 0 a 65535
byte (8 bits)→ -128 a 127
short (16 bits)→ -32768 a 32767
int (32 bits)→ −231 a 231 − 1
long (64 bits)→ −263 a 263−1
float (32 bits)→ −1.40239846e−46 a 3.40282347e38
double (64 bits)→ −4.94065645841246544e−324 a 1.7976931348623157e308
Qualquer outro tipo não citado acima são classesPor exemplo, String, Date são classes
Ricardo Terra ([email protected]) POO 8 de julho de 2011 86 / 526
Java – Tipos Básicos
Exemplo – Observando Limites
public s t a t i c void main( S t r i ng [ ] args ) {2 System . out . p r i n t f ( " boolean : %b e %b\n " , Boolean . TRUE , Boolean . FALSE ) ;
4 System . out . p r i n t f ( " char : %d e %d\n " , ( i n t ) Character . MIN_VALUE , ( i n t ) Character .MAX_VALUE ) ;
6 System . out . p r i n t f ( " byte : %d e %d\n " , Byte . MIN_VALUE , Byte .MAX_VALUE ) ;System . out . p r i n t f ( " shor t : %d e %d\n " , Short . MIN_VALUE , Short .MAX_VALUE ) ;
8 System . out . p r i n t f ( " i n t : %d e %d\n " , Integer . MIN_VALUE , Integer .MAX_VALUE ) ;System . out . p r i n t f ( " long : %d e %d\n " , Long . MIN_VALUE , Long .MAX_VALUE ) ;
10
System . out . p r i n t f ( " f loat : %g e %g\n " , F loat . MIN_VALUE , F loat .MAX_VALUE ) ;12 System . out . p r i n t f ( " double : %g e %g\n " , Double . MIN_VALUE , Double .MAX_VALUE ) ;
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 87 / 526
Java – Tipos Básicos
Tipo char
Representa um caractere UNICODEhttp://www.tamasoft.co.jp/en/general-info/unicode.html
Intervalo de 0 a 255 semelhante à tabela ASCII
Atribuição:‘a’, ‘\u0040’ ou número
Exemplo
1 public s t a t i c void main( S t r i ng [ ] args ) {char ch = ’a’ ;
3 System . out . p r i n t l n ( ch ) ; /∗ a ∗/
5 ch = ’\u0040 ’ ;System . out . p r i n t l n ( ch ) ; /∗ @ ∗/
7
ch = 98;9 System . out . p r i n t l n ( ch ) ; /∗ b ∗/
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 88 / 526
Java – Tipos Básicos
Exemplo – Imprimindo Tabela Ascii
public s t a t i c void main( S t r i ng [ ] args ) {2 f o r ( char ch = 0; ch < 255; ch++ ) {
System . out . p r i n t f ( "%d: %c\n " , ( i n t ) ch , ch ) ;4 }
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 89 / 526
Java – Tipos Básicos
Tipos inteiros – byte, short, int e long
Por que não simplificar e utilizar somente long?
Modo octal e hexadecimal de atribuição:Quando se insere 0 antes do número indica base octalEx: 011 equivale a 9
Quando se insere 0x antes do número indica basehexadecimalEx: 0x18 equivale a 24
Atribuir valores fora do limite requer cast, contudo não ativaexceção (nomenclatura de Java para erro)
Ex: byte b = (byte) 128 atribui -128 a b
Divisão por 0 ativa exceção (ArithmeticException)Ex: int i = 2/0 ativa exceção em tempo de execução(não em compilação)
Ricardo Terra ([email protected]) POO 8 de julho de 2011 90 / 526
Java – Tipos Básicos
Exemplo – Atribuição
1 public s t a t i c void main( S t r i ng [ ] args ) {i n t i 1 = 17;
3 i n t i 2 = 021;i n t i 3 = 0x11 ;
5
System . out . p r i n t f ( "%d %d %d" , i1 , i2 , i 3 ) ;7 }
Pergunta-se
Qual a saída?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 91 / 526
Java – Tipos Básicos
Tipos de Ponto Flutuante – float e double
float→ precisão simplesNúmero deverá conter o pós-fixo f ou FEx: float f = 9.02f ou float f = 9.02F
double→ precisão duplaAtribuição normal: double d = 9.02
Se desejar, número pode conter o pós-fixo g ou GEx: double d = 9.02g ou double d = 9.02G
Pode-se utilizar notação exponecialEx: double d = 3.02e2 ou double d = 2.56E-3
Não gera exceção em caso de divisão por 01/0 gera ∞-1/0 gera −∞0/0 gera NaN
Ricardo Terra ([email protected]) POO 8 de julho de 2011 92 / 526
Java – Tipos Básicos
Exemplo – Atribuição
1 public s t a t i c void main( S t r i ng [ ] args ) {f l o a t f = 3.01 f ;
3 double d1 = −3.01;double d2 = 3.564e+2;
5
System . out . p r i n t f ( "%g %g %g\n " , f , d1 , d2 ) ;7
double d3 = 1 .0/0 ;9 double d4 = 0 .0/0 ;
System . out . p r i n t f ( "%g %g\n " , d3 , d4 ) ;11 }
Pergunta-se
Qual a saída?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 93 / 526
Java – Tipos Básicos
Conversão e Promoção
Promoção implícita (feita automaticamente)Por exemplo, de int para float
Conversão explícita (feita via cast)Por exemplo, de double para int
Quando se trabalha com operações com diversos tipos devariáveis, o valor é promovido para a de maiorcomplexidade
Exceto, em operações entre variáveis inteiras inferiores aoint em que todos os valores são promovidos para intautomaticamente
Ricardo Terra ([email protected]) POO 8 de julho de 2011 94 / 526
Java – Tipos Básicos
Exemplo
1 public s t a t i c void main( S t r i ng [ ] args ) {byte b = ( byte ) 264; /∗ Conversao Forcada ∗/
3 System . out . p r i n t l n ( b ) ;
5 shor t s = ( shor t ) 3 . 5 ; /∗ Conversao Forcada ∗/System . out . p r i n t l n ( s ) ;
7
i n t i = b + s ; /∗ b e s se promovem para operar ∗/9 System . out . p r i n t l n ( i ) ;
11 f l o a t f = 3; /∗ Promocao Impl ic i ta ∗/System . out . p r i n t l n ( f ) ;
13
double d = 3 / 2 ; /∗ Promocao Impl ic i ta do Resultado ∗/15 System . out . p r i n t l n ( d ) ;
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 95 / 526
Java – Tipos Básicos
Constantes caractere de barra invertidaPara a maioria dos caracteres, as aspas simples funcionambem, porém para enter, tab, esc seria bem complicadorepresentá-los, uma vez que são teclas de ação. Por isto,Java definiu as constantes especiais de barra invertida
Constantes especiais mais utilizadas\n Nova Linha
\r Retorno de Carro (CR)
\t Tabulação horizontal
\’ Aspas Simples
\" Aspas Duplas
\\ Barra Invertida
Ricardo Terra ([email protected]) POO 8 de julho de 2011 96 / 526
Java – Operadores
Quatro classes de operadores:Aritméticos
Relacionais
Lógicos
Bit a bit
Ricardo Terra ([email protected]) POO 8 de julho de 2011 98 / 526
Java – Operadores
Tabela de Prioridades
Ricardo Terra ([email protected]) POO 8 de julho de 2011 99 / 526
Java – Operadores
Operadores Artiméticos+
-
∗
/
% (corresponde ao mod do Pascal)
Ricardo Terra ([email protected]) POO 8 de julho de 2011 100 / 526
Java – Operadores
Prioridades e Associatividades normaisParênteses mudam as prioridades
2 + 2 * 4 != (2 + 2) * 4
Operador /
Operando inteiros:
Divisão Inteira: (7 / 2 = 3)
Pelo menos um ponto flutuante:Divisão Fracionária:
7.0 / 2.0 = 3.5
7.0 / 2 = 3.5
7 / 2.0 = 3.5
Operador %
Resto de divisão inteiraEx: 4 % 2 = 0 e 5 % 2 = 1
Ricardo Terra ([email protected]) POO 8 de julho de 2011 101 / 526
Java – Operadores
Operadores Aritméticos em Atribuições Compostas
Em geral, os operadores aritméticos possuem um operadorde atribuição correspondente:
Exemplo:
A = A + 2 ↔ A += 2
Outros:-=
*=
/=
%=
Ricardo Terra ([email protected]) POO 8 de julho de 2011 102 / 526
Java – Operadores
Exemplo de operadores de atribuição compostos
public s t a t i c void main( S t r i ng [ ] args ) {2 i n t valor = 10;
4 valor += 10;System . out . p r i n t f ( "%d" , valor ) ; /∗ valor : 20 ∗/
6
valor −= 10;8 System . out . p r i n t f ( "%d" , valor ) ; /∗ valor : 10 ∗/
10 valor ∗= 5;System . out . p r i n t f ( "%d" , valor ) ; /∗ valor : 50 ∗/
12
valor /= 10;14 System . out . p r i n t f ( "%d" , valor ) ; /∗ valor : 5 ∗/
16 valor %= 3;System . out . p r i n t f ( "%d" , valor ) ; /∗ valor : 2 ∗/
18 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 103 / 526
Java – Operadores
Operadores Aritméticos de incremento e decremento++ (incrementa 1)
-- (decrementa 1)
Exemplos:A = A + 1 ↔ A += 1 ↔ A++ ↔ ++A
A = A - 1 ↔ A -= 1 ↔ A-- ↔ --A
Posicionamento (vale para ++ e para --)++ após a variável:
pós-incremento (retorna e incrementa)
++ antes da variável:
pré-incremento (incrementa e retorna)
Ricardo Terra ([email protected]) POO 8 de julho de 2011 104 / 526
Java – Operadores
Exemplos
1 i n t i = 0;System . out . p r i n t f ( "%d" , i ++);System . out . p r i n t f ( "%d" , i ) ;System . out . p r i n t f ( "%d" , −− i ) ;
2 i n t i = 0;System . out . p r i n t f ( "%d" , ++ i ) ;System . out . p r i n t f ( "%d" , i ) ;System . out . p r i n t f ( "%d" , i −−);System . out . p r i n t f ( "%d" , i ) ;
Pergunta-se
Qual a saída de cada printf?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 105 / 526
Java – Operadores
Entendeu mesmo?
1 public s t a t i c void main( S t r i ng [ ] args ) {i n t i = 0;
3 System . out . p r i n t f ( "%d" , i ++ ) ;System . out . p r i n t f ( "%d" , i−− ) ;
5 System . out . p r i n t f ( "%d" , −− i ) ;System . out . p r i n t f ( "%d" , i ) ;
7
i = 6;9 System . out . p r i n t f ( "%g" , ++ i / 2.0 ) ;
}
Pergunta-se
Qual a saída de cada printf?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 106 / 526
Java – Operadores
Operadores Relacionais:== (comparação)
!= (diferença)
< > <= >=
Operadores Lógicos:
São eles: & (and), | (or) e ! (not)
Normalmente, para and e or, utiliza-se operadores de curtocircuito que fazem com que a expressão só seja analisadaaté que seja possível determinar o resultado
São eles: && (and) e || (or)
Ricardo Terra ([email protected]) POO 8 de julho de 2011 107 / 526
Java – Operadores
Operadores Lógicos de Curto Circuito
Ao encontrarem um valor que determine seu resultado, nãotestam mais as outras condições, isto é, a expressão só seráanalisada até que seja possível determinar o resultado
Exemplo: considere que os métodos a e b retornem booleanoa() & b()→ executa os dois métodos para obter oresultado
a() | b()→ executa os dois métodos para obter oresultado
a() && b()→ se o método a retornar false, o resultadoserá false e o método b nem será executado
a() || b()→ se o método a retornar true, o resultadoserá true e o método b nem será executado
Ricardo Terra ([email protected]) POO 8 de julho de 2011 108 / 526
Java – Operadores
Entendeu mesmo?
private s t a t i c boolean a ( ) { return fa lse ; }2
private s t a t i c boolean b ( ) { return true ; }4
private s t a t i c boolean c ( ) { return fa lse ; }6
private s t a t i c boolean d ( ) { return true ; }8
public s t a t i c void main( S t r i ng [ ] args ) {10 System . out . p r i n t f ( "%d" , a ( ) & b ( ) & c ( ) & d ( ) ) ;
System . out . p r i n t f ( "%d" , a ( ) && b ( ) && c ( ) && d ( ) ) ;12 System . out . p r i n t f ( "%d" , a ( ) || b ( ) || c ( ) || d ( ) ) ;
}
Pergunta-se
Quais métodos serão executados e qual o retorno dos printf’sdas linhas 10, 11 e 12?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 109 / 526
Java – Operadores
Tiro no pé!
1 public s t a t i c void main( S t r i ng [ ] args ) {i n t a = 0;
3 i f ( a != 0 & 2 / a > 5 ) {System . out . p r i n t l n ( "OK" ) ;
5 } else {System . out . p r i n t l n ( "NOK" ) ;
7 }}
Pergunta-se
O programa acima apresenta um erro fatal. Como evitá-lo?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 110 / 526
Java – Operadores
Operadores bit a bit:& (and)
Ex: 3 & 1 ↔ 0011 & 0001 ↔ 0001 ↔ 1
| (or)Ex: 3 | 1 ↔ 0011 | 0001 ↔ 0011 ↔ 3
ˆ (xor)Ex: 3 ˆ 1 ↔ 0011 ˆ 0001 ↔ 0010 ↔ 2
Ricardo Terra ([email protected]) POO 8 de julho de 2011 111 / 526
Java – Operadores
Operadores bit a bit:~ (complemento de um)
Ex: 3 ↔ ˜0011 ↔ 1100 ↔ 12
<< (deslocamento à esquerda)Ex: 4 << 1 ↔ 0100 << 1 ↔ 1000 ↔ 8
>> (deslocamento à direita)Ex: 4 >> 1 ↔ 0100 >> 1 ↔ 0010 ↔ 2
>>> (deslocamento à direita com sinal)Ex: -127 >>> 1 ↔ 2147483584
Ricardo Terra ([email protected]) POO 8 de julho de 2011 112 / 526
Java – Operadores
Desafio
public s t a t i c void main( S t r i ng [ ] args ) {2 i n t x = 10 , y = −2;
4 System . out . p r i n t l n ( (−2 ∗ −1) << 3 ) ;
6 System . out . p r i n t l n ( ++x − −−y + ( ( x >> 3) << 2) ) ;
8 System . out . p r i n t l n ( (x % 5) << ( (4 % 2) + 4) ) ;}
Pergunta-se
Qual a saída de cada printf?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 113 / 526
Java – Operadores
Exercícios10 & 13 ?
10 | 13 ?
10 ˆ 13 ?
0 ?
8 » 1 ?
2 « 2 ?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 114 / 526
Java – Comandos condicionais
Comandos condicionais (if, switch e operador ternário)Comando condicionais são aqueles que dependendo deuma condição executam um bloco, caso a condição nãoseja atendida, o bloco não será executado
Java provê suporte a três comandos condicionais:
if
switch
operador ternário (? :)
Ricardo Terra ([email protected]) POO 8 de julho de 2011 116 / 526
Java – Comandos condicionais
Comandos condicionais - ifSintaxe do comando if
i f ( condicao ) {comando1;comando2;comando3;
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 117 / 526
Java – Comandos condicionais
Observações:
Os parênteses que envolvem a condição sãoOBRIGATÓRIOS
Diferentemente de Pascal, Delphi (Object Pascal) etc
A condição deverá retornar um tipo booleano
Os comandos somente serão executados se a condição forverdadeira
Ricardo Terra ([email protected]) POO 8 de julho de 2011 118 / 526
Java – Comandos condicionais
Comandos condicionais - if
O uso dos braços NÃO é obrigatório caso seja apenas umúnico comando
Porém, a boa prática recomenda a utilização de braçosindependente do número de comandos
Melhor indentação do código
i f ( t rue ) comando;
equivale a:
i f ( t rue ) {comando;
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 119 / 526
Java – Comandos condicionais
Comandos condicionais - ifComo faço o conhecido:
se verdade então . . . senão . . .
i f ( condicao ) {comando1;comando2;comando3;
} else {comando4;comando5;comando6;
}
Pergunta-se
Quais comandos serão executados se a condição forverdadeira? E se for falsa?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 120 / 526
Java – Comandos condicionais
Comandos condicionais - if
1 i n t a = Teclado . le r In teger ( " D ig i te a" ) ;i n t b = Teclado . le r In teger ( " D ig i te b" ) ;
3
i f ( a >= b ) {5 System . out . p r i n t f ( "%d e maior ou igual a %d! " , a, b ) ;
} else {7 System . out . p r i n t f ( "%d e menor que %d! " , a, b ) ;
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 121 / 526
Java – Comandos condicionais
Comandos condicionais - ifComando if podem ser aninhados
1 i n t nota = Teclado . le r In teger ( " D ig i te uma nota de 0 a 100 " ) ;
3 i f ( nota >= 90 ) {System . out . p r i n t l n ( " Nota A" ) ;
5 } else i f ( nota >= 80 ) {System . out . p r i n t l n ( " Nota B " ) ;
7 } else i f ( nota >= 70 ) {System . out . p r i n t l n ( " Nota C" ) ;
9 } else {System . out . p r i n t l n ( "Reprovado" ) ;
11 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 122 / 526
Java – Comandos condicionais
Exemplo if
char op = Teclado . lerChar ( " D ig i te um operador (+−/∗) " ) ;2
i f ( op == ’+ ’ || op == ’−’ ) {4 System . out . p r i n t l n ( "Op. Baixa Prior idade .\n " ) ;
} else i f ( op == ’ / ’ || op == ’∗ ’ ) {6 System . out . p r i n t l n ( "Op. Alta Pr ior idade .\n " ) ;
} else {8 System . out . p r i n t l n ( " Caractere Inval ido !\n " ) ;
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 123 / 526
Java – Comandos condicionais
Comandos condicionais - switchNa instrução switch, uma variável de tipo primitivo char ouint é comparada com cada valor em questão. Se umvalor coincidente é achado, a instrução (ou instruções)depois do teste é executada
Sintaxe:
switch ( var iavel ) {case 1: comandoA; break ;case 2: comandoB; break ;case 3: comandoC; break ;default : comandoPadrao;
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 124 / 526
Java – Comandos condicionais
Comandos condicionais - switchSe nenhum valor for encontrado, a instrução default éexecutada
O comando break é necessário para quebrar o switch,pois assim que encontrada a opção correta, é executadotudo em seguida
Ricardo Terra ([email protected]) POO 8 de julho de 2011 125 / 526
Java – Comandos condicionais
Comandos condicionais - switch
char l e t ra = ’B ’ ;2
switch ( le t ra ) {4 case ’A’ : System . out . p r i n t l n ( " Entrou em A" ) ; break ;
case ’B ’ : System . out . p r i n t l n ( " Entrou em B " ) ;6 case ’C’ : System . out . p r i n t l n ( " Entrou em C" ) ; break ;
case ’D’ : System . out . p r i n t l n ( " Entrou em D" ) ; break ;8 default : System . out . p r i n t l n ( " Entrou em Default " ) ;
}
Pergunta-se
Qual a saída?
E se o valor de letra fosse ’C’? E se fosse ’a’?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 126 / 526
Java – Comandos condicionais
Comandos condicionais - switch
char l e t ra = ’B ’ ;2
switch ( le t ra ) {4 default : System . out . p r i n t l n ( " Entrou em Default " ) ;
case ’A’ : System . out . p r i n t l n ( " Entrou em A" ) ; break ;6 case ’B ’ : System . out . p r i n t l n ( " Entrou em B " ) ; break ;
case ’C’ : System . out . p r i n t l n ( " Entrou em C" ) ; break ;8 case ’D’ : System . out . p r i n t l n ( " Entrou em D" ) ; break ;
}
Pergunta-se
Qual a saída?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 127 / 526
Java – Comandos condicionais
Comandos condicionais - switch
char l e t ra = ’b’ ;2
switch ( le t ra ) {4 case ’A’ : System . out . p r i n t l n ( " Entrou em A" ) ; break ;
case ’B ’ : System . out . p r i n t l n ( " Entrou em B " ) ; break ;6 default : System . out . p r i n t l n ( " Entrou em Default " ) ;
case ’C’ : System . out . p r i n t l n ( " Entrou em C" ) ; break ;8 case ’D’ : System . out . p r i n t l n ( " Entrou em D" ) ; break ;
}
Pergunta-se
Qual a saída?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 128 / 526
Java – Comandos condicionais
Exemplo switch
char op = Teclado . lerChar ( " D ig i te um operador (+−/∗) " ) ;2
switch (op) {4 case ’+ ’ :
case ’−’ : System . out . p r i n t l n ( "Op. Baixa Prior idade .\n " ) ; break ;6 case ’∗ ’ :
case ’ / ’ : System . out . p r i n t l n ( "Op. Alta Pr ior idade .\n " ) ; break ;8 default : System . out . p r i n t l n ( " Caractere Inval ido !\n " ) ;
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 129 / 526
Java – Comandos condicionais
Comandos condicionais - Operador TernárioExistem situações cujo uso do if não é “elegante”
Por exemplo, suponha que a função max retorne o maiornúmero dentre os dois passados via parâmetros formais
private s t a t i c i n t max( i n t a, i n t b ) {2 i f ( a > b ) {
re turn a;4 } else {
re turn b;6 }
}8
public s t a t i c void main( S t r i ng [ ] args ) {10 System . out . p r i n t f ( "%d" , max( 3 , 7 ) ) ;
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 130 / 526
Java – Comandos condicionais
Comandos condicionais - Operador TernárioO operador ternário é uma expressão, significando que eledevolve um valor
O operador ternário é muito útil para condicionais (curtas esimples) e tem o seguinte formato:
variável = <condição> ? seTrue : seFalse;
A condição pode estar envolvida entre parênteses parafacilitar a leitura, contudo não é obrigatório
Ricardo Terra ([email protected]) POO 8 de julho de 2011 131 / 526
Java – Comandos condicionais
Exemplos:
i n t a = 2;i n t b = 3;i n t c = ( a > b ) ? a : b;
Indica que se a for maior que b, c recebe o valor de a, casocontrário, c recebe o valor de b, isto é, c recebe o maiorvalor (a ou b)
Pergunta-se
Qual o valor das variáveis abaixo:i n t peso = ( 2 != 2 ) ? 80 : 63;
char l e t ra = ( 1 == 1 ) ? ’R ’ : ’ T ’ ;
S t r i ng r e s u l t = ( max( a, b ) > 10 ) ? "a ou b > 10 " : "a e b < 10 " ;
Ricardo Terra ([email protected]) POO 8 de julho de 2011 132 / 526
Java – Comandos condicionais
Comandos condicionais - Operador TernárioNão necessariamente o retorno do operador ternário deveser atribuído a uma variável
Por exemplo, seu retorno pode ser o retorno de uma funçãocomo faz a função max com operador ternário:
private s t a t i c i n t max( i n t a, i n t b ) {return (a > b) ? a : b;
}
Ou mesmo o retorno pode servir como parâmetro dechamada de uma função:
System . out . p r i n t l n ( (a > b) ? "a maior ! " : "b maior ! " ) ;System . out . p r i n t f ( "%d" , (a > b) ? a : b ) ;
Ricardo Terra ([email protected]) POO 8 de julho de 2011 133 / 526
Java – Comandos de repetição
Comandos repetição (while, do...while e for)
Comandos de repetição são utilizados para repetir umbloco de código
Java provê suporte a três comandos de repetição:
while (enquanto)
do...while (faça...enquanto)
for (para)
Ricardo Terra ([email protected]) POO 8 de julho de 2011 135 / 526
Java – Comandos de repetição
Comandos repetição - while
O comando while é utilizado para repetir um bloco deacordo com uma condição
É considerado um loop de pré-teste
Isto é, testa a condição antes de executar o bloco
Sintaxe:
while ( condicao ) {comando1;comando2;comandoN;
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 136 / 526
Java – Comandos de repetição
Comandos repetição - while
i n t i = 0 ;
while ( i < 10 ) {System . out . p r i n t f ( "%d" , ++ i ) ;
}
Pergunta-se
Qual a saída?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 137 / 526
Java – Comandos de repetição
Comandos repetição - do...while
O comando do...while é semelhante ao while, contudoé um comando de repetição de pós-teste
Isto é, somente ao final da execução do bloco que severifica a condição
Geralmente, é utilizado quando se deseja testar acondição somente a partir da segunda iteração
Por exemplo, uma leitura da opção de um menu. Pede paradigitar uma primeira vez. Somente se não digitar uma opçãoválida que pede para digitar novamente
Ricardo Terra ([email protected]) POO 8 de julho de 2011 138 / 526
Java – Comandos de repetição
Sintaxe:
do {comando1;comando2;comandoN;
} while ( condicao ) ;
Observe o ponto-e-vírgula após os parênteses da condição. Não o esqueça!
Ricardo Terra ([email protected]) POO 8 de julho de 2011 139 / 526
Java – Comandos de repetição
Comandos repetição - do...while
1 i n t i = 0 ;
3 do {System . out . p r i n t f ( "%d" , ++ i ) ;
5 } while ( 1 != 1 ) ;
Pergunta-se
Qual a saída?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 140 / 526
Java – Comandos de repetição
Exemplo
i n t i ;2
do {4 i = Teclado . le r In teger ( " D ig i te um numero entre 0 e 10: " ) ;
} while ( i < 0 || i > 10 ) ;6
System . out . p r i n t f ( "Numero digitado : %d\n " , i ) ;
Pergunta-se
Qual a saída?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 141 / 526
Java – Comandos de repetição
Comandos de repetição - for
Comando de repetição mais poderoso da linguagem
É composta por:Inicialização: executado uma única vez no início do loop
Condição: executado sempre antes de cada iteração. Severdadeira, o bloco é executado. Se falsa, é finalizado
Operação : executado sempre ao término de cada iteração
Sintaxe
f o r ( i n ic ia l i zacao ; condicao ; operacao ) {comando1;comando2;. . .
comandoN;}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 142 / 526
Java – Comandos de repetição
Exemplo
f o r ( i n t i = 0 ; i < 10; i ++ ) {2 System . out . p r i n t f ( "%d" , i ) ;
}
Pergunta-se
Qual a saída?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 143 / 526
Java – Comandos de repetição
SintaxeNo laço for, a inicialização, condição e operação sãotodas opcionais
Exemplo
i n t i = 0 ;2
f o r ( ; ; ) { /∗ Sem condicao , admite−se sempre verdade ∗/4 System . out . p r i n t f ( "%d" , ++ i ) ;
}
Pergunta-se
Qual a saída?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 144 / 526
Java – Comandos de repetição
Comandos de repetição - for
Podemos ter um for dentro de outro, e outro dentro deoutro, e outro dentro de outro...
f o r ( i n t i = 0 ; i <= 2 ; i ++ ) {2 f o r ( i n t j = 0 ; j < 2 ; j ++ ) {
System . out . p r i n t f ( "%d %d" , i , j ) ;4 }
}
Pergunta-se
Qual a saída?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 145 / 526
Java – Comandos de repetição
Comandos de repetição - for
Um comando for pode ter várias inicializações, umacondição complexa e várias operações
Exemplo
f o r ( i n t i = 1 , d = 2 ∗ i ; i <= 10 || d == 22; i ++ , d = i ∗ 2 ) {2 System . out . p r i n t f ( "%d − %d\n " , i , d ) ;
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 146 / 526
Java – Comandos de repetição
Comando break
Inserido dentro de um bloco de repetição (pode tambémser while ou do...while)
Caso seja executado, o bloco de repetição é finalizado
Exemplo
i n t i = 0 ;2
f o r ( ; i < 10; i ++ ) {4 i f ( i == 3 ) {
break ;6 }
System . out . p r i n t f ( "%d" , i ) ;8 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 147 / 526
Java – Comandos de repetição
Comando continue
Inserido dentro de um bloco de repetição
Caso seja executado, a iteração atual do bloco derepetição é interrompida e parte para a próxima iteração
Exemplo
1 f o r ( i n t i = 0 ; i < 10; i ++ ) {i f ( i == 3 || i == 5 ) {
3 continue ;}
5 System . out . p r i n t f ( "%d" , i ) ;}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 148 / 526
Java – Comandos de repetição
Comando de repetição - for
Logicamente, pode-se utilizar break e continueconjuntamente
Exemplo
1 f o r ( i n t i = 0 ; i < 3 ; i ++ ) {i f ( i == 1 ) {
3 continue ;}
5 f o r ( i n t j = 0 ; j < 2 ; j ++ ) {System . out . p r i n t f ( "%d %d\n " , i , j ) ;
7 break ;}
9 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 149 / 526
Java – Comandos de repetição
Comando de repetição rotulados
Como Java não possui a instrução goto, ele permite querotule um loop com um nome e assim aplique operaçõescomo break e continue sobre um loop específico, isto é,que não seja o mais interno
Por exemplo, dependendo uma certa condição de umbloco mais interno, você quer quebrar ou continuar a partirdo bloco mais externo
Ricardo Terra ([email protected]) POO 8 de julho de 2011 150 / 526
Java – Comandos de repetição
Exemplo
externo :2 f o r ( i n t i = 0 ; i < 3 ; i ++ ) {
f o r ( i n t j = 0 ; j < 3 ; j ++ ) {4 i f ( i == 1 && j == 1 ) {
break externo ;6 }
System . out . p r i n t f ( "%d %d\n " , i , j ) ;8 }
}
Pergunta-se
Qual a saída?
E se fosse simplesmente break?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 151 / 526
Java – Comandos de repetição
Comandos de repetição – foreach
Existe uma sintaxe para o comando for específica paraiteração de arranjos, coleções etc
Esse for é conhecido como foreach e é abordado logoque falarmos sobre arranjos
Ricardo Terra ([email protected]) POO 8 de julho de 2011 152 / 526
Java – Arranjos
Arranjos - ConceitoArranjos – também conhecidos como vetor, array etc – sãocoleções de um mesmo tipo em sequência
Arranjos podem ser de tipos primitivos (char, int, float,double), de objetos, de um outro arranjo, de enumeração...
Pode se ter um arranjo de inteiros ou um arranjo decaracteres ou um arranjo de arranjo de pontos flutuantes
Contudo, não se pode ter um arranjo que contenha inteirose pontos flutuantes
Ricardo Terra ([email protected]) POO 8 de julho de 2011 154 / 526
Java – Arranjos
Arranjos - Declaração
Declaração:i n t notas [ ] ; /∗ Arranjo de i n t e i r o s ∗/char l e t r a s [ ] ; /∗ Arranjo de caracteres ∗/S t r i ng nomes [ ] ; /∗ Arranjo de s t r i n g s ∗/
A ordem dos colchetes não importa, só não pode ser antesdo tipo:
S t r i ng nomes [ ] ;S t r i ng [ ]nomes;S t r i ng [ ] nomes;[ ] S t r i ng nomes; /∗ ERRADO ∗/
Observe que isso é só a declaração, isto é, não é alocadoespaço algum para os elementos do arranjo
Ricardo Terra ([email protected]) POO 8 de julho de 2011 155 / 526
Java – Arranjos
Arranjos - Instanciação
Instanciação utilizando o operador new:i n t notas [ ] = new i n t [ 5 ] ; /∗ Alocado 5 i n t e i r o s ∗/char l e t r a s [ ] = new char [ 1 0 ] ; /∗ Alocado 10 caracteres ∗/S t r i ng nomes[ ] = new St r ing [ 100 ] ; /∗ Alocado 100 s t r i n g s ∗/
Ao contrário de linguagens como C, os elementos doarranjo SÃO inicializados automaticamente como a seguir:
Inteiros Flutuantes Boolean ObjetosInicializadoscom:
0 0.0 false null
Ricardo Terra ([email protected]) POO 8 de julho de 2011 156 / 526
Java – Arranjos
Arranjos - Instanciação
Pode-se inicializar um arranjo já inserindo valores:i n t notas [ ] = { 1 , 2 , 3 , 4 , 5 } ;char l e t r a s [ ] = { ’A’ , ’B ’ , ’C’ } ;S t r i ng nomes[ ] = { " Ricardo " , " V i r g í l i o " , " Ralph " } ;
A notação acima é mais simples, contudo pode ser maisformal:
i n t notas [ ] = new i n t [ ] { 1 , 2 , 3 , 4 , 5 } ;char l e t r a s [ ] = new char [ ] { ’A’ , ’B ’ , ’C’ } ;S t r i ng nomes[ ] = new St r ing [ ] { " Ricardo " , " V i r g í l i o " , " Ralph " } ;
Ricardo Terra ([email protected]) POO 8 de julho de 2011 157 / 526
Java – Arranjos
Arranjos - Declaração
Um arranjo de tamanho n, tem suas posições indexadas de0 a n-1. Exemplo:
i n t notas [ ] = {8 ,7 ,8 ,9 ,3 } ;notas [ 3 ] = 7 ;System . out . p r i n t f ( "%d" , notas [ 4 ] ) ;
Para obter o tamanho de um arranjo, basta utilizar oatributo lenght. Exemplo:
i n t tam = notas . length ;
Caso se indexe uma posição não válida, uma exceção emtempo de execução (ArrayIndexOutOfBoundsException)é ativada e possivelmente o aplicativo será abruptamenteencerrado
Veremos exceções mais a frente
Ricardo Terra ([email protected]) POO 8 de julho de 2011 158 / 526
Java – Arranjos
Declarando, inicializando e iterando um arranjo de inteiros
1 i n t notas [ ] = new i n t [ 5 ] ;
3 f o r ( i n t i = 0 ; i < notas . length ; i ++ ) {notas [ i ] = Teclado . le r In teger ( " D ig i te notas [ " + i + " ] " ) ;
5 }
7 f o r ( i n t i = 0 ; i < notas . length ; i ++ ) {System . out . p r i n t f ( " notas[%d] = %d\n " , i , notas [ i ] ) ;
9 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 159 / 526
Java – Arranjos
Declarando, inicializando e iterando um arranjo de strings
S t r i ng nomes [ ] = new St r ing [ 5 ] ;2
f o r ( i n t i = 0 ; i < nomes . length ; i ++ ) {4 nomes[ i ] = Teclado . l e r S t r i n g ( " Dig i te nomes[ " + i + " ] " ) ;
}6
f o r ( i n t i = 0 ; i < nomes . length ; i ++ ) {8 System . out . p r i n t f ( "nomes[%d] = %s\n " , i , nomes[ i ] ) ;
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 160 / 526
Java – Arranjos
Arranjos - Acesso aos elementosArranjos permite recuperar ou alterar qualquer um de seuselementos
Os arranjos em Java sempre iniciam-se na posição 0
Isto indica que ele termina em uma posição inferior aotamanho (n-1)
Ricardo Terra ([email protected]) POO 8 de julho de 2011 161 / 526
Java – Arranjos
Exemplo
char l e t r a s [ ] = new char [ 1 0 ] ;2
l e t r a s [ 0 ] = ’A’ ; /∗ A t r i b u i a 1a posicao do arranjo ∗/4 System . out . p r i n t f ( "%c" , l e t r a s [ 0 ] ) ; /∗ Imprime a 1a posicao ∗/
6 l e t r a s [ 1 ] = ’B ’ ;l e t r a s [ 2 ] = ’C’ ;
8 /∗ . . . ∗/l e t r a s [ 9 ] = ’H’ ;
10 l e t r a s [10] = ’ I ’ ; /∗ ERRO ∗/
O erro acima ativa uma exceção do tipoArrayIndexOutOfBoundsException. Isso pode alterar ofuncionamento normal do programa ou até mesmo“derrubá-lo”
Ricardo Terra ([email protected]) POO 8 de julho de 2011 162 / 526
Java – Arranjos
Arranjos MultidimensionaisPode-se criar um arranjo de arranjos
O mais comum é o bidimensional que vemos como umamatriz
A declaração é somente acrescentar o número de colunas
Por exemplo: int matriz[][] = new int[4][3]declara-se uma matriz de 4 linhas e 3 colunas
int matriz[][] = {{1,0,0}, {0,1,2}, {2,3,4}, {0,6,7}};
Representação :
1 0 00 1 22 3 40 6 7
Ricardo Terra ([email protected]) POO 8 de julho de 2011 163 / 526
Java – Arranjos
Arranjo Bidimensional - ExemploCriando uma matriz 3x2, zerando e setando valores
1 i n t matr iz [ ] [ ] = new i n t [ 3 ] [ 2 ] ; /∗ Declara uma matr iz 3x2 ∗/
3 f o r ( i n t i = 0 ; i < matriz . length ; i ++ ) {f o r ( i n t j = 0 ; j < matriz [ i ] . length ; j ++ ) {
5 matriz [ i ] [ j ] = 0 ;}
7 }
9 matriz [ 0 ] [ 0 ] = 1 ; /∗ A t r i b u i o valor 1 ao canto super ior esquerdo ∗/matriz [ 2 ] [ 1 ] = 7 ; /∗ A t r i b u i o valor 7 ao canto i n f e r i o r d i r e i t o ∗/
matriz1 00 00 7
Ricardo Terra ([email protected]) POO 8 de julho de 2011 164 / 526
Java – Arranjos
Arranjo Bidimensional – CuriosidadePode-se criar uma matriz com cada linha de um tamanho
1 i n t matr iz [ ] [ ] = new i n t [ 3 ] [ ] ; /∗ Cria uma matr iz com 3 l inhas ∗/matriz [0]= new i n t [ 4 ] ; /∗ A t r i b u i 4 colunas a l inha 0 ∗/
3 matriz [1]= new i n t [ 1 ] ; /∗ A t r i b u i 1 colunas a l inha 1 ∗/matriz [2]= new i n t [ 2 ] ; /∗ A t r i b u i 2 colunas a l inha 2 ∗/
matriz0 0 0 000 0
Ricardo Terra ([email protected]) POO 8 de julho de 2011 165 / 526
Java – Arranjos
Exemplo CompletoLeitura de cada elemento de uma matriz 2x3 e posteriorimpressão
1 i n t matr iz [ ] [ ] = new i n t [ 2 ] [ 3 ] ;
3 f o r ( i n t i = 0 ; i < matriz . length ; i ++ ) {f o r ( i n t j = 0 ; j < matriz [ i ] . length ; j ++ ) {
5 matriz [ i ] [ j ] = Teclado . le r In teger (" D ig i te matr iz [ " + i + " ] " + " [ " + j + " ] " ) ;
7 }}
9
f o r ( i n t i = 0 ; i < matriz . length ; i ++ ) {11 f o r ( i n t j = 0 ; j < matriz [ i ] . length ; j ++ ) {
System . out . p r i n t f ( "%d\t " , matriz [ i ] [ j ] ) ;13 }
System . out . p r i n t l n ( ) ;15 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 166 / 526
Java – Arranjos
Comandos de repetição – foreach
Para iterar um arranjo ou uma coleção, geralmentefazemos um for bem conhecido:
S t r i ng nomes [ ] = { " Ricardo " , " V i r g i l i o " , " Ralph " } ;
f o r ( i n t i = 0 ; i < nomes . length ; i ++ ) {S t r i ng nomeAtual = nomes[ i ] ;System . out . p r i n t l n ( nomeAtual ) ;
}
Como esse era um for bem comum, Java provê o foreachque é um for com sintaxe simplificada:
S t r i ng nomes [ ] = { " Ricardo " , " V i r g i l i o " , " Ralph " } ;
f o r ( S t r i ng nomeAtual : nomes ) {System . out . p r i n t l n ( nomeAtual ) ;
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 167 / 526
Java – Métodos
Até agora, estamos trabalhando com a linguagem Javacomo se fosse uma linguagem estruturada, isto é, sem aorientação a objetos
Criamos uma classe com o método main e fazemos tudodentro desse método
No entanto, mesmo sem termos aprofundado nos conceitosde POO, seria interessante para a familiarização com alinguagem que o método main chamasse outros métodos afim de deixar o código fonte mais claro e organizado
Convém salientar que essa é só uma visão aplicada demétodos quando se trabalha com Java como umalinguagem estruturada
Quando abordarmos os conceitos de POO, vamosaprofundar bem mais
Ricardo Terra ([email protected]) POO 8 de julho de 2011 169 / 526
Java – Métodos
MétodoSintaxe:
[ v i s i b ] [mod] retorno nome ( < param { , param} > ) { corpo }
visib = visibilidade (private, protected ou public)mod = modificadores (static, final, · · · )
Exemplos
private s t a t i c void imprimir ( ) { . . . }
protected i n t dobro ( i n t x ) { . . . }
public double somar (double a, double b) { . . . }
private void l i s t a r ( i n t notas [ ] ) { . . . }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 170 / 526
Java – Métodos
Diretrizes (por enquanto)Modificador static
Como o método main é um método estático, todos osmétodos que iremos criar, por enquanto, serão estáticos
Lembrem-se que um membro (atributo ou método) estáticosó acessa membros estáticos
Visibilidade private
O método main é público, justamente porque a JVM deveter permissão para acessá-lo e iniciar a aplicação
Por enquanto, os métodos que vocês criarem somente serãovisíveis pela própria classe
Ricardo Terra ([email protected]) POO 8 de julho de 2011 171 / 526
Java – Métodos
Exemplo
1 public class Bhaskara {
3 public s t a t i c void main( S t r i ng [ ] args ) {. . .
5 double d = Math .pow( b, 2 ) − 4 ∗ a ∗ c;. . .
7 }}
Pergunta-se
Porque o cálculo de delta não pode ser um método separadopara deixar o código mais legível?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 172 / 526
Java – Métodos
Exemplo
public class Bhaskara {2
public s t a t i c void main( S t r i ng [ ] args ) {4 . . .
double d = delta ( a, b, c ) ;6 . . .
}8
private s t a t i c double delta ( double a, double b, double c ) {10 re turn Math .pow( b, 2 ) − 4 ∗ a ∗ c;
}12 }
ResumoAgora, delta é um método privado e estático que pode serinvocada por qualquer método da classe Bhaskara
Ricardo Terra ([email protected]) POO 8 de julho de 2011 173 / 526
Java – Métodos
Um programa Java é uma coleção de classesClasses podem conter diversos métodos
A ordem de declaração não importa (ao contrário dalinguagem C)
Pelo menos uma classe deve possuir o método estáticomain
É a partir dele que a aplicação se inicia
Um método pode:receber parâmetrosdeclarar variáveis locaisconter instruções executáveisretornar um valorativar exceção
Ricardo Terra ([email protected]) POO 8 de julho de 2011 174 / 526
Java – Métodos
Exemplo
public class Soma {2
public s t a t i c void main( S t r i ng args [ ] ) {4 i n t a = 2 , b = 3 , to ta l ;
to ta l = soma( a, b ) ;6 System . out . p r i n t f ( "Soma: %d" , to ta l ) ;
8 }
10 private s t a t i c i n t soma( i n t x , i n t y ) {re turn x + y ;
12 }
14 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 175 / 526
Java – Métodos
Retorno de métodosUm método pode retornar valores de qualquer tipo, excetooutros métodos
Um método que retorna nada, deve ter seu retornodeclarado como void
A expressão que segue o return é o valor retornadonão se deve colocar parêntesesreturn x+y; e não return (x+y);
O valor de retorno pode ser ignorado
Término de métodosAo encontrar a chave de fechamentoAo ser retornado (return)Ao ativar uma exceção
Ricardo Terra ([email protected]) POO 8 de julho de 2011 176 / 526
Java – Métodos
Exemplo
public class ImprimeNome {2
public s t a t i c void main( S t r i ng args [ ] ) {4 S t r i ng nome = " Ricardo " ;
imprimeRetornandoTamanho ( nome ) ;6 }
8 private s t a t i c i n t imprimeRetornandoTamanho ( S t r i ng nome ) {System . out . p r i n t l n ( nome ) ;
10 return nome. length ( ) ;}
12
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 177 / 526
Java – Métodos
Exercíciosfatorial
escreveMaiorRecebe n e imprime: n > n-1 > n-2 > · · · > 1 > 0
retornaMenorElemento
retornaMaiorElemento
retornaMediaFazer com for e com foreach
Ricardo Terra ([email protected]) POO 8 de julho de 2011 178 / 526
Java – Métodos
Solução fatorial
1 public class F a t o r i a l {
3 public s t a t i c void main( S t r i ng args [ ] ) {i n t n = Teclado . le r In teger ( " D ig i te n " ) ;
5 System . out . p r i n t f ( "%d! = %d" , n , fa t ( n ) ) ;}
7
private s t a t i c long fa t ( i n t n ) {9 long res = 1 ;
i f ( n == 0 || n == 1 ) {11 return 1;
}13 f o r ( i n t i = 2 ; i <= n ; i ++ ) {
res ∗= i ;15 }
re turn res ;17 }
19 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 179 / 526
Java – Métodos
Solução escreveMaior
public class EscreveMaior {2
public s t a t i c void main( S t r i ng args [ ] ) {4 i n t n = Teclado . le r In teger ( " D ig i te n " ) ;
escreveMaior ( n ) ;6 }
8 private s t a t i c void escreveMaior ( i n t n ) {f o r ( i n t i = n ; i >= 0 ; i−− ) {
10 System . out . p r i n t f ( "%d " , i ) ;System . out . p r i n t f ( ( i > 0) ? " > " : " \n " ) ;
12 }}
14
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 180 / 526
Java – Métodos
Solução retornaMenor
public class MenorElemento {2
public s t a t i c void main( S t r i ng args [ ] ) {4 i n t v [ ] = { 2 , 4 , 5 , 1 , 3 } ;
System . out . p r i n t f ( "Menor e l . : %d" , retornaMenor ( v ) ) ;6 }
8 private s t a t i c i n t retornaMenor ( i n t v [ ] ) {i n t menor = v [ 0 ] ;
10 i n t tam = v . length ;f o r ( i n t i = 1 ; i < tam; i ++ ) {
12 i f ( v [ i ] < menor ) {menor = v [ i ] ;
14 }}
16 re turn menor ;}
18
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 181 / 526
Conteúdo
1 Introdução
2 UML
3 Java
4 POOConceitos IniciaisClasse java.lang.Object
HerançaModificadoresInterfaceHerança Múltipla?Classe Abstrata x InterfaceExceção
5 Padrões de Projeto
6 Tópicos Relevantes
7 Materiais Complementares
8 ExtrasRicardo Terra ([email protected]) POO 8 de julho de 2011 182 / 526
POO – Conceitos Iniciais
ClasseComo já foi abordado, “uma classe encapsulacaracterísticas comuns a grupos de objetos.” (MikeO’Docherty, 2005)
Pode ser pensada como uma “receita de bolo”Ela diz que tem tamanho, sabor e recheio. O que realmenteé pequeno, de chocolate e recheado de morango é umobjeto da classe (ou instância da classe)
Em OO, uma classe é a menor unidade modular, isto é, tudodeve estar inserido em uma classe
Uma classe possui:Atributos (propriedades)
Construtores (um tipo especial de método para criação de objetos)
Métodos (comportamentos)
Ricardo Terra ([email protected]) POO 8 de julho de 2011 184 / 526
POO – Conceitos Iniciais
Declaração de uma Classe
public class Conta {. . .
}
Padrão BluePrintsClasses sempre devem iniciar com a 1a letra em caixa alta.Por exemplo:
Conta, Bhaskara ...
Demais palavras em caixa baixa salvo início de novaspalavras. Por exemplo:
GuardaChuva, ContaCorrente ...
Sempre evitem (não usem) caracteres especiais aoprogramar:
_, -, ç, ã, á, ê, é ...
Ricardo Terra ([email protected]) POO 8 de julho de 2011 185 / 526
POO – Conceitos Iniciais
AtributoSintaxe:
[ v i s i b ] [mod] t ipo nome { = valor− i n i c i a l }
visib = visibilidade (private, protected ou public)mod = modificadores (static, final, ...)
Exemplos
public S t r i ng nome;
private double sa lar io = 1000.00;
protected i n t nota ;
double cor ;
Ricardo Terra ([email protected]) POO 8 de julho de 2011 186 / 526
POO – Conceitos Iniciais
Modificadoresfinal
Torna o atributo imutável
staticTorna o atributo estático, isto é, pertence à classe
Exemplos
/∗ O cpf nunca será alterado ∗/private f i n a l long cpf ;
/∗Taxa de rendimento compartilhada entre todosos objetos do t ipo ContaPoupanca
∗/private s t a t i c double taxaRendimento ;
Ricardo Terra ([email protected]) POO 8 de julho de 2011 187 / 526
POO – Conceitos Iniciais
Declaração de atributos na classe Conta
public class Conta {2 private s t a t i c i n t autoIncremento = 1;
private f i n a l i n t numero ;4 private double saldo ;
private Corrent i s ta cor rent i s ta ;6 . . .
}
Padrão BluePrintsAtributos sempre devem iniciar com a 1a letra em caixabaixa. Por exemplo:
saldo, nome ...
Demais letras em caixa baixa salvo início de novas palavras.Por exemplo:
nomeCompleto, registroGeral ...
Ricardo Terra ([email protected]) POO 8 de julho de 2011 188 / 526
POO – Conceitos Iniciais
MétodoSintaxe:
[ v i s i b ] [mod] retorno nome ( < param { , param} > ) { corpo }
visib = visibilidade (private, protected ou public)mod = modificadores (static, final, · · · )
Exemplos
private s t a t i c void imprimir ( ) { . . . }
public double somar (double a, double b) { . . . }
private void l i s t a r ( i n t notas [ ] ) { . . . }
Padrão BluePrintsMesma regra de atributos
Ricardo Terra ([email protected]) POO 8 de julho de 2011 189 / 526
POO – Conceitos Iniciais
Declaração de métodos na classe Conta
1 public class Conta {. . .
3 public i n t getNumero ( ) {return t h i s . numero ;
5 }
7 public Corrent i s ta getCorrent is ta ( ) {re turn t h i s . cor rent i s ta ;
9 }
11 public void setCor rent i s ta ( Corrent i s ta cor rent i s ta ) {t h i s . cor rent i s ta = cor rent i s ta ;
13 }
15 public double getSaldo ( ) {return t h i s . saldo ;
17 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 190 / 526
POO – Conceitos Iniciais
Declaração de métodos na classe Conta
1 public boolean r e t i r a r ( double valor ) {i f ( valor <= t h i s . saldo ) {
3 t h i s . saldo −= valor ;re turn true ;
5 }return fa lse ;
7 }
9 public void depositar ( double valor ) {t h i s . saldo += valor ;
11 }
13 public boolean t r a n s f e r i r ( Conta contaDestino , double valor ) {i f ( t h i s . r e t i r a r ( valor ) ) {
15 contaDestino . depositar ( valor ) ;re turn true ;
17 }return fa lse ;
19 }}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 191 / 526
POO – Conceitos Iniciais
Declaração de métodos na classe Conta
public class Conta {2 . . .
public i n t getNumero ( ) {4 return t h i s . numero ;
}6
public Corrent i s ta getCorrent is ta ( ) {8 return t h i s . cor rent i s ta ;
}10
public void setCor rent i s ta ( Corrent i s ta cor rent i s ta ) {12 t h i s . cor rent i s ta = cor rent i s ta ;
}14
public double getSaldo ( ) {16 return t h i s . saldo ;
}18
public boolean r e t i r a r ( double valor ) {20 i f ( valor <= t h i s . saldo ) {
t h i s . saldo −= valor ;22 return true ;
}24 return fa lse ;
}26
public void depositar ( double valor ) {28 t h i s . saldo += valor ;
}30
public boolean t r a n s f e r i r ( Conta contaDestino , double valor ) {32 i f ( t h i s . r e t i r a r ( valor ) ) {
contaDestino . depositar ( valor ) ;34 return true ;
}36 return fa lse ;
}38 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 192 / 526
POO – Conceitos Iniciais
ConstrutorTipo especial de método responsável pela criação deobjetos
Por exemplo, como eu crio uma conta? Como eu crio umcorrentista?
Se você não cria um construtor, Java cria um vazio paravocê. Esse construtor somente permite que você crieobjetos daquela classe utilizando o operador new
Contudo, se você cria um construtor, Java não mais cria umvazio para você
Ricardo Terra ([email protected]) POO 8 de julho de 2011 193 / 526
POO – Conceitos Iniciais
ConstrutorSintaxe:
[ v i s i b ] nome−da−classe ( < param { , param} > ) { corpo }
DiretrizesSOMENTE é chamado na criação de um novo objeto
SEMPRE possui o mesmo nome da classe
NÃO possui tipo de retorno
GERALMENTE é público
Observação
Atributos final devem SEMPRE ser inicializado em umconstrutor
Ricardo Terra ([email protected]) POO 8 de julho de 2011 194 / 526
POO – Conceitos Iniciais
Declaração de construtores na classe Conta
1 public class Conta {. . .
3 public Conta ( Corrent i s ta cor rent i s ta ) {t h i s ( cor rent i s ta , 0.0 ) ;
5 }
7 public Conta ( Corrent i s ta corrent i s ta , double saldo ) {t h i s . cor rent i s ta = cor rent i s ta ;
9 t h i s . numero = autoIncremento++;t h i s . saldo = saldo ;
11 }. . .
13 }
Observação
A instrução this( correntista, 0.0 ) invoca o outroconstrutor passando o correntista e 0.0
Ricardo Terra ([email protected]) POO 8 de julho de 2011 195 / 526
POO – Conceitos Iniciais
Declaração de construtores na classe Correntista
public class Corrent is ta {2 private f i n a l long cpf ;
private S t r i ng nome;4
public Corrent is ta ( long cpf , S t r i ng nome) {6 t h i s . cpf = cpf ;
t h i s .nome = nome;8 }
10 public long getCpf ( ) {return t h i s . cpf ;
12 }
14 public S t r i ng getNome( ) {return t h i s .nome;
16 }
18 public void setNome( S t r i ng nome ) {t h i s .nome = nome;
20 }}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 196 / 526
POO – Conceitos Iniciais
Criando objetosUm objeto é a concretização de uma classe
Em outras palavras, é a instanciação de uma classe
O operador new permite que objetos sejam criados a partirde uma classe. Por exemplo:
S t r i ng s = new St r ing ( " Java é doido demais ! " ) ;Date data = new Date ( ) ;Animal girafa = new Girafa ( "Melman" , new Mania( "Doença" ) ) ;
O operador new aloca memória no heap da JVM e cria aestrutura básica de um objeto da classe
Bem mais fácil que em C
Ricardo Terra ([email protected]) POO 8 de julho de 2011 197 / 526
POO – Conceitos Iniciais
Pergunta-se
Suponha uma classe hipotética X em que não foi definidonenhum construtor
Como criar um objeto dessa classe?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 198 / 526
POO – Conceitos Iniciais
Pergunta-se
Suponha uma classe hipotética X em que não foi definidonenhum construtor
Como criar um objeto dessa classe?
Responde-senew X()
Pois, como não foi criado nenhum construtor, Java cria umvazio automaticamente
Ricardo Terra ([email protected]) POO 8 de julho de 2011 198 / 526
POO – Conceitos Iniciais
Como criar um objeto da classe Correntista?A classe Correntista só tem um construtor, logo o únicomodo é:
new Corrent is ta ( 123 , " Ricardo Terra " ) /∗ valores hipotét icos ∗/
Ricardo Terra ([email protected]) POO 8 de julho de 2011 199 / 526
POO – Conceitos Iniciais
Como criar um objeto da classe Conta?Inicialmente, qualquer construtor da classe Conta requerum objeto da classe Correntista. Logo:
Corrent is ta c = new Corrent is ta ( 123 , " Ricardo Terra " )
Assim:new Conta ( c )
new Conta ( c , 1000.00 ) ;
Caso não tenha um objeto da classe Correntista, vocêpode ser um pouco “ousado”:
new Conta ( new Corrent is ta ( 456 , " Maria " ) )
new Conta ( new Corrent is ta ( 456 , " Maria " ) , 1000.00 )
Ricardo Terra ([email protected]) POO 8 de julho de 2011 200 / 526
POO – Conceitos Iniciais
Métodos AcessoresNa maioria das vezes, opta-se por criar atributos privados epara modificá-los criam-se métodos acessores (getters esetters)
Isto faz com que não se tenha acesso direto aos atributos,mas conseguindo obtê-los e modificá-los
Esses métodos acessores seguem o seguinte padrão:
Método setter se chama setNomeAtributo. Além disso,retorna void e possui um único parâmetro formal do mesmotipo do atributo
Método getter se chama getNomeAtributo. Além disso,retorna o mesmo tipo do atributo e não possui parâmetroformal
Ricardo Terra ([email protected]) POO 8 de julho de 2011 201 / 526
POO – Conceitos Iniciais
Exemplo – Métodos Acessores em Correntista
1 public class Corrent i s ta {private f i n a l long cpf ;
3 private S t r i ng nome;
5 public Corrent i s ta ( long cpf , S t r i ng nome) {t h i s . cpf = cpf ;
7 t h i s .nome = nome;}
9
public long getCpf ( ) {11 return t h i s . cpf ;
}13
public S t r i ng getNome( ) {15 return t h i s .nome;
}17
public void setNome( S t r i ng nome ) {19 t h i s .nome = nome;
}21 }
Pergunta-se
Onde está o setCpf?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 202 / 526
POO – Conceitos Iniciais
Referência this
this é uma referência ao objeto correnteÉ um boa prática, logo deve SEMPRE ser utilizado
Além de boa prática, resolve problema de escopos:1 public class ExemploThis {
private i n t x = 2;3
public void m( ) {5 i n t x = 4;
System . out . p r i n t f ( "%d" , x ) ;7 System . out . p r i n t f ( "%d" , t h i s . x ) ;
}9 }
Qual a saída?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 203 / 526
POO – Conceitos Iniciais
Exemplo Completo
1 public s t a t i c void main( S t r i ng [ ] args ) {Corrent is ta eu = new Corrent is ta ( 123 , " Ricardo " ) ;
3 Conta minhaConta = new Conta ( eu , 2000 ) ;
5 Conta contaDela = new Conta ( new Corrent is ta ( 456 , " Maria " ) ) ;
7 System . out . p r i n t f ( "%d %s %.2 f \n " , minhaConta . getNumero ( ) ,minhaConta . getCorrentista ( ) . getNome( ) , minhaConta . getSaldo ( ) ) ;
9 System . out . p r i n t f ( "%d %s %.2 f \n " , contaDela . getNumero ( ) ,contaDela . getCorrentista ( ) . getNome( ) , contaDela . getSaldo ( ) ) ;
11
contaDela . depositar ( 500.00 ) ;13
i f ( ! contaDela . r e t i r a r ( 600 ) ) {15 contaDela . r e t i r a r ( contaDela . getSaldo ( ) ) ;
}17
minhaConta . t r a n s f e r i r ( contaDela , 0 .5 ∗ minhaConta . getSaldo ( ) ) ;19
System . out . p r i n t f ( "%d %s %.2 f \n " , minhaConta . getNumero ( ) ,21 minhaConta . getCorrentista ( ) . getNome( ) , minhaConta . getSaldo ( ) ) ;
System . out . p r i n t f ( "%d %s %.2 f \n " , contaDela . getNumero ( ) ,23 contaDela . getCorrentista ( ) . getNome( ) , contaDela . getSaldo ( ) ) ;
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 204 / 526
POO – Conceitos Iniciais
Problemas Comuns (merecem atenção redobrada)
Um atributo final deve ser iniciado uma única vez e deveser feito em um construtor
Por isso, é importante utilizar this para chamar um outroconstrutor dentro de um construtor
Não se utiliza this para acessar um membro (atributo oumétodo) estático (static)
Por exemplo, o atributo estático autoIncremento ou éutilizado sem this ou Conta.autoIncremento
Um membro estático não pode utilizar thisComo ele não faz parte de nenhum objeto, um membroestático só pode utilizar membros estáticos
Ricardo Terra ([email protected]) POO 8 de julho de 2011 205 / 526
POO – Conceitos Iniciais
Problemas Comuns (merecem atenção redobrada)
Suponha que a classe Pessoa não tenha construtor algumdefinido. Para criar um objeto do tipo Pessoa, basta:
new Pessoa ( )
No entanto, suponha que tenha criado um construtordizendo que pessoa deve ter um nome. Então, o únicomodo de criar pessoa agora é passando o nome:
new Pessoa ( " Ricardo Terra " )
new Pessoa ( ) /∗ não funciona mais ∗/
Lembre-se, Java só cria o construtor vazio se você não criarconstrutor algum
Ricardo Terra ([email protected]) POO 8 de julho de 2011 206 / 526
POO – Conceitos Iniciais
Problemas Comuns (merecem atenção redobrada)
E se eu quiser que uma pessoa possa ser criada sem nadaou com o nome?
1 public class Pessoa {private S t r i ng nome;
3
public Pessoa ( ) {5 }
7 public Pessoa ( S t r i ng nome) {t h i s .nome = nome;
9 }
11 public S t r i ng getNome( ) {re turn nome;
13 }
15 public void setNome( S t r i ng nome ) {t h i s .nome = nome;
17 }}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 207 / 526
POO – Conceitos Iniciais
Dicas para evitar problemasNão crie método acessor setter para atributos final
Não funcionará, eles não mudam
É importante inicializar todos os atributos no construtorPode gerar problemas como valores indesejados ouexceções (futuro)
Siga a ordem de declaração na classePrimeiro atributos, depois construtores e depois métodos
Siga o padrão de nomenclatura
Faça comentários a todo momento
Ricardo Terra ([email protected]) POO 8 de julho de 2011 208 / 526
POO – Conceitos Iniciais
Exercício de Fixação 01
Pratique os conceitos de OO aprendidos no BlueJimplementando o seguinte modelo UML:
Ricardo Terra ([email protected]) POO 8 de julho de 2011 209 / 526
POO – Conceitos Iniciais
Exercício de Fixação 02
Pratique os conceitos de OO aprendidos no BlueJimplementando o seguinte modelo UML:
Ricardo Terra ([email protected]) POO 8 de julho de 2011 210 / 526
POO – Conceitos Iniciais
ResumoClasse e Objeto
Declaração de atributos, métodos e construtores
Associação de classes
Modificadores de visibilidade
Modificador static
Modificador final (em atributos)
Reúso
Referência this
Encapsulamento (métodos acessores)
Instanciação (operador new)
Ricardo Terra ([email protected]) POO 8 de julho de 2011 211 / 526
POO – Classe java.lang.Object
Em Java, todas as classes são subclasses dejava.lang.Object
Logo, as seguintes declarações da classe A sãoequivalentes:
public class A { . . . }
public class A extends Object { . . . }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 213 / 526
POO – Classe java.lang.Object
Capacidade PolimórficaIsto proporciona a capacidade polimórfica de qualquerclasse Java, uma vez que qualquer objeto pode ser tratadocomo Object
Na verdade, a capacidade polimórfica se dá pela herança
Exemplo
1 Object v [ ] = new Object [ ] { " S t r i n g " , 2 , new A( ) , new Date ( ) } ;
3 f o r ( Object o : v ) {System . out . p r i n t l n ( o ) ;
5 }
Pergunta-se
2 é objeto?Qual será a saída do programa?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 214 / 526
POO – Classe java.lang.Object
Herança
Toda classe Java já possui implementados diversos métodosherdados da classe Object
Os seguintes métodos são os mais relevantes:
equals
hashCode
toString
finalize
Ricardo Terra ([email protected]) POO 8 de julho de 2011 215 / 526
POO – Classe java.lang.Object
Método toString
Assinatura:public S t r i ng toS t r i ng ( )
Ao imprimir um objeto, é impresso o string retornado poresse método
Pessoa p = new Pessoa ( " Ricardo " , 21) ;System . out . p r i n t l n ( p ) ;
Se esse método não for sobrescrito, ele imprime o nomequalificado1 da classe, @ e hashcode
Por exemplo: com.terra.pojo.Pessoa@19821f
No entanto, se sobrescrito, pode retornar o que desejarPor exemplo: Ricardo tem 21 anos
1pacote + nome da classe
Ricardo Terra ([email protected]) POO 8 de julho de 2011 216 / 526
POO – Classe java.lang.Object
Método equals
Assinatura:public boolean equals ( Object o)
Basicamente, compara a igualdade de dois objetosPessoa p1 = new Pessoa ( " Ricardo " , 21) ;Pessoa p2 = new Pessoa ( " Ricardo " , 21) ;System . out . p r i n t l n ( p1 . equals ( p2 ) ) ;
Se esse método não for sobrescrito, ele verifica se ambosobjetos ocupam a mesma posição de memória. Logo, noexemplo, retornará false
No entanto, se sobrescrito para comparar os valores de seusatributos, no exemplo, possivelmente retornará true
Ricardo Terra ([email protected]) POO 8 de julho de 2011 217 / 526
POO – Classe java.lang.Object
Método hashCode
Assinatura:public i n t hashCode ( )
Esse método retorna código hash. Um código hash podeser um número inteiro, positivo ou negativo. Objetos iguaistêm de retornar códigos hash idênticos
Indicações:Se o método equals é sobrescrito, o método hash tambémdeve ser
Uso:Tabela de Hash
Ricardo Terra ([email protected]) POO 8 de julho de 2011 218 / 526
POO – Classe java.lang.Object
Coletor de Lixo (GC)Em Java, o gerenciamento de memória é realizadoautomaticamente por um processo chamado Coletor deLixo (Garbage Colletor – GC) que é executado dentro daJVM
Você pode forçar a ativação do GC com System.gc()
No entanto, Java poderá ignorar
Exemplo
S t r i ng s t r = " casa " ;s t r = " carta " ;System .gc( ) ; /∗ ta lvez ative ∗/. . .
Ricardo Terra ([email protected]) POO 8 de julho de 2011 219 / 526
POO – Classe java.lang.Object
Método finalize
Assinatura:protected void f i n a l i z e ( ) throws Throwable
Esse método é executado no momento em que o coletorde lixo (GC) vai liberar a memória ocupada pelo objeto
A implementação padrão (em Object) é vazia. Logo, senão sobreposto, não faz nada
No entanto, se sobrescrito, pode fazer o que desejarPor exemplo: fechar uma conexão, dar o último suspiro, sesalvar etc
Ricardo Terra ([email protected]) POO 8 de julho de 2011 220 / 526
POO – Classe java.lang.Object
Método finalize – Programa Assassino
Suponha a seguinte classe Deus:1 public class Deus {
private s t a t i c Collection < Imortal > protegidos3 = new HashSet< Imortal > ( ) ;
5 public s t a t i c void proteger ( Imortal i ) {protegidos .add( i ) ;
7 }}
Suponha a seguinte classe Imortal:1 public class Imortal {
@Override3 protected void f i n a l i z e ( ) throws Throwable {
Deus . proteger ( t h i s ) ;5 }
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 221 / 526
POO – Classe java.lang.Object
Método finalize – Programa Assassino
public class ProgramaAssassino {2
public s t a t i c void main( S t r i ng [ ] args ) {4 while ( t rue ) {
new Imortal ( ) ;6 }
}8
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 222 / 526
POO – Classe java.lang.Object
Exemplo Completo – Classe Pessoa
1 public class Pessoa {private S t r i ng nome;
3 private i n t idade ;
5 public Pessoa ( S t r i ng nome, i n t idade ) {t h i s .nome = nome;
7 t h i s . idade = idade ;}
9
public S t r i ng getNome( ) {11 return t h i s .nome;
}13
public void setNome( S t r i ng nome ) {15 t h i s .nome = nome;
}17
public i n t getIdade ( ) {19 return t h i s . idade ;
}21
public void setIdade ( i n t idade ) {23 t h i s . idade = idade ;
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 223 / 526
POO – Classe java.lang.Object
Exemplo Completo – Classe Pessoa
1 @Overridepublic S t r i ng toS t r i ng ( ) {
3 return t h i s .nome + " tem " + t h i s . idade + " anos " ;}
5
@Override7 public void f i n a l i z e ( ) {
System . out . p r i n t l n ( " Bye : " + t h i s ) ;9 }
11 @Overridepublic i n t hashCode ( ) {
13 f i n a l i n t prime = 31;i n t r e s u l t = 1 ;
15 r e s u l t = prime ∗ r e s u l t + idade ;r e s u l t = prime ∗ r e s u l t + ( (nome == n u l l ) ? 0 : nome.hashCode ( ) ) ;
17 return r e s u l t ;}
19
@Override21 public boolean equals ( Object o ) {
i f ( o != n u l l && o instanceof Pessoa ) {23 Pessoa p = ( Pessoa ) o ;
return p.nome. equals ( t h i s .nome ) && p. idade == t h i s . idade ;25 }
return fa lse ;27 }
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 224 / 526
POO – Classe java.lang.Object
Exemplo Completo
public s t a t i c void main( S t r i ng [ ] args ) {2 Pessoa p1 = new Pessoa ( " Ralph " , 28 ) ;
Pessoa p2 = new Pessoa ( " Ralph " , 28 ) ;4 Pessoa p3 = new Pessoa ( " Terra " , 21 ) ;
Pessoa p4 = new Pessoa ( " V i r g i l i o " , 40 ) ;6
System . out . p r i n t l n ( p3 ) ;8
p4 = n u l l ;10 System .gc ( ) ;
12 System . out . p r i n t f ( "%s \t %s " , p1 , p2 ) ;
14 i f ( p1 . equals ( p2 ) ) {System . out . p r i n t l n ( p1 + " eq " + p2 ) ;
16 } else {System . out . p r i n t l n ( p1 + " ne " + p2 ) ;
18 }}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 225 / 526
a.s. e d.s.?
a.s. e d.s.?
a.s. e d.s.?
a.s. e d.s.?
POO – Classe java.lang.Object
ImportanteImprimir this é o mesmo que imprimir this.toString()
Nunca se esqueça:
comparação de tipos primitivos: ==
comparação de objetos: método equals()
Ricardo Terra ([email protected]) POO 8 de julho de 2011 226 / 526
POO – Classe java.lang.Object
ResumoClasse java.lang.Object
equals
hashCode
toString
finalize
Coletor de Lixo
Sobreposição desses métodos
Ricardo Terra ([email protected]) POO 8 de julho de 2011 227 / 526
POO – Herança
Modelo 1: Jogo dos “1 erro”!!!
Ricardo Terra ([email protected]) POO 8 de julho de 2011 229 / 526
POO – Herança
Modelo 1: Classe Empregado – Implementação
public class Empregado {2 private long cpf ;
private S t r i ng nome;4
public Empregado( long cpf , S t r i ng nome) {6 t h i s . cpf = cpf ;
t h i s .nome = nome;8 }
10 /∗ Metodos Acessores ∗/}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 230 / 526
POO – Herança
Modelo 1: Classe Gerente – Implementação
public class Gerente {2 private long cpf ;
private S t r i ng nome;4 private Departamento departamento ;
6 public Gerente ( long cpf , S t r i ng nome, Departamento departamento ) {t h i s . cpf = cpf ;
8 t h i s .nome = nome;t h i s . departamento = departamento ;
10 }
12 /∗ Metodos Acessores ∗/}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 231 / 526
POO – Herança
Modelo 1: Classe Departamento – Implementação
public class Departamento {2 private i n t codigo ;
private S t r i ng nome;4
public Departamento ( i n t codigo , S t r i ng nome) {6 t h i s . codigo = codigo ;
t h i s .nome = nome;8 }
10 /∗ Metodos Acessores ∗/}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 232 / 526
POO – Herança
Refletindo...Um gerente tem tudo que empregado tem!
Logo, é possível?Empregado e = new Gerente (1 , " Ricardo " , new Departamento(1 , " T I " ) )
Não, mas porquê? Fraca Modelagem OOMesmo nós sabendo que um gerente é um empregado, nãohá nada dizendo isso na modelagem OO
Solução? Herança!
Ricardo Terra ([email protected]) POO 8 de julho de 2011 233 / 526
POO – Herança
Solução...
Herança consiste em uma classe herdar todo os membros(atributos e métodos) de uma outra classe
Fazer uma modelagem OO adequada ao problema, isto é,onde um gerente é um empregado!
Para isso, no exemplo anterior, a classe Gerente deveriaestender a classe Empregado. Assim:
Gerente será uma subclasse de Empregado
Empregado será superclasse de Gerente
Herança habilita a capacidade polimórficaAgora, um gerente pode ser visto como um meroempregado
Ricardo Terra ([email protected]) POO 8 de julho de 2011 234 / 526
POO – Herança
Modelo 2: “A aparição da Herança”!!!
Ricardo Terra ([email protected]) POO 8 de julho de 2011 235 / 526
POO – Herança
Modelo 2: Classe Departamento – Implementação
Nenhuma modificação
Ricardo Terra ([email protected]) POO 8 de julho de 2011 236 / 526
POO – Herança
Modelo 2: Classe Empregado – Implementação
1 public class Empregado {protected long cpf ;
3 protected S t r i ng nome;
5 public Empregado( long cpf , S t r i ng nome) {t h i s . cpf = cpf ;
7 t h i s .nome = nome;}
9
/∗ Metodos Acessores ∗/11 }
O que mudou?Atributos private viram protected
Ricardo Terra ([email protected]) POO 8 de julho de 2011 237 / 526
POO – Herança
Modelo 2: Classe Gerente – Implementação
public class Gerente extends Empregado{2 private Departamento departamento ;
4 public Gerente ( long cpf , S t r i ng nome, Departamento departamento ) {super ( cpf , nome) ;
6 t h i s . departamento = departamento ;}
8
/∗ Metodos Acessores somente de departamento ∗/10 }
O que mudou?Gerente estende Empregado, logo devido a essa extensão:
foram removidos os atributos cpf e nome
foram removidos os métodos acessores de cpf e nome
Ricardo Terra ([email protected]) POO 8 de julho de 2011 238 / 526
POO – Herança
Modelo 2: Classe Gerente – Implementação
1 public Gerente ( long cpf , S t r i ng nome, Departamento departamento ) {super ( cpf , nome) ;
3 t h i s . departamento = departamento ;}
E esse super?Por regra, o construtor de Gerente deve chamar umconstrutor de Empregado
Geralmente, Java sempre chama o construtor vazio atravésde super()
Contudo, Empregado não tem o construtor vazio, portantotemos que na primeira linha do construtor de Gerentechamar algum construtor existente em Empregado
Isso é logo abordado em mais detalhes
Ricardo Terra ([email protected]) POO 8 de julho de 2011 239 / 526
POO – Herança
Refletindo novamente...Agora, a modelagem indica que um gerente tem tudo queempregado tem!
Logo, agora é possível?Empregado e = new Gerente (1 , " Ricardo " , new Departamento(1 , " T I " ) )
Sim, mas porquê? Modelagem OO adequada ao problema
Ricardo Terra ([email protected]) POO 8 de julho de 2011 240 / 526
POO – Herança
Exemplo Completo
1 public s t a t i c void main( S t r i ng [ ] args ) {Empregado e = new Empregado(2 , " V i r g i l i o Borges " ) ;
3 Gerente g = new Gerente (1 , " Ricardo " , new Departamento (1 , " T I " ) ) ;
5 Empregado v [ ] = {e ,g } ;
7 f o r (Empregado o : v ) {System . out . p r i n t l n (o . getCpf ( ) + " " + o .getNome ( ) ) ;
9 }}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 241 / 526
POO – Herança
Funcionamento dos construtoresEm uma hierarquia, não se pode criar uma especializaçãode certa classe sem chamar um construtor de suasuperclasse imediata
Caso você não invoque explicitamente, Java insere umachamada padrão super() que, na verdade, invoca oconstrutor vazio da superclasse imediata
Logo, suponha o seguinte construtor a classe A:public A( ) {}
igual apublic A( ) {
super ( ) ; // invocando o construtor vazio da superclasse}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 242 / 526
POO – Herança
Exemplo 1 – Iguais!!!
1 public class A {
3 }
1 public class B extends A {
3 }
1 public class A {
3 public A( ) {
5 }
7 }
1 public class B extends A {
3 public B ( ) {
5 }
7 }
1 public class A {
3 public A( ) {super ( ) ;
5 }
7 }
1 public class B extends A {
3 public B ( ) {super ( ) ;
5 }
7 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 243 / 526
POO – Herança
Revisão da Capacidade Polimórfica
Pode?
A a = new A ( ) ;
A a = new B ( ) ;
B b = new B ( ) ;
B b = new A ( ) ; /∗ erro , por acaso A é subclasse de B? ∗/
Ricardo Terra ([email protected]) POO 8 de julho de 2011 244 / 526
POO – Herança
Nunca me preocupei com construtores. Ignorância é umabenção!
public class A { }
public class B extends A { }
Claro que não!A tem um construtor vazio criado por Java!
B tem um construtor vazio criado por Java que chama oconstrutor vazio de A!
Ricardo Terra ([email protected]) POO 8 de julho de 2011 245 / 526
POO – Herança
Nunca me preocupei com construtores. Ignorância é mesmouma benção!
public class A { }
public class B extends A {i n t x ;public B ( i n t x ) {
t h i s . x = x ;}
}
Claro que não!A tem um construtor vazio criado por Java!
B pode ter qualquer construtor, pois Java insereautomaticamente uma chamada ao construtor vazio de A(que existe)!
Ricardo Terra ([email protected]) POO 8 de julho de 2011 246 / 526
POO – Herança
Enfim...Em uma hierarquia, não se pode criar uma especializaçãode certa classe sem chamar um construtor de suasuperclasse imediata
Caso você não invoque explicitamente, Java insere umachamada padrão super() que, na verdade, invoca oconstrutor vazio da superclasse imediata
Conclusão: em uma hierarquia, você só pode deixar deinvocar o construtor da superclasse se, e somente se, asuperclasse tiver um construtor vazio
Ricardo Terra ([email protected]) POO 8 de julho de 2011 247 / 526
POO – Herança
Referência super
Assim, como this é uma referência à própria classe, superé uma referência à superclasse
Por exemplo:usamos this() para invocar construtores da própria classe,agora usamos super() para invocar construtores dasuperclasseusamos this. para acessar atributos e invocar métodos daprópria classe, agora usamos super. para acessar atributose invocar métodos da superclasse
Ricardo Terra ([email protected]) POO 8 de julho de 2011 248 / 526
POO – Herança
Sessão “Vale a pena ver de novo”: Sobreposição
Você sobrepõe uma operação quando deseja que umaoperação herdada seja realizada diferentemente pelasubclasse
Por exemplo, uma cobra se alimenta de ratos, mas um tipoespecífico de cobra (subclasse) se alimenta diferentemente
Assim, é necessário sobrepor o método alimentar:Classe Cobra
void alimentar ( Rato comida) { /∗ mata e come ∗/ }
Classe Cascavel
@Overridevoid alimentar ( Rato comida) { /∗ come mesmo vivo ∗/ }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 249 / 526
POO – Herança
Sessão “Vale a pena ver de novo”: Sobrecarga
Você sobrecarrega uma operação quando deseja que amesma operação também seja realizada por entradasdiferentes
Por exemplo, uma cobra se alimenta de ratos, mas um tipoespecífico de cobra (subclasse) se alimenta também deratazanas
Assim, é necessário sobrecarregar o método alimentar:Classe Cobra
void alimentar ( Rato comida) { /∗ mata e come ∗/ }
Classe Cascavel
@Overridevoid alimentar ( Rato comida) { /∗ come mesmo vivo ∗/ }void alimentar ( Ratazana comida) { /∗ come também ∗/ }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 250 / 526
POO – Herança
Exemplo Completo
Nada como uma aplicação mais prática paraentendermos melhor...
Ricardo Terra ([email protected]) POO 8 de julho de 2011 251 / 526
POO – Herança
Classe Conta
public class Conta {protected f i n a l Corrent is ta cor rent i s ta ;protected double saldo ;
public Conta( Corrent is ta corrent i s ta , double saldo ) {t h i s . cor rent i s ta = cor rent i s ta ;t h i s . saldo = saldo ;
}
public Conta( Corrent is ta cor rent i s ta ) {t h i s ( cor rent i s ta , 0.0 ) ;
}
public Corrent is ta getCorrent is ta ( ) {re turn cor rent i s ta ;
}
public double getSaldo ( ) {return saldo ;
}/∗ continua ∗/
Ricardo Terra ([email protected]) POO 8 de julho de 2011 252 / 526
POO – Herança
Classe Conta
public void depositar ( double valor ) {t h i s . saldo += valor ;
}
public boolean r e t i r a r ( double valor ) {i f ( valor <= t h i s . saldo ) {
t h i s . saldo −= valor ;re turn true ;
}return fa lse ;
}
@Overridepublic S t r i ng toS t r i ng ( ) {
return t h i s . cor rent i s ta .getNome( ) + " tem R$ " + t h i s . saldo ;}
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 253 / 526
POO – Herança
Importante sobre a classe Conta
Observe a visibilidade dos atributos
Observe a chamada entre construtores utilizando this
Observe a sobreposição do método toString
Ricardo Terra ([email protected]) POO 8 de julho de 2011 254 / 526
POO – Herança
Classe ContaCorrente
public class ContaCorrente extends Conta {private double l i m i t e ;
public ContaCorrente ( Corrent is ta corrent i s ta , double saldo , double l i m i t e ) {super ( cor rent i s ta , saldo ) ;t h i s . l i m i t e = l i m i t e ;
}
@Overridepublic boolean r e t i r a r ( double valor ) {
i f ( valor <= t h i s . saldo + t h i s . l i m i t e ) {t h i s . saldo −= valor ;re turn true ;
}return fa lse ;
}
public void depositar ( Cheque cheque ) {t h i s . saldo += cheque. getValor ( ) ;
}
@Overridepublic S t r i ng toS t r i ng ( ) {
return super . toS t r i ng ( ) + " mais l i m i t e de R$ " + t h i s . l i m i t e ;}
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 255 / 526
POO – Herança
Importante sobre a classe ContaCorrente
Observe que estende a classe Conta
Logo, deve chamar algum construtor de Conta
E chama: super( correntista, saldo );
Mas, poderia ser também: super( correntista );
E se não chamasse nenhum? O que aconteceria?
Observe a sobreposição dos métodos retirar e toString
Observe a sobrecarga do método depositar
Ricardo Terra ([email protected]) POO 8 de julho de 2011 256 / 526
POO – Herança
Exemplo Completo
public s t a t i c void main( S t r i ng [ ] args ) {2 Conta c = new Conta ( new Corrent i s ta ( 111 , " Fred " ) , 25.0 ) ;
ContaCorrente cc = new ContaCorrente ( new Corrent i s ta ( 222 , " Luciano " ) , 100.00 , 1000.00 ) ;4
System . out . p r i n t l n ( c ) ; /∗ Fred tem R$25 .00 ∗/6 System . out . p r i n t l n ( cc ) ; /∗ Luciano tem R$100 .00 mais l i m i t e de R$1000 .00 ∗/
8 System . out . p r i n t l n ( c . getSaldo ( ) ) ; /∗ 25.00 ∗/System . out . p r i n t l n ( " Retirada de R$26 . 0 : " + c . r e t i r a r ( 26.0 ) ) ; /∗ fa l se ∗/
10 System . out . p r i n t l n ( c . getSaldo ( ) ) ; /∗ 25.00 ∗/
12 System . out . p r i n t l n ( cc . getSaldo ( ) ) ; /∗ 100.00 ∗/System . out . p r i n t l n ( " Retirada de R$ 200 ,00: " + cc . r e t i r a r ( 200.00 ) ) ; /∗ t rue ∗/
14 System . out . p r i n t l n ( cc . getSaldo ( ) ) ; /∗ −100.00 ∗/
16 cc . depositar ( 50 ) ;System . out . p r i n t l n ( cc . getSaldo ( ) ) ; /∗ −100.00 ∗/
18
cc . depositar ( new Cheque( 60.00 ) ) ;20 System . out . p r i n t l n ( cc . getSaldo ( ) ) ; /∗ 10.00 ∗/
22 Object v [ ] = new Object [ ] { c , cc } ;f o r ( Object x : v ) {
24 System . out . p r i n t l n ( x ) ; /∗ Mesmo que x . toS t r ing ( ) ∗/}
26 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 257 / 526
Poderia ser x.getSaldo()?
POO – Herança
Por que não poderia ser x.getSaldo?Não funciona, porque x está sendo enxergado comoObject
Assim, somente se vê as operações que existem em Object,pois não se pode garantir que o arranjo só tenha objetos dotipo Conta (mesmo tendo, nesse caso específico)
Além disso, é importante mencionar que um objeto não secomporta diferentemente pelo modo como é visto
Referindo-me ao caso do toString
Ricardo Terra ([email protected]) POO 8 de julho de 2011 258 / 526
POO – Herança
ResumoHerança
Visão geralFuncionamento dos construtoresSobreposição de métodosSobrecarga de métodosCapacidade polimórfica (polimorfismo)
Ricardo Terra ([email protected]) POO 8 de julho de 2011 259 / 526
POO – Modificadores
Modificador finalAté agora, vimos o uso do modificador final somente ematributos. No entanto, o modificador final pode ser tambématribuído a métodos e classes
Uso do modificador finalEm atributos: atributo fica imutável
Inicializado uma única vez no construtor
Em métodos: método não pode ser sobrescrito
Terá o mesmo comportamento em todas as subclasses
Em classes: classe não pode ter subclasses
Na árvore de heranças, tal classe será uma folha
Ricardo Terra ([email protected]) POO 8 de julho de 2011 261 / 526
POO – Modificadores
Sessão “Vale a pena ver de novo”: Modificador final ematributos
public class Pessoa {2 private f i n a l S t r i ng nome;
4 public Pessoa ( S t r i ng nome) {t h i s .nome = nome;
6 }
8 public S t r i ng getNome( ) {re turn nome;
10 }}
Pergunta-se:
Onde está o setNome?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 262 / 526
POO – Modificadores
Modificador final em classes. Pode?
1 public class A {
3 }
1 public class B extends A {
3 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 263 / 526
POO – Modificadores
Modificador final em classes. E agora?
1 public f i n a l class A {
3 }
1 public class B extends A {
3 }
Pergunta-se:
Por que não pode?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 264 / 526
POO – Modificadores
Modificador final em método. Pode?
1 public class A {public void f ( ) {
3 System . out . p r i n t l n ( "Opa! " ) ;}
5 }
1 public class B extends A {@Override
3 public void f ( ) {System . out . p r i n t l n ( "Epa! " ) ;
5 }}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 265 / 526
POO – Modificadores
Modificador final em método. E agora?
public class A {2 public f i n a l void f ( ) {
System . out . p r i n t l n ( "Opa! " ) ;4 }
}
1 public class B extends A {@Override
3 public void f ( ) {System . out . p r i n t l n ( "Epa! " ) ;
5 }}
Pergunta-se:
Por que não pode??
E ainda, B pode estender A?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 266 / 526
POO – Modificadores
Perguntas Interessantes...1 Se o método equals da classe Object fosse final, o que
aconteceria?
2 E se o método toString da classe Object fosse final, oque aconteceria?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 267 / 526
POO – Modificadores
Modificador abstractVimos o conceito de classe abstrata quando aprendemosUML, em que uma classe que não tem instâncias e éutilizada somente como mecanismo de reúso e para provêra capacidade polimórfica
Isso é verdade, contudo vamos aprofundar mais no usodesse modificador, inclusive para métodos
Ricardo Terra ([email protected]) POO 8 de julho de 2011 268 / 526
POO – Modificadores
Uso do modificador abstractEm atributos: não existe tal conceito
Em métodos: método não possui implementação
o método e sua classe deverão ser abstratos, pois se a classecontém algum método abstrato, ela deve ser abstrata
deve ser implementado em alguma subclasse concreta, nãonecessariamente a subclasse imediata
Em classes: classe não pode ser instanciada (new)
pode ter nenhum ou todos os métodos abstratos
serve como molde de herança, mecanismo de polimorfismo,melhorar modelagens etc
Ricardo Terra ([email protected]) POO 8 de julho de 2011 269 / 526
POO – Modificadores
Exemplo Conceitual
Ricardo Terra ([email protected]) POO 8 de julho de 2011 270 / 526
POO – Modificadores
Classe A
Método f abstrato, logo a classe deve ser abstrata
Possui também o método g que é concreto
public abstract class A {2 public abstract void f ( ) ;
4 public void g( ) {/∗ . . . ∗/
6 }}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 271 / 526
POO – Modificadores
Classe B1
Classe concreta, pois implementa f
1 public class B1 extends A{@Override
3 public void f ( ) {/∗ . . . ∗/
5 }}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 272 / 526
POO – Modificadores
Classe B2
Classe abstrata, pois não implementa f
Mas, sobrepõe g e define um novo método h
public abstract class B2 extends A{2 @Override
public void g( ) {4 /∗ . . . ∗/
}6
public void h ( ) {8 /∗ . . . ∗/
}10 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 273 / 526
POO – Modificadores
Classe C
Classe concreta, pois implementa f
public class C extends B2 {2 @Override
public void f ( ) {4 /∗ . . . ∗/
}6 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 274 / 526
POO – Modificadores
Utilização Prática 01
Uma classe pode possuir nenhum método abstrato e serabstrata
Isso ocorre quando não se deseja instâncias de tal classee/ou quando a classe serve como molde de herançapossibilitando a capacidade polimórfica
Exemplo
public abstract class A {2 public void f ( ) {
/∗ . . . ∗/4 }
6 public void g( ) {/∗ . . . ∗/
8 }}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 275 / 526
POO – Modificadores
Utilização Prática 01
Um exemplo clássico dessa utilização é a classe Conta
Uma conta pode ser ContaCorrente ou ContaPoupanca,mas não simplesmente Conta
Logo, Conta deve ser abstrata
Aí, com isso, qualquer conta (corrente ou poupança ououtras) poderão ser tratadas como uma simples conta
Ricardo Terra ([email protected]) POO 8 de julho de 2011 276 / 526
POO – Modificadores
Utilização Prática 01 – Classe Conta com modificadores
1 public abstract class Conta {/∗ . . . ∗/
3
public f i n a l double getSaldo ( ) {5 return saldo ;
}7
public f i n a l void depositar ( double valor ) {9 t h i s . saldo += valor ;
}11 /∗ . . . ∗/
13 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 277 / 526
POO – Modificadores
Outros exemplos...Além de Conta podemos vislumbrar outras classes que seencaixam nesse cenário:
Animal
Veiculo
etc
Ricardo Terra ([email protected]) POO 8 de julho de 2011 278 / 526
POO – Modificadores
Utilização Prática 02
O que se pode dizer de comum das “coisas” nos próximosslides?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 279 / 526
POO – Modificadores
Ricardo Terra ([email protected]) POO 8 de julho de 2011 280 / 526
POO – Modificadores
Ricardo Terra ([email protected]) POO 8 de julho de 2011 280 / 526
POO – Modificadores
Ricardo Terra ([email protected]) POO 8 de julho de 2011 280 / 526
POO – Modificadores
Ricardo Terra ([email protected]) POO 8 de julho de 2011 280 / 526
POO – Modificadores
Utilização Prática 02
Então:Todas são figuras!Todas têm cor!Todas têm perímetro e área!
Logo, como modelar?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 281 / 526
POO – Modificadores
Utilização Prática 02 – Modelagem péssima!!!
Mas, por quê?Não existe capacidade polimórficaDuplicação de código
Ricardo Terra ([email protected]) POO 8 de julho de 2011 282 / 526
POO – Modificadores
Utilização Prática 02 – Modelagem muito ruim!!!
Mas, por quê?Pode-se criar objetos do tipo Figura
Métodos area e perimetro tem um implementação banalem Figura e são sobrescritos nas subclasses
Além disso, nada os obriga a serem sobrescritosPor exemplo, método perimetro de Circunferencia
Ricardo Terra ([email protected]) POO 8 de julho de 2011 283 / 526
POO – Modificadores
Utilização Prática 02 – Modelagem ruim!!!
Mas, por quê?Métodos area e perimetro tem um implementação banalem Figura e são sobrescritos nas subclasses
Além disso, nada os obriga a serem sobrescritosPor exemplo, método perimetro de Circunferencia
Ricardo Terra ([email protected]) POO 8 de julho de 2011 284 / 526
POO – Modificadores
Utilização Prática 02 – Modelagem adequada!!!
Mas, por quê?Existe capacidade polimórfica
Não existe duplicação de código
Métodos area e perimetro devem ser sobrescritos nassubclasses concretas
Ricardo Terra ([email protected]) POO 8 de julho de 2011 285 / 526
POO – Modificadores
Utilização Prática 02 – adequada – Classe Figura
1 public abstract class Figura {protected f i n a l S t r i ng cor ;
3
public Figura ( S t r i ng cor ) {5 super ( ) ;
t h i s . cor = cor ;7 }
9 public f i n a l S t r i ng getCor ( ) {re turn t h i s . cor ;
11 }
13 public abstract double perimetro ( ) ;public abstract double area ( ) ;
15 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 286 / 526
Observe que uma classe abstrata podeter construtores. Mesmo não podendo criarinstâncias, as subclasses devem respeitar comose constrói uma figura
POO – Modificadores
Utilização Prática 02 – adequada – Classe Circunferencia
1 public class Circunferencia extends Figura {private Ponto ponto ;
3 private double ra io ;
5 public Circunferencia ( S t r i ng cor , Ponto ponto , double ra io ) {super ( cor ) ;
7 t h i s . ponto = ponto ;t h i s . ra io = raio ;
9 }/∗ . . . ∗/
11 @Overridepublic double area ( ) {
13 re turn Math . P I ∗ Math .pow( t h i s . raio , 2 ) ;}
15
@Override17 public double perimetro ( ) {
return 2 ∗ Math . P I ∗ t h i s . ra io ;19 }
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 287 / 526
POO – Modificadores
Pergunta Interessante...
Uma classe ou método podem ser final e abstract aomesmo tempo?
Não, mas por quê?Se for método, não pode sobrescrever o método abstractpor causa do final que diz que uma versão nãoimplementada do método é a última versão. Isso não fazsentido!
Se for classe, não pode ter subclasses por causa do final eela não pode ter instâncias por causa do abstract. Isso nãofaz sentido!
Ricardo Terra ([email protected]) POO 8 de julho de 2011 288 / 526
POO – Modificadores
Pergunta Interessante...
Uma classe ou método podem ser final e abstract aomesmo tempo?
Não, mas por quê?Se for método, não pode sobrescrever o método abstractpor causa do final que diz que uma versão nãoimplementada do método é a última versão. Isso não fazsentido!
Se for classe, não pode ter subclasses por causa do final eela não pode ter instâncias por causa do abstract. Isso nãofaz sentido!
Ricardo Terra ([email protected]) POO 8 de julho de 2011 288 / 526
POO – Modificadores
Outra Pergunta Interessante...
Porque não se pode instanciar classes abstratas?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 289 / 526
POO – Interface
Problema MotivadorSuponha um sistema de grande porte (10MLOC)desenvolvido em Java e utilizando SGBD MySql
Suponha ainda que suas classes estejam acopladasdiretamente às classes do MySql
Pergunta-se: E se quiser mudar para outro SGBD?
obteremos essa resposta ao longo desta subseção
Ricardo Terra ([email protected]) POO 8 de julho de 2011 291 / 526
POO – Interface
InterfaceInterface não é uma classe, mas um conjunto de requisitospara classes que precisam se adequar à ela
Geralmente, o fornecedor de algum serviço afirma: “Se suaclasse estiver em conformidade com uma determinadainterface, então realizarei o serviço”
Representações UML:
Ricardo Terra ([email protected]) POO 8 de julho de 2011 292 / 526
POO – Interface
InterfacePode ser pensada como uma classe completamenteabstrata em que:
não possui construtores
todos os seus membros (atributos e métodos) são públicos
todos os seus atributos são constantes estáticaspublic static final ...
todos os seus métodos são abstratospublic abstract ...
Mais importante, uma interface é implementada e nãoestendida
justamente porque não há o que estenderainda, uma classe pode implementar n interfaces
Ricardo Terra ([email protected]) POO 8 de julho de 2011 293 / 526
POO – Interface
Interface – SintaxeSuponha a seguinte interface IMatematica:
Essa interface é um contrato, o qual indica que:cálculos que necessitem do PI devem utilizar aqueledeclarado na interface
implementações devem ser capazes de calcular ahipotenusa de um triângulo e o perímetro de umacircunferência
Ricardo Terra ([email protected]) POO 8 de julho de 2011 294 / 526
POO – Interface
Interface – Sintaxe – IMatematica
public inter face IMatematica {2 double PI = 3.141596;
4 double hipotenusa (double a, double b ) ;
6 double perimetroCircunferencia (double ra io ) ;
8 }
ou
public inter face IMatematica {2 public s t a t i c f i n a l double PI = 3.141596;
4 public abstract double hipotenusa (double a, double b ) ;
6 public abstract double perimetroCircunferencia (double ra io ) ;
8 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 295 / 526
Em atributos, não é necessário colocarpublic static final, mas se quiser...
Em métodos, não é necessário colocarpublic abstract, mas se quiser...
POO – Interface
Interface – Sintaxe – Implementações
Suponha agora que foram desenvolvidas duasimplementações dessa interface:
1 TerraMatematica: uma implementação da interfacedesenvolvida por mim
2 AlunoMatematica: uma implementação da interfacedesenvolvida por um aluno
Já adiantando, a ideia é que a aplicação só conheçaIMatematica, ou seja, funcionará com qualquerimplementação sem impacto à aplicação
Ricardo Terra ([email protected]) POO 8 de julho de 2011 296 / 526
POO – Interface
Interface – Sintaxe – TerraMatematica
public class TerraMatematica implements IMatematica {2
@Override4 public double hipotenusa ( double a, double b ) {
re turn Math . sq r t ( Math .pow( a, 2 ) + Math .pow( b, 2 ) ) ;6
} ;8
@Override10 public double perimetroCircunferencia ( double ra io ) {
re turn 2 ∗ PI ∗ ra io ;12 }
14 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 297 / 526
POO – Interface
Interface – Sintaxe – TerraMatematica
public class AlunoMatematica implements IMatematica {2
@Override4 public double hipotenusa ( double a, double b ) {
double x = a∗a + b∗b;6 double r e s u l t = Math . sq r t ( x ) ;
re turn r e s u l t ;8 } ;
10 @Overridepublic double perimetroCircunferencia ( double ra io ) {
12 double r e s u l t = 2 ∗ PI ∗ ra io ;re turn r e s u l t ;
14 }
16 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 298 / 526
POO – Interface
Interface – Sintaxe – Exemplo de Uso
public s t a t i c void main( S t r i ng [ ] args ) {2 IMatematica m = Factory . getMatematica ( ) ;
4 System . out . p r i n t f ( " Sendo a=3 , b=4 , h=%.2 f \n " ,m. hipotenusa ( 3 , 4 ) ) ;
6
System . out . p r i n t f ( " Sendo raio =2.069 , perimetro = %.2 f " ,8 m. perimetroCircunferencia ( 2.069 ) ) ;
}
ImportanteObserve que não se sabe qual a implementação foiretornada pela fábrica, isto é, se abstrai desse detalhe
Assim, pode-se trocar a implementação sem impacto àaplicação
Ricardo Terra ([email protected]) POO 8 de julho de 2011 299 / 526
POO – Interface
Interface – UtilidadeA maior utilidade de interfaces é – sem dúvida alguma –desacoplar a aplicação das implementações
No último exemplo, toda a aplicação conhece apenas ainterface IMatematica sem dependência direta àimplementação utilizada
Ricardo Terra ([email protected]) POO 8 de julho de 2011 300 / 526
POO – Interface
Interface – UtilidadeVoltando ao nosso problema motivador, a solução é autilização de interfaces (mais especificamente o princípiode projeto conhecido como Programação por Interface)
Assim, a Sun Microsystems (hoje Oracle) criou a API JDBCque define como deve ser o acesso ao banco de dadosindependente do SGBD utilizado
Como fez isso? Por meio da criação de várias interfaces
Diante disso, as empresas de SGBDs – como Oracle, MySql,IBM etc – tiveram que criar implementações para cadauma das interfaces da API JDBC
Ao conjunto dessas implementações é dado o nome deconector (connector)
Ricardo Terra ([email protected]) POO 8 de julho de 2011 301 / 526
POO – Interface
Interface – Utilidade
Ricardo Terra ([email protected]) POO 8 de julho de 2011 302 / 526
POO – Interface
Interface – Exemplo do PatoO Pato é um animal que:
voa, mas voa malanda, mas anda malnada, mas nada mal
Assim, essas são ideias de funções/atribuições, por exemplo:
urubu também voa e nada, mas diferente de um patotubarão também nada, mas nada diferente de um pato
É possível uma modelagem que permite que um patopossua essas três funções/atribuições, isto é, possa ser umvoador, um andador e um nadador ao mesmo tempo?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 303 / 526
POO – Interface
Interface – Exemplo do Pato – Solução
Pode-se implementar diversas interfaces, logo a solução é acriação de interfaces para cada função/atribuição:
interface Voador com método voar
interface Andador com método andar
interface Nadador com método nadar
Interface – Exemplo do Pato – Solução
public inter face Voador { . . . }public inter face Andador { . . . }public inter face Nadador { . . . }
public class Pato extends Ave implements Voador , Andador , Nadador { . . . }
public class Urubu extends Ave implements Voador , Andador { . . . }
public class Tubarao extends Peixe implements Nadador { . . . }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 304 / 526
POO – Interface
Interface – Exemplo do Pato – Solução
Desse modo, cada classe implementa as interfaces com osserviços que deseja disponibilizar, veja:
Ricardo Terra ([email protected]) POO 8 de julho de 2011 305 / 526
POO – Herança Múltipla?
Herança Múltipla
Herança Múltipla consiste em uma classe herdar de mais deuma classe. Por exemplo:
public Pessoa extends Mamifero , Animal { . . . }
public RadioRelogio extends Radio , Relogio { . . . }
No entanto, Java não provê herança múltipla. Logo, asdeclarações acima – mesmo lógicas e óbvias para nós –não são válidas na linguagem Java
Porém, válidas em outras linguagens OO, como C++
Ricardo Terra ([email protected]) POO 8 de julho de 2011 307 / 526
POO – Herança Múltipla?
Herança Múltipla
Java optou por não prover herança múltipla devido àcomplexidade gerada ao compilador
Alguns possíveis problemas seriam:
colisão de atributos e métodos
ambiguidade ao se acessar atributos ou invocar métodos
complexidade dos construtores
etc
Ricardo Terra ([email protected]) POO 8 de julho de 2011 308 / 526
POO – Herança Múltipla?
Assim...Na necessidade de herança múltipla, têm-se trêsalternativas bem definidas:
1 Não utilizar herança múltipla, isto é, remodelar o problemade forma que não necessite de herança múltipla
convém salientar que não possuir herança múltipla, nãodiminui o poder de expressão da linguagem
2 Utilizar herança indireta (se possível)isto é, se C quer estender A e B, faça C estender B eB estender A, assim C será também subclasse de A e de B
3 Utilizar interfacesuma classe pode implementar diversas interfaces
Ricardo Terra ([email protected]) POO 8 de julho de 2011 309 / 526
POO – Herança Múltipla?
Alternativa: Herança Indireta
Dado a herança múltipla de Pessoa:public Pessoa extends Mamifero , Animal { . . . }
Como Mamifero é um Animal, pode-se:public Pessoa extends Mamifero { . . . }public Mamifero extends Animal { . . . }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 310 / 526
:
POO – Herança Múltipla?
Alternativa: InterfacesNo entanto, a última alternativa não resolve o problema doRádio Relógio, simplesmente porque Rádio não é umRelógio nem o contrário
Assim, a solução é um pouco complicada1 Criar interfaces para as classes Radio e Relogio
recomenda-se chamá-las de IRadio e IRelogio
2 Fazer RadioRelogio estender Radio e implementarIRelogio (comum estender a mais complexa)
3 Em RadioRelogio, colocar como atributo um objeto do tipoRelogio
4 Implementar os métodos de IRelogio redirecionando paraos métodos do objeto do tipo Relogio
Ricardo Terra ([email protected]) POO 8 de julho de 2011 311 / 526
POO – Herança Múltipla?
Alternativa: Interfaces
Ricardo Terra ([email protected]) POO 8 de julho de 2011 312 / 526
:
POO – Classe Abstrata x Interface
Diferenciando: Classe Abstrata x InterfaceHerdar uma classe abstrata ou uma interface permite apropriedade polimórfica, isto é, se aplica o conceito do éum(a)
Por exemplo: A a = new B()
O tipo A pode ser:
uma classe concreta estendida por B
uma classe abstrata estendida por B
uma interface implementada por B
Contudo, existem diversas diferenças entre classes abstratase interfaces como pode ser observado no próximo slide
Ricardo Terra ([email protected]) POO 8 de julho de 2011 314 / 526
POO – Classe Abstrata x Interface
Diferenciando: Classe Abstrata x Interface
Ricardo Terra ([email protected]) POO 8 de julho de 2011 315 / 526
POO – Exceção
Iniciando...Antes de entrarmos com sintaxe, é importante mencionarque exceção é um mecanismo muito poderoso dalinguagem Java
No entanto, deve-se dominá-lo para não se fazer mau usoÉ poderoso, mas pesado e exige muitos recursos
Ricardo Terra ([email protected]) POO 8 de julho de 2011 317 / 526
POO – Exceção
Tratamento de Exceções
Associado a robustezHabilidade do aplicativo em reagir apropriadamente asituações anormais, ou melhor, uma circunstânciaexcepcional
Circunstância ExcepcionalDivisão por zero (ArithmeticException)
Uso de um índice inválido em arranjo (ArrayIndexOutOfBoundsException)
Acesso a uma referência nula (NullPointerException)
Perda de conexão com um BD (SQLException)
Acesso a um arquivo corrompido (IOException)
Estouro de memória ou pilha (OutOfMemoryError e StackOverflowError)
Ricardo Terra ([email protected]) POO 8 de julho de 2011 318 / 526
POO – Exceção
Tratamento de Exceções
A linguagem Java provê uma forma das exceções seremtratados isoladamente do código que lida com o negócioda aplicação
O código abaixo ilustra a sintaxe utilizada em Java paraseparar o negócio da aplicação do tratamento de falhas
t r y {. . ./∗ negocio da aplicacao ∗/. . .
} catch ( PossivelExcecao e) {. . ./∗ tratamento da exceção ∗/. . .
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 319 / 526
POO – Exceção
Tratamento de Exceções – Premissa
Um método executa ou falha
Se falha, é porque ativa uma exceção
Tratamento de Exceções – Vantagens
Código do negócio separado tratamento de exceçãoblocos distintos
Permite propagar exceções na pilha de chamada defunções
Se a chama b que chama c e esse último ativa umaexceção, tal exceção pode chegar em a
É possível agrupar e diferenciar tipos de erroshierarquia de exceção (fantástica, veremos no próximo slide)
Ricardo Terra ([email protected]) POO 8 de julho de 2011 320 / 526
POO – Exceção
Hierarquia de Exceção
A hierarquia de exceção é um bom exemplo de uso deherança
Um objeto de exceção é sempre de uma classe derivadade java.lang.Throwable
Inclusive, java.lang.Throwable é subclasse dejava.lang.Object
Throwable – Principais Métodos
/∗ Retorna uma mensagem detalhada da exceção ∗/S t r i ng getMessage ( )
/∗ Imprime a exceção e ainda toda a pi lha de execução ∗/void printStackTrace ( )
Ricardo Terra ([email protected]) POO 8 de julho de 2011 321 / 526
POO – Exceção
Hierarquia de Exceção
Ricardo Terra ([email protected]) POO 8 de julho de 2011 322 / 526
POO – Exceção
Hierarquia de Exceção – Classificação
ErrosSubclasses de Error
Impossível de tratá-las, normalmente erros fatais
Exceções Não VerificáveisSubclasses de RuntimeException
O compilador não requer seu tratamento
Exceções VerificáveisAs que não são descendem nem de Error nem deRuntimeException
Devem ser:Ou tratadas ( try / catch / finally )
Ou progagadas ( throws )
Ricardo Terra ([email protected]) POO 8 de julho de 2011 323 / 526
POO – Exceção
Exceção: Tratada ou Propagada?
Quando uma exceção é ativada, existem duas alternativas:
Tratar (resolver o problema)
Progagar (transferir o problema)
Por exemplo: “Piti”ExceptionProblema Tratar? Propagar?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 324 / 526
POO – Exceção
Tratamento de Exceçãotry
Bloco Protegido, executado em completo se nada anormalacontece
catch
Bloco de Tratamento, executado se ocorre uma exceção dotipo indicado. Nunca o deixe vazio!
Um mesmo bloco protegido pode ter várias cláusulas catchAssim, o fluxo é desviado para o bloco catch correspondente
finally
Bloco de Finalização, sempre executado até mesmo depoisdo return de um método
Exceto System.exit()
Ricardo Terra ([email protected]) POO 8 de julho de 2011 325 / 526
POO – Exceção
Tratamento de Exceção – Sintaxe
t r y {. . .. . ./∗ bloco protegido ∗/. . .. . .
} catch ( E1 e) {. . ./∗ bloco executado sse E1 fo r ativada ∗/. . .
} catch ( E2 e) {. . ./∗ bloco executado sse E2 fo r ativada ∗/. . .
} f i n a l l y {. . ./∗ bloco sempre executado ( ativando ou não qualquer exceção) ∗/. . .
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 326 / 526
Pode:
só try
try e catch∗
try e finally
try, catch∗ e finally
POO – Exceção
Tratamento de Exceção – Exemplo 01a
. . .t r y {
a ( ) ; b ( ) ; c ( ) ; d ( ) ;} catch ( E1 e) {
e ( ) ; f ( ) ;} catch ( E2 e) {
g ( ) ; h ( ) ;} catch ( E3 e) {
i ( ) ; j ( ) ;}
m( ) ; n ( ) ;. . .
Pergunta-se: Quais métodos serão executados caso ative...1 exceção E1 no método a?2 exceção E3 no método b?3 exceção E2 no método d?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 327 / 526
POO – Exceção
Tratamento de Exceção – Exemplo 01b
. . .t r y {
a ( ) ; b ( ) ; c ( ) ; d ( ) ;} catch ( E1 e) {
e ( ) ; f ( ) ;} catch ( E2 e) {
g ( ) ; h ( ) ;} catch ( E3 e) {
i ( ) ; j ( ) ;}
m( ) ; n ( ) ;. . .
Pergunta-se
Quais métodos serão executados caso uma RuntimeExceptionseja ativada no método c?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 328 / 526
POO – Exceção
Tratamento de Exceção – Exemplo 02a
. . .t r y {
a ( ) ; b ( ) ; c ( ) ; d ( ) ;} catch ( E1 e) {
e ( ) ; f ( ) ;} catch ( E2 e) {
g ( ) ; h ( ) ;} f i n a l l y {
k ( ) ; l ( ) ;}
m( ) ; n ( ) ;. . .
Pergunta-se: Quais métodos serão executados caso ative...1 exceção E1 no método a?2 exceção E2 no método d?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 329 / 526
POO – Exceção
Tratamento de Exceção – Exemplo 02b
. . .t r y {
a ( ) ; b ( ) ; c ( ) ; d ( ) ;} catch ( E1 e) {
e ( ) ; f ( ) ;} catch ( E2 e) {
g ( ) ; h ( ) ;} f i n a l l y {
k ( ) ; l ( ) ;}
m( ) ; n ( ) ;. . .
Pergunta-se
Quais métodos serão executados caso uma RuntimeExceptionseja ativada no método c?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 330 / 526
POO – Exceção
Tratamento de Exceção – Fins acadêmicos
Como já mencionada, as exceções não verificáveis nãonecessitam ser tratadas
No entanto, para fins acadêmicos iremos fingir o tratamentode tais exceções apenas para facilitar o entendimento
No final desta seção, veremos porque não tratá-las
Serão utilizadas as mais conhecidas:
Divisão por zero (ArithmeticException)
Uso de um índice inválido em arranjo (ArrayIndexOutOfBoundsException)
Acesso a uma referência nula (NullPointerException)
Ricardo Terra ([email protected]) POO 8 de julho de 2011 331 / 526
POO – Exceção
Tratamento de Exceção – Exemplo 03
public i n t divide ( i n t a, i n t b ) {2 t r y {
re turn a / b;4 } catch ( ArithmeticException e) {
e . printStackTrace ( ) ;6 re turn 0;
}8 }
Pergunta-se
O que acontece se a exceção for ativada? E se não for?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 332 / 526
POO – Exceção
Tratamento de Exceção – Exemplo 04
public i n t divide ( i n t a, i n t b ) {2 t r y {
re turn a / b;4 } catch ( ArithmeticException e) {
System . out . p r i n t l n ( " Problema na div isao : " + e . getMessage ( ) ) ;6 re turn 0;
} f i n a l l y {8 System . out . p r i n t f ( " encerrando div isao(%d,%d) " , a, b ) ;
}10 }
Pergunta-se
O que acontece se a exceção for ativada? E se não for?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 333 / 526
POO – Exceção
Tratamento de Exceção – Exemplo 05
public i n t divide ( i n t a, i n t b ) {2 t r y {
re turn a / b;4 } f i n a l l y {
System . out . p r i n t f ( " encerrando div isao(%d,%d) " , a, b ) ;6 }
}
Pergunta-se
O que acontece se alguma exceção for ativada? E se não for?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 334 / 526
POO – Exceção
Tratamento de Exceção – Exemplo 06 – Situação Real
1 public void lerArquivo ( S t r i ng fileName ) {t r y {
3 Reader in = new FileReader ( fileName ) ;LineNumberReader reader = new LineNumberReader( in ) ;
5 while ( reader . ready ( ) ) {System . out . p r i n t l n ( reader . getLineNumber ( ) + " : " + reader . readLine ( ) ) ;
7 }reader . close ( ) ;
9 i n . close ( ) ;} catch ( FileNotFoundException e) {
11 System . out . p r i n t l n ( " Arq . nao ex i s te . Causa : " + e . getMessage ( ) ) ;} catch ( IOException e) {
13 System . out . p r i n t l n ( " E r ro de E/S . Causa : " + e . getMessage ( ) ) ;} catch ( Throwable e) {
15 System . out . p r i n t l n ( " E r ro de Inesperado . Causa : " + e . getMessage ( ) ) ;}
17 }
Pergunta-se1 O que ocorre se uma RuntimeException for ativada?2 Pode inverter a ordem das exceções?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 335 / 526
Se não encontrar oarquivo
Algum erro na leitura doarquivo
Qualquer outro erro
POO – Exceção
Tratamento de Exceção – Exemplo 06 – Situação Real –Explicação
A ordem das exceções deve ser da mais específica para amais genérica
Por exemplo, se Throwable estivesse no 1o bloco catch,qualquer exceção entraria nesse bloco
Porque, na verdade, é verificado se a exceção é subclasseda exceção discriminada no catch
E, como sabemos, todas as exceções são subclasses deThrowable
Como é FileNotFoundException é uma IOException,também não poderia mudar. Logo, nesse exemplo não sepode alterar a ordem do tratamento de exceções
Ricardo Terra ([email protected]) POO 8 de julho de 2011 336 / 526
POO – Exceção
Propagação de Exceçãothrows
Permite ao método chamado delegar o tratamento do erropara o método chamador
Metáfora com chefe mandando funcionário fazer algo ealgum problema aparece para o funcionário
É uma boa prática de programação, pois permite construirsistemas onde tratamento de erros é centralizado
Propagação de Exceção – Sintaxe
Basta colocar no throws no final da assinatura do método
Por exemplo:
public int f() throws E1
private void g( double d ) throws E1, E2
Ricardo Terra ([email protected]) POO 8 de julho de 2011 337 / 526
POO – Exceção
Propagação de Exceção – Exemplo 01
1 public s t a t i c Date str ingToDate ( S t r i ng sd ) {DateFormat dateFormat = new SimpleDateFormat ( "dd/MM/yyyy " ) ;
3 dateFormat . setLenient ( fa l se ) ;t r y {
5 return dateFormat . parse ( sd ) ;} catch ( ParseException e) {
7 re turn new Date ( ) ; /∗ caso erro , retorne " agora " ∗/}
9 }
Think about...Exceção ativada caso o string da data seja inválido
Logo, todas as invocações a esse método com um stringinválido terá a data atual como seu retorno
Mas, se quiséssemos deixar essa decisão para quemchamou?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 338 / 526
POO – Exceção
Propagação de Exceção – Exemplo 01 – Solução
public s t a t i c Date str ingToDate ( S t r i ng sd ) throws ParseException {2 DateFormat dateFormat = new SimpleDateFormat ( "dd/MM/yyyy " ) ;
dateFormat . setLenient ( fa l se ) ;4 return dateFormat . parse ( sd ) ;
}
Então a solução é – caso a exceção seja ativada –progagá-la ao método chamador e não tratá-la
Observe que não mais a trata, mas sim, delega!
Desse modo, cada chamada a esse método terá seupróprio tratamento, pois assim foi delegado a ele
Ricardo Terra ([email protected]) POO 8 de julho de 2011 339 / 526
POO – Exceção
Propagação de Exceção – Exemplo 01 Completo
1 public s t a t i c void main( S t r i ng [ ] args ) {S t r i ng sd = Teclado . l e r S t r i n g ( " Dig i te seu aniversar io " ) ;
3 t r y {Date d = str ingToDate ( sd ) ;
5 System . out . p r i n t f ( "Voce tem %d anos " ,( System . cu r ren t T imeMi l l i s ( ) − d. getTime ( ) ) /31536000000L ) ;
7 } catch ( ParseException e) {System . out . p r i n t l n ( "Data inval ida . Tente novamente . " ) ;
9 }}
11
public s t a t i c Date str ingToDate ( S t r i ng sd ) throws ParseException {13 DateFormat dateFormat = new SimpleDateFormat ( "dd/MM/yyyy " ) ;
dateFormat . setLenient ( fa l se ) ;15 return dateFormat . parse ( sd ) ;
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 340 / 526
POO – Exceção
Propagação de Exceção – Exemplo 02a
public s t a t i c void main( S t r i ng args [ ] ) {t r y {
a ( ) ; b ( ) ; c ( ) ; d ( ) ;} catch ( E1 e) {
e ( ) ; f ( ) ;} catch ( E2 e) {
g ( ) ; h ( ) ;}
m( ) ; n ( ) ;}
public s t a t i c void b ( ) throws E1 {x ( ) ; y ( ) ; z ( ) ;
}
Pergunta-se: Quais métodos serão executados caso ative...1 exceção E1 no método y?2 exceção E2 no método z?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 341 / 526
POO – Exceção
Propagação de Exceção – Exemplo 02b
public s t a t i c void main( S t r i ng args [ ] ) {t r y {
a ( ) ; b ( ) ; c ( ) ; d ( ) ;} catch ( E1 e) {
e ( ) ; f ( ) ;} catch ( E2 e) {
g ( ) ; h ( ) ;}
m( ) ; n ( ) ;}
public s t a t i c void b ( ) throws E1 {x ( ) ; y ( ) ; z ( ) ;
}
Pergunta-se
Quais métodos serão executados caso uma RuntimeExceptionseja ativada no método x?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 342 / 526
POO – Exceção
Propagação de Exceção – Exemplo 03
public s t a t i c void main( S t r i ng args [ ] ) throws E3 {t r y {
a ( ) ; b ( ) ; c ( ) ; d ( ) ;} catch ( E1 e) {
e ( ) ; f ( ) ;}
m( ) ; n ( ) ;}
public s t a t i c void b ( ) throws E1 , E3 {x ( ) ; y ( ) ;t r y {
z ( ) ;} catch ( E2 e) {
g ( ) ; h ( ) ;}
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 343 / 526
Pergunta-se: Quais métodosserão executados caso ative...
exceção E3 no método y?
exceção E2 no método z?
POO – Exceção
Verdades cruéisE se propagarmos todas as exceções em todos osmétodos?
Nesse caso, a exceção vai chegar para a JVM tratarNão creio que seja uma boa ideia (ela derruba a aplicação)
Porque que não precisa tratar exceções do tipoRuntimeException?
Simplesmente porque implicitamente todos os métodos jápropagam exceções deste tipo
Por exemplo, a declaração dos dois métodos abaixo éidêntica:
private void f ( )private void f ( ) throws RuntimeException
Ricardo Terra ([email protected]) POO 8 de julho de 2011 344 / 526
POO – Exceção
Criação de Exceção
Uma exceção é nada mais que uma classe que estendejava.lang.Exception
normalmente sobrescreve o método getMessage
Logo, você pode criar sua própria classe de exceção comatributos, métodos, construtores como uma classe normal
Quando você cria uma exceção, o método que poderáativá-la deve propagar tal exceção
Ativando Exceções
Basta colocar throw antes do objeto de exceção a serativado
Por exemplo:
throw new E1( x, y );
Ricardo Terra ([email protected]) POO 8 de julho de 2011 345 / 526
POO – Exceção
Criação de Exceção – Exemplo Ilustrativo
Para ilustrar a criação de uma exceção, será alterado ométodo retirar da classe Conta
Esse método não mais retornará boolean, mas sim void
E, caso o saldo seja insuficiente, será ativada uma exceçãodo tipo SemSaldoException
Passos1 Criar a exceção SemSaldoException
2 Alterar o método retirar
3 Ajustar o sistema devido a nova forma de uso do método
Ricardo Terra ([email protected]) POO 8 de julho de 2011 346 / 526
POO – Exceção
Criação de Exceção – Exemplo Ilustrativo – Passo 1
public class SemSaldoException extends Exception {2 private double saldo ;
private double valor ;4
public SemSaldoException (double saldo , double valor ) {6 t h i s . saldo = saldo ;
t h i s . valor = valor ;8 }
10 @Overridepublic S t r i ng getMessage ( ) {
12 re turn "Nao f o i poss ive l r e t i r a r R$ " + t h i s . valor+ " , pois o saldo e de R$ " + t h i s . saldo
14 + " . Em outras palavras , fa l tou R$ " + ( valor − saldo ) ;}
16 }
ImportanteEstende Exception e não Throwable, por que?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 347 / 526
POO – Exceção
Criação de Exceção – Exemplo Ilustrativo – Passo 2
public class Conta {2 . . .
public void r e t i r a r ( double valor ) throws SemSaldoException {4 i f ( valor <= t h i s . saldo ) {
t h i s . saldo −= valor ;6 } else {
throw new SemSaldoException ( t h i s . saldo , valor ) ;8 }
}10 . . .
}
Observações
O método retirar agora propaga (throws) a exceção!
Em uma situação específica, o método ativa (throw) aexceção!
Ricardo Terra ([email protected]) POO 8 de julho de 2011 348 / 526
POO – Exceção
Criação de Exceção – Exemplo Ilustrativo – Passo 3
public s t a t i c void main( S t r i ng [ ] args ) {2 Conta c = new Conta ( new Corrent i s ta ( 111 , " Fred " ) , 25.0 ) ;
. . .4 t r y {
c . r e t i r a r ( 20 ) ;6 } catch ( SemSaldoException e) {
System . out . p r i n t l n ( e . getMessage ( ) ) ;8 }
10 t r y {c . r e t i r a r ( 10 ) ;
12 } catch ( SemSaldoException e) {System . out . p r i n t l n ( e . getMessage ( ) ) ;
14 }. . .
16 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 349 / 526
OK!
Exceção Ativada!
Nao foi possivel retirar R$10.0, pois o saldo e de R$5.0.Em outras palavras, faltou R$5.0
POO – Exceção
Para concluir esta seção
Eu entendi que exceções do tipo RuntimeException nãoprecisam ser tratadas e entendi também o throws implícito,mas porque Java não quer que tratemos tais exceções?
Simplesmente, porque são muito fáceis de evitar. Em outraspalavras, se ocorrer com regularidade tais exceções emseu sistema, você é um péssimo programador
Nos próximos slides veremos algumas exceções nãoverificáveis e boas práticas para evitá-las
Ricardo Terra ([email protected]) POO 8 de julho de 2011 350 / 526
POO – Exceção
ArithmeticException – NUNCA!
. . .t r y {
c = a / b;} catch ( ArithmeticException e) {
. . .}. . .
ArithmeticException – SEMPRE!
. . .i f ( b != 0 ) {
c = a / b;}. . .
Ricardo Terra ([email protected]) POO 8 de julho de 2011 351 / 526
POO – Exceção
NullPointerException – NUNCA!
. . .f o r ( Conta c : contas ) {
t r y {System . out . p r i n t l n (c . getNumero ( ) ) ;
} catch ( NullPointerException e) {. . .
}}. . .
NullPointerException – SEMPRE!
. . .f o r ( Conta c : contas ) {
i f ( c != n u l l ) {System . out . p r i n t l n (c . getNumero ( ) ) ;
}}. . .
Ricardo Terra ([email protected]) POO 8 de julho de 2011 352 / 526
POO – Exceção
ArrayIndexOutOfBoundsException – NUNCA!
. . .t r y {
v [ i ] = 50;} catch ( ArrayIndexOutOfBoundsException e) {
. . .}. . .
ArrayIndexOutOfBoundsException – SEMPRE!
. . .i f ( i < v . length ) {
v [ i ] = 50;}. . .
Ricardo Terra ([email protected]) POO 8 de julho de 2011 353 / 526
POO – Exceção
Síntese da Seção
try: bloco protegido
catch: executado se ocorre uma exceção do tipo indicado
finally: sempre executado
throws: na assinatura do método, indicando que elepropaga tal exceção
throw: ativa uma exceção
Ricardo Terra ([email protected]) POO 8 de julho de 2011 354 / 526
Conteúdo
1 Introdução
2 UML
3 Java
4 POO
5 Padrões de ProjetoSingletonDecoratorAbstract Factory
6 Tópicos Relevantes
7 Materiais Complementares
8 Extras
Ricardo Terra ([email protected]) POO 8 de julho de 2011 355 / 526
Padrões de Projeto
Padrão de Projeto
É uma solução para um problema recorrente nodesenvolvimento de sistemas. Consiste em uma descriçãoou modelo de como resolver um problema. Normalmente,mostra relacionamentos e interações entre classes e objetos
Exemplo: Singleton, Decorator, Abstract Factory etc
Nessa disciplina, veremos alguns mais utilizados e relevantesà disciplina
Ricardo Terra ([email protected]) POO 8 de julho de 2011 356 / 526
Padrões de Projeto – Singleton
Singleton
É um padrão de criação que faz com que uma classetenha uma única instância
Para isso:Construtor privado
Assim, somente a própria classe pode criar seus objetos
Um atributo privado e estático chamado instance do tipoda classe
Método sincronizado e estático chamado getInstance queretorna a única instância
Ricardo Terra ([email protected]) POO 8 de julho de 2011 358 / 526
Padrões de Projeto – Singleton
Singleton – Exemplo
1 public class Singleton {private s t a t i c Singleton instance = n u l l ;
3
private Singleton ( ) {5 }
7 public synchronized s t a t i c Singleton getInstance ( ) {i f ( instance == n u l l ) {
9 instance = new Singleton ( ) ;}
11 re turn instance ;}
13 }
Assim...Para obter o objeto da classe, basta:Singleton s = Singleton.getInstance();
Ricardo Terra ([email protected]) POO 8 de julho de 2011 359 / 526
Padrões de Projeto – Decorator
Decorator
É um padrão estrutural que permite – dinamicamente –agregar responsabilidades adicionais a um objeto
É uma alternativa flexível ao uso de subclasses paraextensão de funcionalidades
Largamente utilizado na API de manipulação de arquivosem Java (veja p. 386)
Ricardo Terra ([email protected]) POO 8 de julho de 2011 361 / 526
Padrões de Projeto – Decorator
Estrutura
Ricardo Terra ([email protected]) POO 8 de julho de 2011 362 / 526
Padrões de Projeto – Decorator
ExemploSuponha que você tenha um texto a ser renderizado e quealgumas você você deseja que:
seja exibido normalmente
seja exibido em negrito
seja exibido com um link
seja exibido em negrito como um link
Esse é nosso problema exemplo e a solução é uso dopadrão Decorator
Ricardo Terra ([email protected]) POO 8 de julho de 2011 363 / 526
Padrões de Projeto – Decorator
Exemplo – Diagrama de Classes
Ricardo Terra ([email protected]) POO 8 de julho de 2011 364 / 526
Padrões de Projeto – Decorator
Exemplo – Interface Text
1 public inter face Text {public S t r i ng getRenderization ( ) ; /∗ obtem o codigo HTML ∗/
3 }
Exemplo – Implementação Simples – PlainText
public class P la inText implements Text {2 private S t r i ng text ;
4 public P la inText ( S t r i ng text ) {t h i s . text = text ;
6 }
8 @Overridepublic S t r i ng getRenderization ( ) {
10 re turn t h i s . text ;}
12 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 365 / 526
Padrões de Projeto – Decorator
Exemplo – Decorator Abstrato TextDecorator
1 public abstract class TextDecorator implements Text {protected Text decoratedText ; /∗ texto a decorar ∗/
3
public TextDecorator ( Text decoratedText ) {5 t h i s . decoratedText = decoratedText ;
}7
@Override9 public S t r i ng getRenderization ( ) {
re turn decoratedText . getRenderization ( ) ;11 }
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 366 / 526
Padrões de Projeto – Decorator
Exemplo – Decorator Concreto BoldTextDecorator
public class BoldTextDecorator extends TextDecorator {2
public BoldTextDecorator ( Text decoratedText ) {4 super ( decoratedText ) ;
}6
@Override8 public S t r i ng getRenderization ( ) {
re turn " <b> " + decoratedText . getRenderization ( ) + " </b> " ;10 }
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 367 / 526
Padrões de Projeto – Decorator
Exemplo – Decorator Concreto LinkTextDecorator
public class LinkTextDecorator extends TextDecorator {2 private S t r i ng l i n k ;
4 public LinkTextDecorator ( Text decoratedText , S t r i ng l i n k ) {super ( decoratedText ) ;
6 t h i s . l i n k = l i n k ;}
8
@Override10 public S t r i ng getRenderization ( ) {
re turn " <a href =\" " + t h i s . l i n k + " \"> "12 + decoratedText . getRenderization ( ) + " </a> " ;
}14 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 368 / 526
Padrões de Projeto – Decorator
Exemplo – Uso 1 (simples)
public s t a t i c void main( S t r i ng [ ] args ) {Text texto = new PlainText ( " Ricardo Terra " ) ;System . out . p r i n t l n ( texto . getRenderization ( ) ) ;
}
SaídaRicardo Terra
Ricardo Terra ([email protected]) POO 8 de julho de 2011 369 / 526
Padrões de Projeto – Decorator
Exemplo – Uso 2 (negrito)
public s t a t i c void main( S t r i ng [ ] args ) {Text texto = new BoldTextDecorator (
new PlainText ( " Ricardo Terra " ) ) ;System . out . p r i n t l n ( texto . getRenderization ( ) ) ;
}
Saída<b>Ricardo Terra</b>
Ricardo Terra ([email protected]) POO 8 de julho de 2011 370 / 526
Padrões de Projeto – Decorator
Exemplo – Uso 3 (link)
public s t a t i c void main( S t r i ng [ ] args ) {Text texto = new LinkTextDecorator (
new PlainText ( " Ricardo Terra " ) ," http : / /www. r icardoter ra .com. br " ) ;
System . out . p r i n t l n ( texto . getRenderization ( ) ) ;}
Saída<a href="http://www.ricardoterra.com.br">RicardoTerra</a>
Ricardo Terra ([email protected]) POO 8 de julho de 2011 371 / 526
Padrões de Projeto – Decorator
Exemplo – Uso 4 (link em negrito)
public s t a t i c void main( S t r i ng [ ] args ) {Text texto = new LinkTextDecorator (
new PlainText ( " Ricardo Terra " ) ," http : / /www. r icardoter ra .com. br " ) ;
System . out . p r i n t l n ( texto . getRenderization ( ) ) ;}
Saída<a href="http://www.ricardoterra.com.br"><b>RicardoTerra</b></a>
Ricardo Terra ([email protected]) POO 8 de julho de 2011 372 / 526
Padrões de Projeto
Abstract Factory
Ricardo Terra ([email protected]) POO 8 de julho de 2011 373 / 526
Padrões de Projeto – Abstract Factory
Abstract Factory
É um padrão de criação que fornece uma forma decriação de família de objetos relacionados oudependentes sem especificar suas classes concretas
Assim, os clientes não se acoplam às implementações(classes concretas), mas sim, apenas às interfaces
Isso vai a favor do princípio de programação conhecidocomo Programação por Interface
Ricardo Terra ([email protected]) POO 8 de julho de 2011 374 / 526
Padrões de Projeto – Abstract Factory
Estrutura
Ricardo Terra ([email protected]) POO 8 de julho de 2011 375 / 526
Padrões de Projeto – Abstract Factory
Estrutura – Explicação Básica
Na necessidade de um Button, a aplicação busca arespectiva fábrica
Assim, é retornada um WinFactory ou um OSXFactory
A aplicação não sabe qual fábrica foi retornada, mas,independente de qual fábrica, ela é capaz de criar Button
Devido ao contrato estabelecido pela interface
E assim criará e manipulará botões como Button, isto é,sem saber qual classe concreta realmente estámanipulando
Mais uma vez: Programação por Interfaces
Ricardo Terra ([email protected]) POO 8 de julho de 2011 376 / 526
Padrões de Projeto – Abstract Factory
ExemploSuponha que você tenha um sistema queautomaticamente antes das 12h a interface do sistema sejagráfica e, após esse horário, a interface seja textual
Esse é nosso problema exemplo e a solução é uso dopadrão Abstract Factory
Isto é, teremos duas fábricas: textual e gráfica
Ricardo Terra ([email protected]) POO 8 de julho de 2011 377 / 526
Padrões de Projeto – Abstract Factory
Exemplo – Diagrama de Classes
Ricardo Terra ([email protected]) POO 8 de julho de 2011 378 / 526
Padrões de Projeto – Abstract Factory
Exemplo – Interface Input (alunos devem fazer)
public inter face Input {2 S t r i ng l e r ( ) ;
}
Exemplo – Interface Output
1 public inter face Output {void escrever ( S t r i ng s ) ;
3 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 379 / 526
Padrões de Projeto – Abstract Factory
Exemplo – Implementação Saída Textual – TextualOutput
1 public class TextualOutput implements Output {
3 @Overridepublic void escrever ( S t r i ng s ) {
5 System . out . p r i n t ( s ) ;}
7 }
Exemplo – Implementação Saída Gráfica – GraphicalOutput
1 public class GraphicalOutput implements Output {
3 @Overridepublic void escrever ( S t r i ng s ) {
5 JOptionPane . showMessageDialog( nul l , s ) ;}
7 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 380 / 526
Padrões de Projeto – Abstract Factory
Exemplo – Fábrica Abstrata – IOFactory
1 public abstract class IOFactory {
3 public f i n a l s t a t i c IOFactory getIOFactory ( ) {i f (Calendar . getInstance ( ) . get (Calendar .HOUR_OF_DAY) >= 11) {
5 return new TextualFactory ( ) ;} else {
7 return new GraphicalFactory ( ) ;}
9 }
11 public abstract Input getInput ( ) ;
13 public abstract Output getOutput ( ) ;}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 381 / 526
Padrões de Projeto – Abstract Factory
Exemplo – Fábrica Concreta – TextualFactory
public class TextualFactory extends IOFactory {2
@Override4 public Input getInput ( ) {
return new TextualInput ( ) ;6 }
8 @Overridepublic Output getOutput ( ) {
10 re turn new TextualOutput ( ) ;}
12
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 382 / 526
Padrões de Projeto – Abstract Factory
Exemplo – Fábrica Concreta – GraphicalFactory
1 public class GraphicalFactory extends IOFactory {
3 @Overridepublic Input getInput ( ) {
5 return new GraphicalInput ( ) ;}
7
@Override9 public Output getOutput ( ) {
return new GraphicalOutput ( ) ;11 }
13 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 383 / 526
Padrões de Projeto – Abstract Factory
Exemplo – Uso
public s t a t i c void main( S t r i ng [ ] args ) {Output out = IOFactory . getIOFactory ( ) . getOutput ( ) ;out . escrever ( " Abstract Factory por Ricardo Terra " ) ;
}
Saída
11:10 12:20
Ricardo Terra ([email protected]) POO 8 de julho de 2011 384 / 526
Conteúdo
1 Introdução
2 UML
3 Java
4 POO
5 Padrões de Projeto
6 Tópicos RelevantesStreams
7 Materiais Complementares
8 Extras
Ricardo Terra ([email protected]) POO 8 de julho de 2011 385 / 526
Tópicos Relevantes – Streams
Objetivos desta seção
Manipulação de arquivos texto e binário
Serialização de objetos Java
Ricardo Terra ([email protected]) POO 8 de julho de 2011 387 / 526
Tópicos Relevantes – Streams
Classe java.io.File
Classe responsável em realizar métodos em arquivos físicos.Para se construir um objeto do tipo File, deve saber onome completo do arquivo. Caso o arquivo esteja na raizdo workspace do Eclipse pode apenas passar o nome doarquivo
Caso se passe o nome de um arquivo que não existe, este écriado na primeira necessidade
Exemplo:new F i l e ( "C:\\pasta\\meuArquivo . t x t " )new F i l e ( "meuArquivoNoWorkspace . t x t " )new F i l e ( " /dev/etc/xpto . t x t " )new F i l e ( " / bin " )
Ricardo Terra ([email protected]) POO 8 de julho de 2011 388 / 526
Tópicos Relevantes – Streams
Alguns métodos relevantes
boolean canRead ( ) /∗ Permissão de Lei tu ra? ∗/2
boolean canWrite ( ) /∗ Permissão de Esc r i ta ? ∗/4
/∗ Reconhece o t ipo do arquivo ∗/6 boolean i s F i l e ( )
boolean isD i rectory ( )8
renameTo ( ) /∗ Renomeia o arquivo / d i r e t ó r i o ∗/10
mkdir ( ) /∗ Cria d i r e t ó r i o ∗/12
S t r i ng [ ] l i s t ( ) /∗ L i s t a o conteúdo do d i r e t ó r i o ∗/14
F i l e [ ] l i s t F i l e s ( ) /∗ L i s t a todos os arquivos do d i r e t ó r i o ∗/
Ricardo Terra ([email protected]) POO 8 de julho de 2011 389 / 526
Tópicos Relevantes – Streams
Exemplo java.io.File – Arquivo
1 F i l e f i l e T e x t o = new F i l e ( " arquivoTexto . t x t " ) ;System . out . p r i n t l n ( "Nome do arquivo : " + f i l e T e x t o .getName( ) ) ;
3 System . out . p r i n t l n ( "O arquivo ex i s te? " + f i l e T e x t o . ex i s t s ( ) ) ;System . out . p r i n t l n ( " E um d i r e t o r i o ? " + f i l e T e x t o . i sD i rectory ( ) ) ;
5 i f ( f i l e T e x t o . i s F i l e ( ) ) {System . out . p r i n t l n ( " E um arquivo do d i r e t o r i o : "
7 + f i l e T e x t o . getAbsolutePath ( ) ) ;}
9 System . out . p r i n t l n ( " Posso l e r ? " + f i l e T e x t o .canRead ( ) ) ;System . out . p r i n t l n ( " Posso escrever? " + f i l e T e x t o . canWrite ( ) ) ;
11 System . out . p r i n t l n ( "Renomeou com sucesso? "+ f i l e T e x t o . renameTo( new F i l e ( " renomeado. t x t " ) ) ) ;
Nome do arquivo : arquivoTexto . t x tO arquivo ex i s te? t rueÉ um d i r e t ó r i o ? fa l seÉ um arquivo do d i r e t ó r i o : / Terra / apostilaJava / arquivoTexto . t x tPosso l e r ? t ruePosso escrever? fa l seRenomeou com sucesso? t rue
Ricardo Terra ([email protected]) POO 8 de julho de 2011 390 / 526
Tópicos Relevantes – Streams
Exemplo java.io.File – Diretório
1 F i l e f i l e D i r e t o r i o = new F i l e ( " streams " ) ;System . out . p r i n t l n ( "Nome do arquivo : " + f i l e D i r e t o r i o .getName( ) ) ;
3 System . out . p r i n t l n ( " E um d i r e t o r i o ? " + f i l e D i r e t o r i o . i sD i rectory ( ) ) ;
5 F i l e [ ] f i l e s = f i l e D i r e t o r i o . l i s t F i l e s ( ) ;System . out . p r i n t l n ( "Conteudo do d i r e t o r i o : " ) ;
7 f o r ( F i l e f : f i l e s ) {System . out . p r i n t l n ( " \ t " + f .getName ( ) ) ;
9 }
Nome do arquivo : streamsÉ um d i r e t ó r i o ? t rueConteúdo do d i r e t ó r i o :
ExemploDiretorio . classExemploDiretorio . javaExemploFile . classExemploFile . java
Ricardo Terra ([email protected]) POO 8 de julho de 2011 391 / 526
Tópicos Relevantes – Streams
Tipos principais de streamsTexto
Binário
Ricardo Terra ([email protected]) POO 8 de julho de 2011 392 / 526
Tópicos Relevantes – Streams
Reader
Suas subclasses efetuam leitura textual
Ricardo Terra ([email protected]) POO 8 de julho de 2011 393 / 526
Tópicos Relevantes – Streams
Exemplo Reader
1 t r y {F i l e f i l e = new F i l e ( " arquivoTexto . t x t " ) ;
3 Reader i n = new FileReader ( f i l e ) ;LineNumberReader reader = new LineNumberReader ( in ) ;
5 while ( reader . ready ( ) ) {System . out . p r i n t ( reader . getLineNumber ( ) + " : " ) ;
7 System . out . p r i n t l n ( reader . readLine ( ) ) ;}
9 reader . close ( ) ;in . close ( ) ;
11 } catch ( FileNotFoundException e) {System . out . p r i n t l n ( " Arq . nao ex i s te . Causa : " + e . getMessage ( ) ) ;
13 } catch ( IOException e) {System . out . p r i n t l n ( " E r ro de E/S . Causa : " + e . getMessage ( ) ) ;
15 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 394 / 526
Tópicos Relevantes – Streams
Writer
Suas subclasses efetuam escrita textual
Ricardo Terra ([email protected]) POO 8 de julho de 2011 395 / 526
Tópicos Relevantes – Streams
Exemplo Writer
1 t r y {F i l e f i l e = new F i l e ( " arquivoGravado . t x t " ) ;
3 F i l e W r i t e r out = new F i l e W r i t e r ( f i l e ) ;out . wri te ( " Linguagem Java\n " ) ;
5
P r i n t W r i t e r w r i t e r = new P r i n t W r i t e r ( out ) ;7 w r i t e r . p r i n t l n ( "Aprendendo Streams " ) ;
w r i t e r . p r i n t l n ( " P rofessor Ricardo Terra " ) ;9
w r i t e r . close ( ) ;11 out . close ( ) ;
} catch ( IOException e) {13 System . out . p r i n t l n ( " E r ro de E/S . Causa : " + e . getMessage ( ) ) ;
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 396 / 526
Tópicos Relevantes – Streams
Um exemplo com Reader
A maioria das vezes quando lemos um arquivo em disco éporque queremos extrair informações dele para seremutilizadas pelo aplicativo
Vamos, por exemplo, considerar um arquivo texto em que:
na 1a linha existe números separados por tabulação (‘\t’)
2 4 6 8 10
O programa deverá ler esses números, guardar em umarranjo e depois imprimir a soma deles
No próximo slide demonstra como deve ser feito
Ricardo Terra ([email protected]) POO 8 de julho de 2011 397 / 526
Tópicos Relevantes – Streams
Exemplo Completo Reader
1 t r y {F i l e f i l e = new F i l e ( " entrada . t x t " ) ;
3 Reader i n = new FileReader ( f i l e ) ;LineNumberReader reader = new LineNumberReader ( in ) ;
5
i f ( reader . ready ( ) ) {7 S t r i ng [ ] numeros = reader . readLine ( ) . s p l i t ( " \ t " ) ;
i n t [ ] array = new i n t [numeros . length ] ;9 f o r ( i n t i = 0 ; i < numeros . length ; i ++ ) {
array [ i ] = Integer . parseInt ( numeros [ i ] ) ;11 }
i n t soma = 0;13 f o r ( i n t numero : array ) {
soma += numero ;15 }
System . out . p r i n t l n ( "Soma: " + soma ) ;17 }
19 reader . close ( ) ;in . close ( ) ;
21 } catch . . .
Ricardo Terra ([email protected]) POO 8 de julho de 2011 398 / 526
Tópicos Relevantes – Streams
InputStream
Suas subclasses efetuam leitura binária
Ricardo Terra ([email protected]) POO 8 de julho de 2011 399 / 526
Tópicos Relevantes – Streams
Exemplo InputStream
t r y {2 f i n a l S t r i ng zeros = " 00000000 " ;
F i l e f i l e = new F i l e ( " s ta r . g i f " ) ;4 InputStream i n = new FileInputStream ( f i l e ) ;
i n t i = 0 ;6 while ( ( i = in . read ( ) ) != −1 ) {
S t r i ng s t r = Integer . toB inaryS t r ing ( i ) ;8 System . out . p r i n t ( zeros . subst r ing ( s t r . length ( ) ) + s t r ) ;
}10 i n . close ( ) ;
} catch ( FileNotFoundException e) {12 System . out . p r i n t l n ( " Arq . nao ex i s te . Causa : " + e . getMessage ( ) ) ;
} catch ( IOException e) {14 System . out . p r i n t l n ( " E r ro de E/S . Causa : " + e . getMessage ( ) ) ;
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 400 / 526
Tópicos Relevantes – Streams
OutputStream
Suas subclasses efetuam escrita binária
Ricardo Terra ([email protected]) POO 8 de julho de 2011 401 / 526
Tópicos Relevantes – Streams
Exemplo OutputStream
t r y {2 F i l e f i l e = new F i l e ( " arquivoGravado . bin " ) ;
/∗ Se fo r passado true , o arquivo sera concatenado ∗/4 OutputStream out = new FileOutputStream ( f i l e , fa l se ) ;
out . wri te ( 65 ) ;6 out . wri te ( 66 ) ;
out . wri te ( 67 ) ;8 out . close ( ) ;
} catch ( IOException e) {10 System . out . p r i n t l n ( " E r ro de E/S . Causa : " + e . getMessage ( ) ) ;
}
O que foi gravado?01000001 01000010 01000011
Ricardo Terra ([email protected]) POO 8 de julho de 2011 402 / 526
Tópicos Relevantes – Streams
Lendo e escrevendo objetos – ObjectStream
É possível escrever dados binários em um arquivo e depoislê-los
Para isso, utilizamos as classes ObjectInputStream eObjectOutputStream
Para um objeto ser gravado em um arquivo, ele deveráimplementar java.io.Serializable
Essa interface não tem nenhum método. É só para que Javasaiba que essa classe será persistida
Os tipos primitivos podem ser gravados também semproblema algum
Vejamos alguns exemplos nos próximos slides
Ricardo Terra ([email protected]) POO 8 de julho de 2011 403 / 526
Tópicos Relevantes – Streams
Exemplo ObjectOutputStream
t r y {2 F i l e f i l e = new F i l e ( "dados . bin " ) ;
ObjectOutput out = new ObjectOutputStream (4 new FileOutputStream ( f i l e ) ) ;
6 out . w r i t e I n t ( 65 ) ;out . writeDouble ( 66.9 ) ;
8 out . writeChar ( ’C’ ) ;
10 out . close ( ) ;} catch ( FileNotFoundException e) {
12 System . out . p r i n t l n ( " Arq . nao ex i s te . Causa : " + e . getMessage ( ) ) ;} catch ( IOException e) {
14 System . out . p r i n t l n ( " E r ro de E/S . Causa : " + e . getMessage ( ) ) ;}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 404 / 526
Tópicos Relevantes – Streams
Exemplo ObjectInputStream
1 t r y {F i l e f i l e = new F i l e ( "dados . bin " ) ;
3 ObjectInput i n = new ObjectInputStream (new FileInputStream ( f i l e ) ) ;
5
i n t i = in . readInt ( ) ;7 double d = in . readDouble ( ) ;
char c = in . readChar ( ) ;9
/∗11 ∗ Se fosse a l e i t u r a fosse em ordem diferente ,
∗ os resultados seriam diferentes13 ∗/
System . out . p r i n t f ( "%d %.2 f %c" , i , d, c ) ;15
i n . close ( ) ;17 } catch ( FileNotFoundException e) {
System . out . p r i n t l n ( " Arq . nao ex i s te . Causa : " + e . getMessage ( ) ) ;19 } catch ( IOException e) {
System . out . p r i n t l n ( " E r ro de E/S . Causa : " + e . getMessage ( ) ) ;21 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 405 / 526
Tópicos Relevantes – Streams
Lendo e escrevendo objetos – ObjectStreamMas, o interessante é gravarmos um objeto de uma classe(que deve estender java.io.Serializable) e funcionado mesmo modo só que utilizará o método writeObject ereadObject
Além disso, perceberá que teremos que tratar mais umaexceção que possa vir a ocorrer:ClassNotFoundException
Pois, quando você ler o objeto de um arquivo, a classe desseobjeto pode não existir no seu projeto
Ricardo Terra ([email protected]) POO 8 de julho de 2011 406 / 526
Tópicos Relevantes – Streams
Suponha a classe Aluno
1 public class Aluno implements Ser ia l i zab le {private i n t matricula ;
3 private S t r i ng nome;private Date dataNascimento ;
5
public Aluno ( i n t matricula , S t r i ng nome, Date dataNascimento) {7 super ( ) ;
t h i s . matricula = matricula ;9 t h i s .nome = nome;
t h i s . dataNascimento = dataNascimento ;11 }
13 @Overridepublic S t r i ng toS t r ing ( ) {
15 re turn t h i s . matricula + " − " + t h i s .nome + " − "+ Conversor . dateToStr ing (
17 t h i s . dataNascimento , "dd/MM/yyyy " ) ;}
19
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 407 / 526
Tópicos Relevantes – Streams
Exemplo ObjectOutputStream com Aluno
1 t r y {F i l e f i l e = new F i l e ( " aluno . bin " ) ;
3 ObjectOutput out = new ObjectOutputStream (new FileOutputStream ( f i l e ) ) ;
5
Aluno a = new Aluno ( 1 , " Carlos Eduardo da S i l v a " , new Date ( 0 ) ) ;7 out . writeObject ( a ) ;
9 out . close ( ) ;} catch ( FileNotFoundException e) {
11 System . out . p r i n t l n ( " Arq . nao ex i s te . Causa : " + e . getMessage ( ) ) ;} catch ( IOException e) {
13 System . out . p r i n t l n ( " E r ro de E/S . Causa : " + e . getMessage ( ) ) ;}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 408 / 526
Tópicos Relevantes – Streams
Exemplo ObjectInputStream com Aluno
1 t r y {F i l e f i l e = new F i l e ( " aluno . bin " ) ;
3 ObjectInput i n = new ObjectInputStream (new FileInputStream ( f i l e ) ) ;
5
Aluno a = ( Aluno ) in . readObject ( ) ;7 System . out . p r i n t l n ( a ) ;
9 i n . close ( ) ;} catch ( ClassNotFoundException e) {
11 System . out . p r i n t l n ( " Classe nao ex i s te . Causa : " + e . getMessage ( ) ) ;} catch ( FileNotFoundException e) {
13 System . out . p r i n t l n ( " Arq . nao ex i s te . Causa : " + e . getMessage ( ) ) ;} catch ( IOException e) {
15 System . out . p r i n t l n ( " E r ro de E/S . Causa : " + e . getMessage ( ) ) ;}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 409 / 526
Tópicos Relevantes – Streams
Lendo e escrevendo objetos – ObjectStreamO exemplo anterior pode até ser interessante, mas umaluno por arquivo não é a melhor solução
Soluções:Você poderia inserir vários alunos e depois ir lendo até o finaldo arquivo
ou
Gravar uma coleção de alunos no arquivo
Ricardo Terra ([email protected]) POO 8 de julho de 2011 410 / 526
Tópicos Relevantes – Streams
Exemplo ObjectOutputStream com vários objetos Aluno
t r y {2 F i l e f i l e = new F i l e ( " alunos . bin " ) ;
FileOutputStream out = new FileOutputStream ( f i l e ) ;4 ObjectOutput objectOut = new ObjectOutputStream ( out ) ;
6 objectOut . writeObject ( new Aluno ( 1 , " Carlos " , new Date ( 0 ) ) ) ;objectOut . writeObject ( new Aluno ( 2 , " Maria " , new Date ( 0 ) ) ) ;
8 objectOut . writeObject ( new Aluno ( 3 , " Roberto " , new Date ( 0 ) ) ) ;
10 objectOut . close ( ) ;out . close ( ) ;
12 } catch ( IOException e) {System . out . p r i n t l n ( " E r ro de E/S . Causa : " + e . getMessage ( ) ) ;
14 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 411 / 526
Tópicos Relevantes – Streams
Exemplo ObjectInputStream com vários objetos Aluno
t r y {2 F i l e f i l e = new F i l e ( " alunos . bin " ) ;
Fi leInputStream i n = new FileInputStream ( f i l e ) ;4 ObjectInput objectIn = new ObjectInputStream ( in ) ;
6 while ( objectIn . available ( ) > 0 ) {Aluno a = ( Aluno ) objectIn . readObject ( ) ;
8 System . out . p r i n t l n ( a ) ;}
10
objectIn . close ( ) ;12 i n . close ( ) ;
} catch ( ClassNotFoundException e) {14 System . out . p r i n t l n ( " Classe nao ex i s te . " + e . getMessage ( ) ) ;
} catch ( FileNotFoundException e) {16 System . out . p r i n t l n ( " Arq . nao ex i s te . " + e . getMessage ( ) ) ;
} catch ( IOException e) {18 System . out . p r i n t l n ( " E r ro de E/S . Causa : " + e . getMessage ( ) ) ;
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 412 / 526
Tópicos Relevantes – Streams
Exemplo ObjectOutputStream com coleção de objetos Aluno
1 t r y {F i l e f i l e = new F i l e ( " aluno . bin " ) ;
3 ObjectOutput out = new ObjectOutputStream (new FileOutputStream ( f i l e ) ) ;
5
L i s t <Aluno> alunos = new Ar rayL i s t <Aluno > ( ) ;7 alunos .add( new Aluno ( 1 , " Carlos Eduardo " , new Date ( 0 ) ) ) ;
alunos .add( new Aluno ( 2 , " Maria Aparecida " , new Date ( ) ) ) ;9 alunos .add( new Aluno ( 3 , " Roberto Carlos " , new Date ( 0 ) ) ) ;
out . writeObject ( alunos ) ;11
out . close ( ) ;13 } catch ( FileNotFoundException e) {
System . out . p r i n t l n ( " Arq . nao ex i s te . Causa : " + e . getMessage ( ) ) ;15 } catch ( IOException e) {
System . out . p r i n t l n ( " E r ro de E/S . Causa : " + e . getMessage ( ) ) ;17 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 413 / 526
Tópicos Relevantes – Streams
Exemplo ObjectInputStream com coleção de objetos Aluno
t r y {2 F i l e f i l e = new F i l e ( " aluno . bin " ) ;
ObjectInput i n = new ObjectInputStream (4 new Fi leInputStream ( f i l e ) ) ;
6 L i s t <Aluno> alunos = ( L i s t <Aluno>) in . readObject ( ) ;f o r ( Aluno a : alunos ) {
8 System . out . p r i n t l n ( a ) ;}
10
i n . close ( ) ;12 } catch ( ClassNotFoundException e) {
System . out . p r i n t l n ( " Classe nao ex i s te . Causa : " + e . getMessage ( ) ) ;14 } catch ( FileNotFoundException e) {
System . out . p r i n t l n ( " Arq . nao ex i s te . Causa : " + e . getMessage ( ) ) ;16 } catch ( IOException e) {
System . out . p r i n t l n ( " E r ro de E/S . Causa : " + e . getMessage ( ) ) ;18 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 414 / 526
Tópicos Relevantes – Streams
Lendo e escrevendo objetos – ObjectStream1 Copiar um arquivo texto para um outro arquivo utilizando
FileReader e FileWriter
2 Copiar uma arquivo binário (imagem, por exemplo) paraum outro arquivo utilizando InputStream e OutputStream
3 Ler um arquivo texto utilizando LineNumberReader e depoisgravá-lo ao inverso utilizando PrintWriter
Por exemplo, arquivo origem está escrito “ABCDE”, o dedestino estará escrito “EDCBA”Dica: Utilize o método inverse de um objeto da classeStringBuilder
Ricardo Terra ([email protected]) POO 8 de julho de 2011 415 / 526
Conteúdo
1 Introdução
2 UML
3 Java
4 POO
5 Padrões de Projeto
6 Tópicos Relevantes
7 Materiais ComplementaresClasses WrapperClasse MathClasse String
Classe DateClasse StringBuilder e StringBuffer
Classe StringTokenizer
Classe IteratorColeções
8 ExtrasRicardo Terra ([email protected]) POO 8 de julho de 2011 416 / 526
Materiais Complementares
Classes Wrapper
Ricardo Terra ([email protected]) POO 8 de julho de 2011 417 / 526
Materiais Complementares – Classes Wrapper
Para cada tipo primitivo de Java existe uma classecorrespondente que basicamente armazena o tipoprimitivo e provê diversas operações comuns, por exemplo:
converter um string para o tipo em questão
obter sua representação binária
Essa classe é denominada classe Wrapper
com esse recurso, um arranjo de objetos pode conter “tiposprimitivos”
Ricardo Terra ([email protected]) POO 8 de julho de 2011 418 / 526
Materiais Complementares – Classes Wrapper
Tipo Primitivo Classe Wrapperchar Characterbyte Byteshort Shortint Integerlong Longfloat Floatdouble Double
Resumo:Exatamente o nome do tipo primitivo iniciando com caixaalta, exceto: Character e Integer
Ricardo Terra ([email protected]) POO 8 de julho de 2011 419 / 526
Materiais Complementares – Classes Wrapper
Convertendo um tipo primitivo para um objeto wrapperToda classe wrapper tem um construtor a partir de seu tipoprimitivo e de um string (exceto Character)
Exemplo:Integer i = new Integer ( 231 ) ;Integer i = new Integer ( " 231 " ) ;
Ricardo Terra ([email protected]) POO 8 de julho de 2011 420 / 526
Materiais Complementares – Classes Wrapper
Convertendo um string para um tipo primitivo
Uma outra utilidade de uma classe wrapper é a deconverter um string para um tipo primitivo correspondente(exceto Character)
Exemplo:i n t i = Integer . parseInt ( " 231 " ) ;double d = Double . parseDouble ( " 231e−2" ) ;
Ricardo Terra ([email protected]) POO 8 de julho de 2011 421 / 526
Materiais Complementares – Classes Wrapper
Autoboxing e unboxing
A partir do Java 5, a linguagem provê uma formaautomática de conversão de um tipo primitivo para o seuobjeto wrapper e vice-versa
Assim, essa tarefa é realizada de forma completamentetransparente, observe:
Integer i = 231;i n t j = new Integer ( 231 ) ;i n t h = i ;
Ricardo Terra ([email protected]) POO 8 de julho de 2011 422 / 526
Materiais Complementares – Classes Wrapper – Character
Alguns métodos relevantes
public s t a t i c boolean i s D i g i t ( char ch ) ;2 public s t a t i c boolean i s L e t t e r ( char ch ) ;
public s t a t i c boolean isLowerCase ( char ch ) ;4 public s t a t i c boolean isUpperCase ( char ch ) ;
public s t a t i c char toLowerCase ( char ch ) ;6 public s t a t i c char toUpperCase ( char ch ) ;
Exemplo
char ch = ’a’ ;System . out . p r i n t l n ( Character . i s D i g i t ( ch ) ) ; /∗ fa l se ∗/System . out . p r i n t l n ( Character . i s L e t t e r ( ch ) ) ; /∗ t rue ∗/
i f ( Character . isLowerCase ( ch ) ) { /∗ t rue ∗/ch = Character . toUpperCase ( ch ) ;
}
System . out . p r i n t l n ( ch ) ;}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 423 / 526
Materiais Complementares – Classes Wrapper – Integer
Alguns métodos relevantes
1 public s t a t i c S t r i ng toB inaryS t r ing ( i n t i ) ;public s t a t i c S t r i ng toHexStr ing ( i n t i ) ;
Exemplo
System . out . p r i n t l n ( Integer . toB inaryS t r ing ( i ) ) ; /∗ 11100111 ∗/System . out . p r i n t l n ( Integer . toHexStr ing ( i ) ) ; /∗ e7 ∗/
Ricardo Terra ([email protected]) POO 8 de julho de 2011 424 / 526
Materiais Complementares – Classes Wrapper – Double
Alguns métodos relevantes
public boolean i s I n f i n i t e ( ) ;2 public s t a t i c boolean i s I n f i n i t e (double d ) ;
4 public boolean isNaN ( ) ;public s t a t i c boolean isNaN (double d ) ;
Exemplo
double d = 2.0 / 0 ;System . out . p r i n t l n ( Double . i s I n f i n i t e ( d ) ) ; /∗ t rue ∗/
d = 0.0 / 0 ;System . out . p r i n t l n ( Double . isNaN ( d ) ) ; /∗ t rue ∗/
Ricardo Terra ([email protected]) POO 8 de julho de 2011 425 / 526
Materiais Complementares
Classe Math
Ricardo Terra ([email protected]) POO 8 de julho de 2011 426 / 526
Materiais Complementares – Classe Math
Classe java.lang.Math
Existe uma classe na própria API Java que lida comatribuições matemáticas
Essa classe chama-se Math e está no pacote java.langÉ importante mencionar que classes no pacote java.langnão necessitam ser importadas
Math contém diversas operações e constantes largamenteutilizadas, como exponenciação, raiz quadrada, logaritmo,seno, coseno, tangente etc
No próximo slide veremos a utilização de algumas delas
Ricardo Terra ([email protected]) POO 8 de julho de 2011 427 / 526
Materiais Complementares – Classe Math
Método sqrt
Retorna a raiz quadrada de um número, i.e.,√
n
Assinatura:public static double sqrt (double n)
Exemplo
double r a i z = Math . sq r t ( a ) ; /∗ Suponha a = 4 , logo . . . ∗/
Ricardo Terra ([email protected]) POO 8 de julho de 2011 428 / 526
Materiais Complementares – Classe Math
Método pow
Retorna um número elevado a outro, i.e., ab
Assinatura:public static double pow (double a, double b)
Exemplo
double exp = Math .pow( b, 2 ) ; /∗ Suponha b = 3 , logo . . . ∗/
Ricardo Terra ([email protected]) POO 8 de julho de 2011 429 / 526
Materiais Complementares – Classe Math
Constante PI
Além de operações, a classe Math possui uma série deconstantes, por exemplo, PI
Assinatura:public static final double PI = 3.141596...
Exemplo
private s t a t i c double area( double ra io ) {return Math . PI ∗ Math .pow( raio , 2 ) ;
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 430 / 526
Materiais Complementares – Classe Math
Método abs
Retorna o valor absoluto
Assinatura:public static double abs (double a)
Exemplo
double absoluto = Math . abs ( −4.6 ) ;
Ricardo Terra ([email protected]) POO 8 de julho de 2011 431 / 526
Materiais Complementares – Classe Math
Método ceil
Retorna o valor “arredondado para cima”
Assinatura:public static double ceil (double a)
Exemplo
double acima = Math . cei l ( 4.0001 ) ;
Ricardo Terra ([email protected]) POO 8 de julho de 2011 432 / 526
Materiais Complementares – Classe Math
Método floor
Retorna o valor “arredondado para baixo”
Assinatura:public static double floor (double a)
Exemplo
double abaixo = Math . f l o o r ( 4.9999 ) ;
Ricardo Terra ([email protected]) POO 8 de julho de 2011 433 / 526
Materiais Complementares – Classe Math
Método max
Retorna o maior valor entre dois números
Assinatura:public static double max (double a, double b)
Exemplo
double maior = Math .max( a, b ) ;
Ricardo Terra ([email protected]) POO 8 de julho de 2011 434 / 526
Materiais Complementares – Classe Math
Método min
Retorna o menor valor entre dois números
Assinatura:public static double min (double a, double b)
Exemplo
double menor = Math . min ( a, b ) ;
Ricardo Terra ([email protected]) POO 8 de julho de 2011 435 / 526
Materiais Complementares – Classe Math
Método round
Retorna o valor arredondadoSe < x .5→ x
Se ≥ x .5→ x + 1
Assinatura:public static long round (double a)
Exemplo
long arredondadoParaCima = Math . round ( 4.5 ) ;long arredondadoParaBaixo = Math . round ( 4.49999 ) ;
Ricardo Terra ([email protected]) POO 8 de julho de 2011 436 / 526
Materiais Complementares – Classe Math
Método random
Retorna um valor aleatório n, onde 0.0 ≤ n < 1.0
Assinatura:public static double random ()
Exemplo
double aleator io = Math . random ( ) ;
Exemplo – Sorteio de um número
i n t num = Teclado . le r In teger ( " D ig i te o numero de concorrentes " ) ;
System . out . p r i n t f ( "O vencedor f o i %d" ,( i n t ) Math . cei l ( Math . random ( ) ∗ num ) ) ;
Ricardo Terra ([email protected]) POO 8 de julho de 2011 437 / 526
Materiais Complementares – Classe Math
Método sin
Retorna o seno do valor passado (em radianos)
Assinatura:public static double sin (double a)
Exemplo
double seno = Math . s in ( Math . P I / 2 ) ; /∗ 1 , no caso ∗/
Outros métodosExistem também:
cos
tan
...
Ricardo Terra ([email protected]) POO 8 de julho de 2011 438 / 526
Materiais Complementares
Classe String
Ricardo Terra ([email protected]) POO 8 de julho de 2011 439 / 526
Materiais Complementares – Classe String
Em Java, String é uma classe
Logo, possui diversos métodos já implementados quefacilitam a tarefa de programar
Por exemplo, toUpperCase, toLowerCase, charAt etc
Um objeto do tipo String é imutávelIsto é, seus métodos nunca alteram o string, mas sim,retornam um novo objeto String
Quando você “altera” um string, na verdade, um novostring é criado e o coletor de lixo (Garbage Collector ouGC) fica responsável por liberar a área de mémória anterior
Ricardo Terra ([email protected]) POO 8 de julho de 2011 440 / 526
Materiais Complementares – Classe String
Correto, mas não era a intenção
S t r i ng nome = " Ricardo " ;nome. toUpperCase ( ) ; /∗ O retorno f o i ignorado ∗/System . out . p r i n t l n ( nome ) ; /∗ Imprimira Ricardo ∗/
Correto
S t r i ng nome = " Ricardo " ;nome = nome. toUpperCase ( ) ; /∗ Atr ibu iu o retorno ao nome ∗/System . out . p r i n t l n ( nome ) ; /∗ Imprimira RICARDO ∗/
Ricardo Terra ([email protected]) POO 8 de julho de 2011 441 / 526
Materiais Complementares – Classe String
Criando um stringInvocando algum construtor da classe String ou utilizandoa notação simplificada
Exemplo
S t r i ng capital = " Belo Horizonte " ;
ou
S t r i ng capital = new St r ing ( " Belo Horizonte " ) ;
Ricardo Terra ([email protected]) POO 8 de julho de 2011 442 / 526
Materiais Complementares – Classe String
Comparando stringsMuitos fazem a comparação de strings utilizando ooperador ==, mas isso é completamente errado
A comparação com == com objetos, simplesmentecompara se eles estão na mesma área de memória
Em Java, a comparação com == entre strings até funcionadevido a um recurso chamado pool de literais, mas ainda éerrado!
Ricardo Terra ([email protected]) POO 8 de julho de 2011 443 / 526
Materiais Complementares – Classe String
Pool de literaisInternamente, Java mantém um pool de literais string quesão utilizadas pela aplicação
Quando necessita-se criar um string, o compilador verificase tal string já existe no pool
Se não existir, cria-se o string e o adiciona no poolCaso exista, o compilador não cria o string, simplesmente usao existente
O uso do pool ajuda a economizar memória e só é possíveldevido a imutalidade de objetos da classe String
Ricardo Terra ([email protected]) POO 8 de julho de 2011 444 / 526
Materiais Complementares – Classe String
Errado
S t r i ng s t r 1 = " Belo Horizonte " ;S t r i ng s t r 2 = " Belo Horizonte " ;
i f ( s t r 1 == s t r 2 ) { /∗ ERRADO. NUNCA FACA ISSO ! ∗/System . out . p r i n t l n ( " S t r i n g s sao iguai s " ) ;
}
Correto
S t r i ng s t r 1 = " Belo Horizonte " ;S t r i ng s t r 2 = " Belo Horizonte " ;
i f ( s t r 1 . equals ( s t r 2 ) ) {System . out . p r i n t l n ( " S t r i n g s sao iguai s " ) ;
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 445 / 526
Materiais Complementares – Classe String
Comparação
A comparação de strings leva-se em conta a codificaçãoUnicode. O compilador ao testar se dois strings são iguais, éavaliado caractere por caractere, i.e., se o código Unicodede ambos coincide. Isso traz algumas implicações:
A comparação normal (com equals) de strings écase-sensitive:“Brasil” 6= “brasil”
A comparação de strings é accent-sensitive:“Paraná” 6= “Parana”
A comparação de strings diferencia símbolos com adornosdos sem adornos:“La niña” 6= “La nina”“Caçula” 6= “Cacula”
Ricardo Terra ([email protected]) POO 8 de julho de 2011 446 / 526
Materiais Complementares – Classe String
Comparação
Como já citado, a comparação normal de strings érealizada por meio do método equals:
Exemplo
S t r i ng s t r 1 = " Belo Horizonte " ;S t r i ng s t r 2 = " Belo Horizonte " ;
i f ( s t r 1 . equals ( s t r 2 ) ) {System . out . p r i n t l n ( " S t r i n g s sao iguai s " ) ;
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 447 / 526
Materiais Complementares – Classe String
Comparação
Contudo, existe um modo de comparar strings semsensibilidade de caixa, i.e., sem diferenciar letras em caixaalta e caixa baixa por meio do método equalsIgnoreCase
Exemplo
S t r i ng s t r 1 = " Belo Horizonte " ;S t r i ng s t r 2 = " bElO hOrIzOnTe " ;
i f ( s t r 1 . equalsIgnoreCase ( s t r 2 ) ) {System . out . p r i n t l n ( " S t r i n g s sao iguai s " ) ;
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 448 / 526
Materiais Complementares – Classe String
Comparação
Existem outros métodos interessantes de comparação destrings. São eles:
startsWith: Verifica se um string inicia com um certo string
endsWith: Verifica se um string termina com um certo string
regionMatches: Verifica se um substring de um string contémum substring de um outro string (ideia complexa, mas útil)
compareTo: Verifica se um string é igual, maior ou menor queoutro string
Ricardo Terra ([email protected]) POO 8 de julho de 2011 449 / 526
Materiais Complementares – Classe String
Exemplo
S t r i ng s t r = "O rato roeu a roupa do r e i de Roma" ;
System . out . p r i n t f ( "Comeca com \"O\"? %b\n " , s t r . s ta r t sW i th ( "O" ) ) ;
System . out . p r i n t f ( " Termina com \"Roma\"? %b\n " ,s t r . endsWith ( "Roma" ) ) ;
/∗Compara se ’ s t r ’ da posicao 2 a 5 e igual o s t r i n g " Jerry , o rato ! "da posicao 9 a 12∗/
System . out . p r i n t f ( "Verdade? %b\n " ,s t r . regionMatches ( 2 , " Jerry , o rato ! " , 9 , 4 ) ) ;
System . out . p r i n t l n ( "ABC" . compareTo( "ABC" ) ) ; /∗ 0 , sao iguai s ∗/System . out . p r i n t l n ( "ABC" . compareTo( "BCD" ) ) ; /∗ −1, "ABC" e menor ∗/System . out . p r i n t l n ( "BCD" . compareTo( "ABC" ) ) ; /∗ 1 , "BCD" e maior ∗/
Ricardo Terra ([email protected]) POO 8 de julho de 2011 450 / 526
Materiais Complementares – Classe String
Extração de partes de um string
Existem dois métodos comuns para extrair partes de umstring:
substring: Extrai um substring a partir de uma posição comou sem limite superior (método sobrecarregado)
charAt: Extrai um caractere em uma determinada posição(observe que a contagem começa de 0)
Exemplo
S t r i ng s t r = " The quick brown fox jumps over the lazy dog" ;
System . out . p r i n t l n ( s t r . subst r ing ( 35 ) ) ; /∗ " lazy dog" ∗/System . out . p r i n t l n ( s t r . subst r ing ( 4 , 9 ) ) ; /∗ " quick " ∗/
System . out . p r i n t f ( "%c" , s t r . charAt ( 0 ) ) ; /∗ ’ T ’ ∗/System . out . p r i n t f ( "%c" , s t r . charAt ( 8 ) ) ; /∗ ’ k ’ ∗/
Ricardo Terra ([email protected]) POO 8 de julho de 2011 451 / 526
Materiais Complementares – Classe String
Tamanho de um string
Basta utilizar o método length
Exemplo
S t r i ng s t r = " The quick brown fox jumps over the lazy dog" ;
System . out . p r i n t f ( "Tamanho: %d" , s t r . length ( ) ) ; /∗ 43 ∗/
/∗ Imprime o s t r i ng , mas caractere a caractere ∗/f o r ( i n t i = 0 ; i < s t r . length ( ) ; i ++ ) {
System . out . p r i n t f ( "%c" , s t r . charAt ( i ) ) ;}
/∗ Imprime o inverso do s t r i n g ( caractere a caractere ) ∗/f o r ( i n t i = s t r . length ( ) − 1; i >= 0 ; i−− ) {
System . out . p r i n t f ( "%c" , s t r . charAt ( i ) ) ;}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 452 / 526
Materiais Complementares – Classe String
Concatenando strings
Basta utilizar o operador +, mas também pode usar ométodo concat (desnecessário)
Exemplo
S t r i ng f i rstName = " Ricardo " ;S t r i ng lastName = " Terra " ;
S t r i ng name = firstName + " " + lastName ;System . out . p r i n t l n ( name ) ; /∗ Ricardo Terra ∗/
S t r i ng nameFormatted = lastName . concat ( " , " ) . concat ( f irstName ) ;System . out . p r i n t l n ( nameFormatted ) ; /∗ Terra , Ricardo ∗/
Ricardo Terra ([email protected]) POO 8 de julho de 2011 453 / 526
Materiais Complementares – Classe String
Localizando strings
Existem dois métodos comuns para localizar strings em umstring:
indexOf: Procura a primeira ocorrência do string e retorna oíndice que ela começa. Caso não exista, retorna -1
lastIndexOf: Procura a última ocorrência do string e retornao índice que ela começa. Caso não exista, retorna -1
Exemplo
S t r i ng s t r = " The quick brown fox jumps over the lazy dog" ;
System . out . p r i n t f ( " \" fox \"? %d\n " , s t r . indexOf ( " fox " ) ) ; /∗ 16 ∗/System . out . p r i n t f ( " \"cat\"? %d\n " , s t r . indexOf ( " cat " ) ) ; /∗ −1 ∗/
System . out . p r i n t f ( " \"he\"? %d\n " , s t r . indexOf ( "he" ) ) ; /∗ 1 ∗/System . out . p r i n t f ( " \"he\"? %d\n " , s t r . lastIndexOf ( "he" ) ) ; /∗ 32 ∗/
Ricardo Terra ([email protected]) POO 8 de julho de 2011 454 / 526
Materiais Complementares – Classe String
Formatando strings
Existem três métodos comuns para formatar strings:toLowerCase: Retorna um string toda em caixa baixa
toUpperCase: Retorna um string toda em caixa alta
trim: Retorna um string sem espaços em branco no início eno fim
Exemplo
S t r i ng s t r = " Jose " ;
System . out . p r i n t l n ( " < " + s t r . toLowerCase ( ) + " > " ) ; /∗ < jose > ∗/
System . out . p r i n t l n ( " < " + s t r . toUpperCase ( ) + " > " ) ; /∗ < JOSE > ∗/
System . out . p r i n t l n ( " < " + s t r . t r im ( ) + " > " ) ; /∗ <Jose> ∗/
Ricardo Terra ([email protected]) POO 8 de julho de 2011 455 / 526
Materiais Complementares – Classe String
Um pouco de expressão regular
É possível verificar se um string segue uma expressão regular.Para isso, deve-se utilizar o método matches
Exemplo
S t r i ng s t r = Teclado . l e r S t r i n g ( " Carro com ’ F ’ e termina com ’ i ’ " ) ;
i f ( s t r . matches ( " F .∗ i " ) ) {System . out . p r i n t l n ( "OK! " ) ;
} else {System . out . p r i n t l n ( "NOK! " ) ;
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 456 / 526
Materiais Complementares – Classe String
Fragmentando strings
É possível dividir um string pela aparição de um caractereou de um string. Para isso, deve-se utilizar o método split
Assinatura:public String[] split ( String separador )
Exemplo
S t r i ng s t r = " Carlos , Joao , Maria , Pedro " ;
S t r i ng nomes[ ] = s t r . s p l i t ( " , " ) ;
f o r ( S t r i ng nome : nomes ) {System . out . p r i n t l n ( nome ) ;
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 457 / 526
Materiais Complementares
Classe Date
Ricardo Terra ([email protected]) POO 8 de julho de 2011 458 / 526
Materiais Complementares – Classe Date
Armazenando uma dataEm Java, quando deseja-se armazenar uma data,utilizamos a classe java.util.Date
A classe java.util.Date representa um instanteespecífico no tempo, com precisão de milisegundos
Ricardo Terra ([email protected]) POO 8 de julho de 2011 459 / 526
Materiais Complementares – Classe Date
ConstrutoresUm tipo Date pode ser criado:
vazio:
Date d = new Date ( ) ;
Isso indica que o objeto d armazena a data exata em que foicriado
a partir no número de milisegundos a partir de 01/01/1970:
Date d1 = new Date ( 450010883000L ) ;/∗ 05/04/1984 08:01:23 ∗/
Date d2 = new Date ( −14821304400000L ) ;/∗ 22/04/1500 12:00:00 ∗/
Isso indica que o objeto d armazena a data correspondentea 01/01/1970 + número de milisegundos passados
Ricardo Terra ([email protected]) POO 8 de julho de 2011 460 / 526
Materiais Complementares – Classe Date
Alguns métodos relevantes
1 /∗ Retorna o número de milisegundos a p a r t i r de 1/1/1970 ∗/public long getTime ( ) ;
3
/∗ Altera o número de milisegundos a p a r t i r de 1/1/1970 ∗/5 public void setTime ( long time ) ;
7 /∗ Testa se esta data está depois da data especificada ∗/boolean af te r ( Date when ) ;
9
/∗ Testa se esta data está antes da data especificada ∗/11 boolean before ( Date when ) ;
Ricardo Terra ([email protected]) POO 8 de julho de 2011 461 / 526
Materiais Complementares – Classe Date
Exemplo
1 Date d1 = new Date ( ) ; /∗ Agora ∗/
3 Date d2 = new Date ( d1 . getTime ( ) − 60000 ) ; /∗ 1min antes de agora ∗/
5 d1 . setTime ( 0L ) ; /∗ 01/01/1970 ∗/
7 System . out . p r i n t l n ( "d1 antes de d2? " + d1 . before ( d2 ) ) ; /∗ t rue ∗/System . out . p r i n t l n ( "d1 depois de d2? " + d1 . af te r ( d2 ) ) ; /∗ fa l se ∗/
Ricardo Terra ([email protected]) POO 8 de julho de 2011 462 / 526
Materiais Complementares – Classe Date
Manipulação de Data
Para operações de manipulação de data como somardias, alterar mês, subtrair uma data de outra, obter adiferença entre duas datas, deve-se utilizar subclasses dejava.util.Calendar
Esse é um tópico para vocês pesquisarem, caso desejem
Ricardo Terra ([email protected]) POO 8 de julho de 2011 463 / 526
Materiais Complementares
Classe StringBuilder e StringBuffer
Ricardo Terra ([email protected]) POO 8 de julho de 2011 464 / 526
Materiais Complementares – Classe StringBuilder eStringBuffer
ProblemaSabemos que quando você “altera” um string, na verdade,um novo string é criado e o coletor de lixo (GarbageCollector ou GC) fica responsável por liberar a área demémória anterior
Isto pode não ser um problema ao trabalhar com stringspequenas. Contudo, imagine:
alteração de um caractere em um string armazenando todoo conteúdo do livro do Deitelinserção caractere a caractere em um string
Ricardo Terra ([email protected]) POO 8 de julho de 2011 465 / 526
Materiais Complementares – Classe StringBuilder eStringBuffer
“Programa Assassino”
S t r i ng tabelaAscii = " " ;
f o r ( char c = 0; c <= 255; c++ ) {tabelaAscii += c ;
}
System . out . p r i n t l n ( tabelaAscii ) ;
Pergunta
O que ocorre por trás desse programa?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 466 / 526
Materiais Complementares – Classe StringBuilder eStringBuffer
Solução
No exemplo anterior para criar um string contendo os 255caracteres da tabela ASCII, antes foram criados edescartados 255 strings
Logo, para manipulação de strings não é recomendávelutilizar String, mas sim, StringBuilder ou StringBuffer
Essas classes foram criadas exclusivamente para amanipulação de strings e têm a vantagem de não criarstrings a cada alteração
Isto é, fazem um bom uso da memória
Ricardo Terra ([email protected]) POO 8 de julho de 2011 467 / 526
Materiais Complementares – Classe StringBuilder eStringBuffer
StringBuilder ou StringBuffer
StringBuilder ou StringBuffer funcionam exatamenteda mesma forma
A única diferença é que StringBuffer é thread-safe, istoé, não deixa que dois threads acessem simultaneamente
Sucintamente, é como se todos os métodos deStringBuffer fosse synchronized
Assim, os slides a seguir abordam exclusivamenteStringBuilder, mas funcionam de forma idêntica comStringBuffer
Ricardo Terra ([email protected]) POO 8 de julho de 2011 468 / 526
Materiais Complementares – Classe StringBuilder eStringBuffer
ConstrutoresTanto StringBuilder quanto StringBuffer podem sercriados:
vazio:
S t r ingBu i lde r s t r B u f f e r = new St r ingBu i lde r ( ) ;
a partir de um string:
S t r ingBu i lde r s t r B u f f e r = new St r ingBu i lde r ( " i n i c i a l " ) ;
com um tamanho inicial já especificado (mas aumentaautomaticamente, caso necessário)
S t r ingBu i lde r s t r B u f f e r = new St r ingBu i lde r (256) ;
Ricardo Terra ([email protected]) POO 8 de julho de 2011 469 / 526
Materiais Complementares – Classe StringBuilder eStringBuffer
Eis a solução para o “Programa Assassino”
S t r ingBu i lde r tabelaAscii = new St r ingBu i lde r ( 256 ) ;
f o r ( char c = 0; c <= 255; c++ ) {tabelaAscii .append( c ) ;
}
System . out . p r i n t l n ( tabelaAscii . toS t r i ng ( ) ) ;
Ricardo Terra ([email protected]) POO 8 de julho de 2011 470 / 526
Materiais Complementares – Classe StringBuilder eStringBuffer
Alguns métodos relevantes
/∗ Anexa qualquer coisa ao f i n a l ∗/2 public S t r i n g B u i l d e r append ( ? ) ;
4 /∗ Insere qualquer coisa a p a r t i r de uma posicao ∗/public S t r i n g B u i l d e r i n s e r t ( i n t offset , ? ) ;
6
/∗ Recupera o caractere em uma determinada posicao ∗/8 public char charAt ( i n t index ) ;
10 /∗ Deleta em um interva lo ∗/public S t r i n g B u i l d e r delete ( i n t s ta r t , i n t end ) ;
12
/∗ Recupera o primeiro índice que um s t r i n g começa ∗/14 public i n t indexOf ( S t r i ng s t r ) ;
16 /∗ Recupera o últ imo índice que um s t r i n g começa ∗/public i n t lastIndexOf ( S t r i ng s t r ) ;
18
/∗ Inverte o conteúdo ∗/20 public S t r i n g B u i l d e r reverse ( ) ;Ricardo Terra ([email protected]) POO 8 de julho de 2011 471 / 526
Materiais Complementares – Classe StringBuilder eStringBuffer
Exemplo Completo
S t r ingBu i lde r s t r B u i l d e r = new St r ingBu i lde r ( ) ;
s t r B u i l d e r .append( " Prof . Ricardo Tra " ) ; /∗ Prof . Ricardo Tra ∗/
s t r B u i l d e r . i n s e r t ( 15 , " er " ) ; /∗ Prof . Ricardo Terra ∗/
s t r B u i l d e r . delete ( 0 , 6 ) ; /∗ Ricardo Terra ∗/
System . out . p r i n t l n ( s t r B u i l d e r . indexOf ( " Ter ra " ) ) ; /∗ 8 ∗/
System . out . p r i n t l n ( s t r B u i l d e r . lastIndexOf ( " r " ) ) ; /∗ 11 ∗/
s t r B u i l d e r . reverse ( ) ;System . out . p r i n t l n ( s t r B u i l d e r ) ; /∗ arreT odraciR ∗/
Ricardo Terra ([email protected]) POO 8 de julho de 2011 472 / 526
Materiais Complementares
Classe StringTokenizer
Ricardo Terra ([email protected]) POO 8 de julho de 2011 473 / 526
Materiais Complementares – Classe StringTokenizer
ProblemaComo já visto, o método split divide um string pelaaparição de um caractere ou de um string gerando umarranjo de strings
Contudo, imagine um string que será fragmentado em ummilhão de partes
criar de uma só vez um arranjo de um milhão de stringsrequer grande espaço de memória
Ricardo Terra ([email protected]) POO 8 de julho de 2011 474 / 526
Materiais Complementares – Classe StringTokenizer
Solução
Pensando nisso, Java provê um classe chamadaStringTokenizer que retorna um token (parte do stringoriginal) por vez
o que praticamente elimina a demanda de memória
Alguns métodos relevantes
1 /∗ Ver i f ica se ainda possui mais tokens ∗/public boolean hasMoreTokens ( ) ;
3
/∗ Retorna o próximo token ∗/5 public S t r i ng nextToken ( ) ;
Ricardo Terra ([email protected]) POO 8 de julho de 2011 475 / 526
Materiais Complementares – Classe StringTokenizer
Exemplo
1 S t r i ng s t r = " Carlos , Joao , Maria , Pedro " ;
3 St r ingTokenizer s t r Token i ze r = new Str ingTokenizer ( s t r , " , " ) ;
5 while ( s t r Token i ze r . hasMoreTokens ( ) ) {System . out . p r i n t l n ( s t r Token i ze r . nextToken ( ) ) ;
7 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 476 / 526
Materiais Complementares
Classe Iterator
Ricardo Terra ([email protected]) POO 8 de julho de 2011 477 / 526
Materiais Complementares – Classe Iterator
IteratorIterator é um objeto que permite ao programador passarpor todos os elementos de uma coleção,independentemente da sua implementação
também conhecido como cursor no contexto de banco dedados
Métodos
/∗ Ver i f ica se ainda possui mais objetos ∗/2 public boolean hasMore ( ) ;
4 /∗ Retorna o próximo objeto ∗/public <T> next ( ) ;
6
/∗ Remove o últ imo objeto recuperado ∗/8 public void remove ( ) ;
Ricardo Terra ([email protected]) POO 8 de julho de 2011 478 / 526
Materiais Complementares – Classe Iterator
O que pode ser “iterado”?Classes que implementam a interface Iterable
possuem um único método: Iterator<T> iterator ( )
Em Java, todas as coleções implementam tal interface
Exemplo
Collection <St r ing > nomes = new Ar rayL i s t <St r ing > ( ) ;2 nomes.add( " Carla " ) ;
nomes.add( " Pedro " ) ;4 nomes.add( " Ricardo " ) ;
6 f o r ( I te ra to r <St r ing > i t = nomes. i t e r a t o r ( ) ; i t . hasNext ( ) ; ) {S t r i ng nome = i t . next ( ) ;
8 System . out . p r i n t l n ( nome ) ;}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 479 / 526
Materiais Complementares – Classe Iterator
Mas, com foreach não é bem mais fácil?
Collection <St r ing > nomes = new Ar rayL i s t <St r ing > ( ) ;2 nomes.add( " Carla " ) ;
nomes.add( " Pedro " ) ;4 nomes.add( " Ricardo " ) ;
6 f o r ( S t r i ng nome : nomes ) {System . out . p r i n t l n ( nome ) ;
8 }
Sim, mas, na verdade, o foreach só funciona em classesque implementam Iterable
possuem um único método: Iterator<T> iterator ( )
Em Java, todas as coleções implementam tal interface
Ricardo Terra ([email protected]) POO 8 de julho de 2011 480 / 526
Materiais Complementares
Coleções
Ricardo Terra ([email protected]) POO 8 de julho de 2011 481 / 526
Materiais Complementares – Coleções
Problema
Alocação estática: espaço pré-determinado a tempo decompilação. Ex:int v[] = new int[100];
Alocação dinâmica: espaço determinado a tempo decompilação. Ex:int n = Teclado.lerInteger("Tamanho:");int v[] = new int[n];
Mas, e quando não temos ideia do tamanho?
Estruturas de dados com tamanho variávelTais como listas, conjuntos, filas, pilhas ...
Ricardo Terra ([email protected]) POO 8 de julho de 2011 482 / 526
Materiais Complementares – Coleções
Observe o que a API de Java provê para nós
FocoNeste material, abordaremos somente à classe ArrayList
No entanto, observe que se trabalharmos com a interfaceCollection, a implementação não importa
Ricardo Terra ([email protected]) POO 8 de julho de 2011 483 / 526
Materiais Complementares – Coleções
Explicação sucinta dos sub-tipos de Collection
List: listas encadeadas (pode haver repetição)
Set: conjunto (não há repetição)
Queue: implementação de fila (FIFO)
Stack: implementação de pilha (FILO)
Ricardo Terra ([email protected]) POO 8 de julho de 2011 484 / 526
Materiais Complementares – Coleções
Alguns métodos relevantes de Collection
/∗ Adiciona um objeto na coleção ∗/2 boolean add( E o ) ;
4 /∗ Remove um objeto da coleção ∗/boolean remove( Object o)
6
/∗ Adiciona toda uma coleção à coleção ∗/8 boolean addAll ( Collection c)
10 /∗ Remove todos os elementos da coleção ∗/void clear ( )
12
/∗ Ver i f ica se t a l objeto ex i s te na coleção ∗/14 boolean contains ( Object o)
16 /∗ Retorna o tamanho da coleção ∗/i n t s i ze ( )
18
/∗ Ver i f ica se a coleção está vazia ∗/20 boolean isEmpty ( )
22 /∗ Retorna os objetos da coleção como um arranjo ∗/Object [ ] toArray ( )
Ricardo Terra ([email protected]) POO 8 de julho de 2011 485 / 526
Materiais Complementares – Coleções
Alguns métodos relevantes de List
1 /∗ Retorna um objeto em um dado índice ∗/E get ( i n t i ) ;
Pergunta
Por que o método get não está na interface Collection?
Ricardo Terra ([email protected]) POO 8 de julho de 2011 486 / 526
Materiais Complementares – Coleções
Utilizando...
Collection <St r ing > nomes = new Ar rayL i s t <St r ing > ( ) ;
nomes.add( " Ricardo " ) ;nomes. clear ( ) ;System . out . p r i n t f ( " Vazia? %b\n " , nomes. isEmpty ( ) ) ; /∗ t rue ∗/
nomes.add( " Ricardo " ) ;nomes.add( " V i r g i l i o " ) ;nomes.add( " Cesar " ) ;System . out . p r i n t l n ( nomes. s i ze ( ) ) ; /∗ 3 ∗/System . out . p r i n t l n ( nomes. contains ( " Ricardo " ) ) ; /∗ t rue ∗/
f o r ( S t r i ng nome : nomes ) {System . out . p r i n t l n (nome) ;
}
ArrayList pode ser trocado por qualquer subclasse deCollection sem impacto algum à aplicação
Ricardo Terra ([email protected]) POO 8 de julho de 2011 487 / 526
Materiais Complementares – Coleções
Observação Importante
Observe que o exemplo anterior aplica “Programação porContrato”
Você pode mudar a implementação da coleção semimpacto algum à aplicação
Mas, se você precisasse utilizar algum método específico,como o método get que só existe na interface List
Nos slides a seguir, são mostradas duas possíveis soluções
Ricardo Terra ([email protected]) POO 8 de julho de 2011 488 / 526
Materiais Complementares – Coleções
Solução 1: diminuir o grau de abstração
L i s t <St r ing > nomes = new Ar rayL i s t <St r ing > ( ) ;
nomes.add( " Ricardo " ) ;nomes. clear ( ) ;System . out . p r i n t f ( " Vazia? %b\n " , nomes. isEmpty ( ) ) ; /∗ t rue ∗/
nomes.add( " Ricardo " ) ;nomes.add( " V i r g i l i o " ) ;nomes.add( " Cesar " ) ;System . out . p r i n t l n ( nomes. s i ze ( ) ) ; /∗ 3 ∗/System . out . p r i n t l n ( nomes. contains ( " Ricardo " ) ) ; /∗ t rue ∗/
f o r ( i n t i = 0 ; i < nomes. s i ze ( ) ; i ++ ) {System . out . p r i n t l n ( nomes. get ( i ) ) ;
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 489 / 526
Materiais Complementares – Coleções
Solução 2: Fazer cast
Collection <St r ing > nomes = new Ar rayL i s t <St r ing > ( ) ;
nomes.add( " Ricardo " ) ;nomes. clear ( ) ;System . out . p r i n t f ( " Vazia? %b\n " , nomes. isEmpty ( ) ) ; /∗ t rue ∗/
nomes.add( " Ricardo " ) ;nomes.add( " V i r g i l i o " ) ;nomes.add( " Cesar " ) ;System . out . p r i n t l n ( nomes. s i ze ( ) ) ; /∗ 3 ∗/System . out . p r i n t l n ( nomes. contains ( " Ricardo " ) ) ; /∗ t rue ∗/
i f ( nomes instanceof L i s t ) {L i s t <St r ing > listaNomes = ( L i s t <St r ing >) nomes;f o r ( i n t i = 0 ; i < nomes. s i ze ( ) ; i ++ ) {
System . out . p r i n t l n ( listaNomes . get ( i ) ) ;}
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 490 / 526
Materiais Complementares – Coleções
Ordenando...
É importante que você possa ordenar uma lista (não umacoleção)
Para isso, basta:os objetos da lista devem ser comparáveis
invocar o método que ordena a lista:Collections.sort (List l)
Um objeto é comparável se, e somente se, implementa ainterface Comparable
Tal interface requer a implementação de um único método:int compare (E o)
Nos slides a seguir, é apresentado um exemplo completo
Ricardo Terra ([email protected]) POO 8 de julho de 2011 491 / 526
Materiais Complementares – Coleções
Classe Pessoa
public class Pessoa implements Comparable<Pessoa> {private f i n a l S t r i ng nome;private i n t idade ;
public Pessoa ( S t r i ng nome, i n t idade ) {super ( ) ;t h i s .nome = nome;t h i s . idade = idade ;
}
public i n t getIdade ( ) {return t h i s . idade ;
}
public void setIdade ( i n t idade ) {t h i s . idade = idade ;
}
public S t r i ng getNome( ) {return t h i s .nome;
}
@Overridepublic S t r i ng toS t r ing ( ) {
return t h i s .nome + " tem " + t h i s . idade + " anos " ;}
/∗ continua ∗/
Ricardo Terra ([email protected]) POO 8 de julho de 2011 492 / 526
Materiais Complementares – Coleções
Classe Pessoa
@Overridepublic boolean equals ( Object o ) {
i f ( o != n u l l && o instanceof Pessoa ) {Pessoa p = ( Pessoa ) o ;return p.nome. equals ( t h i s .nome ) && p. idade == t h i s . idade ;
}return fa lse ;
}
@Overridepublic i n t hashCode ( ) {
f i n a l i n t prime = 31;i n t r e s u l t = 1 ;r e s u l t = prime ∗ r e s u l t + idade ;r e s u l t = prime ∗ r e s u l t + ( (nome == n u l l ) ? 0 : nome.hashCode ( ) ) ;return r e s u l t ;
}
@Overridepublic i n t compareTo( Pessoa p ) {
i f ( t h i s . idade > p. idade ) {return 1;
} else i f ( t h i s . idade < p. idade ) {return −1;
}return 0;
}}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 493 / 526
Materiais Complementares – Coleções
Exemplo Completo
L i s t <Pessoa> pessoas = new Ar rayL i s t <Pessoa > ( ) ;
pessoas .add( new Pessoa ( " Ricardo " , 21 ) ) ;pessoas .add( new Pessoa ( " Cesar " , 38 ) ) ;pessoas .add( new Pessoa ( " V i r g i l i o " , 31 ) ) ;
Col lect ions . so r t ( pessoas ) ;
f o r ( Pessoa p : pessoas ) {System . out . p r i n t l n ( p ) ;
}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 494 / 526
Materiais Complementares – Coleções
DicaO método compareTo pode ser bem simples
Normalmente é!
Suponha que as pessoas fossem ordenadas pelo nome
Basta retornar o retorno do método compareTo da classeString
Isso porque a classe String já implementa Comparable!
Observe
@Overridepublic i n t compareTo( Pessoa p ) {
return t h i s .nome. compareTo( p.nome ) ;}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 495 / 526
Materiais Complementares – Coleções
Observação Importante!
Para uso correto de coleções, as classes dos objetoscontidos nela devem:
ou não sobrescreverem os métodos equals nem hashCode
ou sobrescreverem os métodos equals e hashCoderegra: dois objetos iguais devem ter o mesmo código hash
Ricardo Terra ([email protected]) POO 8 de julho de 2011 496 / 526
Conteúdo
1 Introdução
2 UML
3 Java
4 POO
5 Padrões de Projeto
6 Tópicos Relevantes
7 Materiais Complementares
8 ExtrasImportando Projeto Existente no EclipseAdicionando Biblioteca em ProjetoBiblioteca TerraUtil
Ricardo Terra ([email protected]) POO 8 de julho de 2011 497 / 526
Extras
Importando Projeto Existente no Eclipse
Ricardo Terra ([email protected]) POO 8 de julho de 2011 498 / 526
Extras – Importando Projeto Existente no Eclipse
Em algumas situações um projeto foi iniciado em umamáquina e será continuado em uma outra
Muitos alunos têm sérios problemas em fazer isso
Os slides a seguir demonstram como importar um projeto jáexistente no Eclipse
Ricardo Terra ([email protected]) POO 8 de julho de 2011 499 / 526
Extras – Importando Projeto Existente no Eclipse
Em que diretório está armazenado o meu projeto?Inicialmente, você deve armazenar toda a pasta em que oprojeto está contido
Para descobrir em que pasta está seu projeto, basta clicarcom o botão direito sobre o projeto e clicar em Properties
Ricardo Terra ([email protected]) POO 8 de julho de 2011 500 / 526
Extras – Importando Projeto Existente no Eclipse
Por exemplo, o projeto Teste está na pasta /Developer/workspace/Teste
Ricardo Terra ([email protected]) POO 8 de julho de 2011 501 / 526
Extras – Importando Projeto Existente no Eclipse
Vamos supor que copiou o projeto Teste para uma outramáquina e que ele agora esteja no diretório /Doc/Teste
Ricardo Terra ([email protected]) POO 8 de julho de 2011 502 / 526
Extras – Importando Projeto Existente no Eclipse
Vá em File→ Import
Ricardo Terra ([email protected]) POO 8 de julho de 2011 503 / 526
Extras – Importando Projeto Existente no Eclipse
Selecione General→ Existing Projects Into Workspace e clique em Next
Ricardo Terra ([email protected]) POO 8 de julho de 2011 504 / 526
Extras – Importando Projeto Existente no Eclipse
No campo Select root directory coloque o diretório em que o projeto está contidoNo exemplo será: /Doc, veja que ele aparece no campo Projects e clique em Finish
Ricardo Terra ([email protected]) POO 8 de julho de 2011 505 / 526
Extras – Importando Projeto Existente no Eclipse
Observe que agora o projeto aparece em sua lista de projetos
Ricardo Terra ([email protected]) POO 8 de julho de 2011 506 / 526
Extras – Importando Projeto Existente no Eclipse
Pronto!
Ricardo Terra ([email protected]) POO 8 de julho de 2011 507 / 526
Extras
Adicionando Biblioteca em Projeto
Ricardo Terra ([email protected]) POO 8 de julho de 2011 508 / 526
Extras – Adicionando Biblioteca em Projeto
Em algumas situações faz-se necessária a utilização declasses já existentes que são disponibilizadas em umabiblioteca
Essas bibliotecas são geralmente um arquivo JAR que deveser importado no seu projeto do Eclipse
Os slides a seguir demonstram como importar umabiblioteca externa no Eclipse de dois modos:
A biblioteca foi copiada para o diretório do projeto
A biblioteca não foi copiada para o diretório do projeto
Ricardo Terra ([email protected]) POO 8 de julho de 2011 509 / 526
Extras – Adicionando Biblioteca em Projeto
A biblioteca foi copiada para o diretório do projeto
Ricardo Terra ([email protected]) POO 8 de julho de 2011 510 / 526
Extras – Adicionando Biblioteca em Projeto
Clique com o botão direito na biblioteca, vá em Build Path e depois em Add toBuild Path
Ricardo Terra ([email protected]) POO 8 de julho de 2011 511 / 526
Extras – Adicionando Biblioteca em Projeto
Observe que a biblioteca aparecerá em Referenced Libraries
Ricardo Terra ([email protected]) POO 8 de julho de 2011 512 / 526
Extras – Adicionando Biblioteca em Projeto
A biblioteca não foi copiada para o diretório do projeto
Ricardo Terra ([email protected]) POO 8 de julho de 2011 513 / 526
Extras – Adicionando Biblioteca em Projeto
Clique com o botão direito no projeto, vá em Build Path e depois em Add ExternalArchives...
Ricardo Terra ([email protected]) POO 8 de julho de 2011 514 / 526
Extras – Adicionando Biblioteca em Projeto
Selecione a biblioteca (extensão JAR) desejada onde ela estiver
Ricardo Terra ([email protected]) POO 8 de julho de 2011 515 / 526
Extras – Adicionando Biblioteca em Projeto
Observe que a biblioteca aparecerá em Referenced Libraries
Ricardo Terra ([email protected]) POO 8 de julho de 2011 516 / 526
Extras – Adicionando Biblioteca em Projeto
Pronto!
Ricardo Terra ([email protected]) POO 8 de julho de 2011 517 / 526
Extras – Biblioteca TerraUtil
TerraUtil é uma biblioteca criada com o intuito de:facilitar a leitura de tipos primitivos (char, int, double etc) ede strings a partir do teclado
facilitar a conversão de string para data e vice-versa
É um arquivo JAR com apenas duas classes:com.terra.util.Teclado
com.terra.util.Conversor
Para ser utilizada deve ser adicionada como biblioteca doprojeto (veja p. 508)
Ricardo Terra ([email protected]) POO 8 de julho de 2011 519 / 526
Extras – Biblioteca TerraUtil
Métodos da classe Teclado
1 public s t a t i c char lerChar ( S t r i ng rotu lo )
3 public s t a t i c byte lerByte ( S t r i ng rotu lo )
5 public s t a t i c shor t le rSho r t ( S t r i ng rotu lo )
7 public s t a t i c i n t le r In teger ( S t r i ng rotu lo )
9 public s t a t i c long lerLong ( S t r i ng rotu lo )
11 public s t a t i c f l o a t l e r F l o a t ( S t r i ng rotu lo )
13 public s t a t i c double lerDouble ( S t r i ng rotu lo )
15 public s t a t i c S t r i ng l e r S t r i n g ( S t r i ng rotu lo )
Ricardo Terra ([email protected]) POO 8 de julho de 2011 520 / 526
Extras – Biblioteca TerraUtil
Implementação da classe Teclado
Só para se ter uma ideia de como é a implementação dosmétodos da classe Teclado, segue o código fonte dométodo lerString que é o mais simples
1 public class Teclado {. . .
3 public s t a t i c S t r i ng l e r S t r i n g ( S t r i ng rotu lo ) {System . out . p r i n t ( rotu lo + " : " ) ;
5 Scanner s = new Scanner ( System . in ) ;return s . nextLine ( ) ;
7 }. . .
9 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 521 / 526
Extras – Biblioteca TerraUtil
Exemplo de Uso
1 public s t a t i c void main( S t r i ng [ ] args ) {char ch = Teclado . lerChar ( " D ig i te uma le t ra " ) ;
3 i n t i = Teclado . le r In teger ( " D ig i te uma idade " ) ;double d = Teclado . lerDouble ( " D ig i te um preco " ) ;
5 S t r i ng s = Teclado . l e r S t r i n g ( " D ig i te um nome" ) ;
7 System . out . p r i n t f ( " Digitados : %c %d %.2 f %s " , ch , i , d, s ) ;}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 522 / 526
Extras – Biblioteca TerraUtil
Métodos da classe Conversor
/∗ Converte um objeto Date em um s t r i n g no formato desejado∗/2 public s t a t i c S t r i ng dateToStr ing (Date data , S t r i ng pattern )
4 /∗ Converte um s t r i n g em um formato especif ico em um tipo Date∗/public s t a t i c Date str ingToDate ( S t r i ng strDate , S t r i ng pattern )
Ricardo Terra ([email protected]) POO 8 de julho de 2011 523 / 526
Extras – Biblioteca TerraUtil
Exemplo de Uso
1 public s t a t i c void main( S t r i ng [ ] args ) {Date d = new Date ( ) ;
3 /∗ Imprime a data atual no formato informado ∗/System . out . p r i n t l n ( "Data Atual : "
5 + Conversor . dateToStr ing ( d, "dd/MM/yyyy HH:mm: s s " ) ) ;
7 /∗∗ Converte o s t r i n g "05/07/2019" para data e depois imprime a data
9 ∗ criada no formato informado∗/
11 d = Conversor . str ingToDate ( " 05/07/2019 " , "dd/MM/yyyy " ) ;i f ( d != n u l l ) {
13 System . out . p r i n t l n ( Conversor . dateToStr ing ( d,"dd ’de’ MMMM ’de’ yyyy " ) ) ;
15 }}
Ricardo Terra ([email protected]) POO 8 de julho de 2011 524 / 526
Extras – Biblioteca TerraUtil
Implementação da classe Conversor
1 public class Conversor {
3 public s t a t i c S t r i ng dateToStr ing (Date data , S t r i ng pattern ) {i f ( pattern == n u l l ) {
5 pattern = "dd/MM/yyyy " ;}
7 DateFormat dateFormat = new SimpleDateFormat ( pattern ) ;return dateFormat . format (data ) ;
9 }
11 public s t a t i c Date str ingToDate ( S t r i ng strDate , S t r i ng pattern ) {i f ( pattern == n u l l ) {
13 pattern = "dd/MM/yyyy " ;}
15 DateFormat dateFormat = new SimpleDateFormat ( pattern ) ;dateFormat . setLenient ( fa l se ) ;
17 t r y {return dateFormat . parse ( strDate ) ;
19 } catch ( ParseException e) {return n u l l ;
21 }
23 }
Ricardo Terra ([email protected]) POO 8 de julho de 2011 525 / 526
Referências
Harvey M. Deitel and Paul J. Deitel.Java: Como Programar.Pearson, 8 edition, 2010.
Martin Fowler.UML Essencial.Bookman, 3 edition, 2004.
Cay S. Horstmann and Gary Cornell.Core Java: Volume 1 - Fundamentos.Pearson, 8 edition, 2010.
Ricardo Terra ([email protected]) POO 8 de julho de 2011 526 / 526