Programação Orientada a Objetos com Java de Java.pdf · 3 Java 4 POO 5 Padrões de Projeto 6...

Post on 15-Jun-2020

0 views 0 download

Transcript of Programação Orientada a Objetos com Java de Java.pdf · 3 Java 4 POO 5 Padrões de Projeto 6...

Programação Orientada a Objetos com Java

Ricardo Terra

rterrabh@gmail.com

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 2 / 526

Introdução

Visão Geral de POO

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 3 / 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 15 / 526

Introdução – Visão Geral de POO

Repasso

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 21 / 526

UML

Diagrama de Classe

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 22 / 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 45 / 526

UML – Diagrama de Classe

Casamento Tradicional

Poliginia

Poliandria

???

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 54 / 526

UML – Diagrama de Classe

Exercício de Fixação 01 – Solução

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 59 / 526

Java

Introdução

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 60 / 526

Java – Introdução

Logo Mascote – Duke

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 66 / 526

Java – Introdução

Java SE – Componentes – Entendimento Visual

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 68 / 526

Java – Introdução

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 70 / 526

Java – Introdução

Java SE – Funcionamento – Entendimento Visual

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 81 / 526

Java – Introdução

Classe Matematica – JavaDoc gerado

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 83 / 526

Java

Tipos Básicos

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 84 / 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 96 / 526

Java

Operadores

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 97 / 526

Java – Operadores

Quatro classes de operadores:Aritméticos

Relacionais

Lógicos

Bit a bit

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 98 / 526

Java – Operadores

Tabela de Prioridades

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 99 / 526

Java – Operadores

Operadores Artiméticos+

-

/

% (corresponde ao mod do Pascal)

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 113 / 526

Java – Operadores

Exercícios10 & 13 ?

10 | 13 ?

10 ˆ 13 ?

0 ?

8 » 1 ?

2 « 2 ?

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 114 / 526

Java

Comandos condicionais

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 115 / 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 133 / 526

Java

Comandos de repetição

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 134 / 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 152 / 526

Java

Arranjos

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 153 / 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 167 / 526

Java

Métodos

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 168 / 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 182 / 526

POO

Conceitos Iniciais

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 183 / 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 211 / 526

POO

Classe java.lang.Object

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 212 / 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 227 / 526

POO

Herança

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 228 / 526

POO – Herança

Modelo 1: Jogo dos “1 erro”!!!

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 234 / 526

POO – Herança

Modelo 2: “A aparição da Herança”!!!

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 235 / 526

POO – Herança

Modelo 2: Classe Departamento – Implementação

Nenhuma modificação

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 259 / 526

POO

Modificadores

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 260 / 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 269 / 526

POO – Modificadores

Exemplo Conceitual

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 279 / 526

POO – Modificadores

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 280 / 526

POO – Modificadores

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 280 / 526

POO – Modificadores

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 280 / 526

POO – Modificadores

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 288 / 526

POO – Modificadores

Outra Pergunta Interessante...

Porque não se pode instanciar classes abstratas?

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 289 / 526

POO

Interface

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 290 / 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 301 / 526

POO – Interface

Interface – Utilidade

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 305 / 526

POO

Herança Múltipla?

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 306 / 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 311 / 526

POO – Herança Múltipla?

Alternativa: Interfaces

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 312 / 526

:

POO

Classe Abstrata x Interface

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 313 / 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 (rterrabh@gmail.com) POO 8 de julho de 2011 314 / 526

POO – Classe Abstrata x Interface

Diferenciando: Classe Abstrata x Interface

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 315 / 526

POO

Exceção

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 316 / 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 321 / 526

POO – Exceção

Hierarquia de Exceção

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 356 / 526

Padrões de Projeto

Singleton

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 357 / 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 359 / 526

Padrões de Projeto

Decorator

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 360 / 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 (rterrabh@gmail.com) POO 8 de julho de 2011 361 / 526

Padrões de Projeto – Decorator

Estrutura

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 363 / 526

Padrões de Projeto – Decorator

Exemplo – Diagrama de Classes

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 372 / 526

Padrões de Projeto

Abstract Factory

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 374 / 526

Padrões de Projeto – Abstract Factory

Estrutura

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 377 / 526

Padrões de Projeto – Abstract Factory

Exemplo – Diagrama de Classes

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 385 / 526

Tópicos Relevantes

Streams

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 386 / 526

Tópicos Relevantes – Streams

Objetivos desta seção

Manipulação de arquivos texto e binário

Serialização de objetos Java

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 391 / 526

Tópicos Relevantes – Streams

Tipos principais de streamsTexto

Binário

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 392 / 526

Tópicos Relevantes – Streams

Reader

Suas subclasses efetuam leitura textual

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 394 / 526

Tópicos Relevantes – Streams

Writer

Suas subclasses efetuam escrita textual

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 398 / 526

Tópicos Relevantes – Streams

InputStream

Suas subclasses efetuam leitura binária

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 400 / 526

Tópicos Relevantes – Streams

OutputStream

Suas subclasses efetuam escrita binária

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 416 / 526

Materiais Complementares

Classes Wrapper

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 425 / 526

Materiais Complementares

Classe Math

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 438 / 526

Materiais Complementares

Classe String

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 457 / 526

Materiais Complementares

Classe Date

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 463 / 526

Materiais Complementares

Classe StringBuilder e StringBuffer

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 472 / 526

Materiais Complementares

Classe StringTokenizer

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 476 / 526

Materiais Complementares

Classe Iterator

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 480 / 526

Materiais Complementares

Coleções

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 497 / 526

Extras

Importando Projeto Existente no Eclipse

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 502 / 526

Extras – Importando Projeto Existente no Eclipse

Vá em File→ Import

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 506 / 526

Extras – Importando Projeto Existente no Eclipse

Pronto!

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 507 / 526

Extras

Adicionando Biblioteca em Projeto

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 511 / 526

Extras – Adicionando Biblioteca em Projeto

Observe que a biblioteca aparecerá em Referenced Libraries

Ricardo Terra (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 515 / 526

Extras – Adicionando Biblioteca em Projeto

Observe que a biblioteca aparecerá em Referenced Libraries

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 516 / 526

Extras – Adicionando Biblioteca em Projeto

Pronto!

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 517 / 526

Extras

Biblioteca TerraUtil

Ricardo Terra (rterrabh@gmail.com) POO 8 de julho de 2011 518 / 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) 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 (rterrabh@gmail.com) POO 8 de julho de 2011 526 / 526