531
Programação Orientada a Objetos com Java Ricardo Terra [email protected] Ricardo Terra ([email protected]) POO 8 de julho de 2011 1 / 526

JAVA - Apostila.pdf

Embed Size (px)

Citation preview

Page 1: JAVA - Apostila.pdf

Programação Orientada a Objetos com Java

Ricardo Terra

[email protected]

Ricardo Terra ([email protected]) POO 8 de julho de 2011 1 / 526

Page 2: JAVA - Apostila.pdf

Conteúdo

1 IntroduçãoVisão Geral de POO

2 UML

3 Java

4 POO

5 Padrões de Projeto

6 Tópicos Relevantes

7 Materiais Complementares

8 Extras

Ricardo Terra ([email protected]) POO 8 de julho de 2011 2 / 526

Page 3: JAVA - Apostila.pdf

Introdução

Visão Geral de POO

Ricardo Terra ([email protected]) POO 8 de julho de 2011 3 / 526

Page 4: JAVA - Apostila.pdf

Introdução – Visão Geral de POO

Origem da POO

SimulaFoi a primeira linguagem de programação a introduzir osconceitos subjacentes a programação orientada a objetos(objetos, classes, subclasses, métodos virtuais, coletor de lixoetc)Mas, não foi amplamente desenvolvida

SmalltalkLinguagem puramente orientada a objetos

AtualmenteC++Object PascalJavaPythonEiffel

Ricardo Terra ([email protected]) POO 8 de julho de 2011 4 / 526

Page 5: JAVA - Apostila.pdf

Introdução – Visão Geral de POO

Linguagem para criação de modelos

UMLPadrão OMG (Object Management Group)Mais utilizada nos dias de hojeUtilizaremos bastante o Diagrama de Classe, um dos seus 14diagramas, em nossa disciplina

Booch

OOSE (Object-Oriented Software Engineering)

OMT (Object Modeling Technique)

Ricardo Terra ([email protected]) POO 8 de julho de 2011 5 / 526

Page 6: JAVA - Apostila.pdf

Introdução – Visão Geral de POO

Paradigma de Programação

DefiniçãoConjunto de regras e/ou hipóteses que governam adefinição de um modelo

Aplicação na computação/informáticaAuxiliar na condução do processo de busca da solução(modelo conceitual) de um problema

Ricardo Terra ([email protected]) POO 8 de julho de 2011 6 / 526

Page 7: JAVA - Apostila.pdf

Introdução – Visão Geral de POO

Exemplos de paradigma de programação

Procedural (imperativo)É um paradigma de programação que descreve acomputação como ações (instruções) que mudam o estado(variáveis) de um programa. Muito parecido com ocomportamento imperativo das linguagens naturais queexpressam ordens, programas imperativos são umasequência de comandos para o computador executar

Orientado a objetosÉ um paradigma de programação que utiliza “objetos” e ainteração entre eles para projetar aplicações e programasde computador. Suas técnicas de programação podemincluir características como encapsulamento, polimorfismo eherança. Esse paradigma não era comumente usado nodesenvolvimento de aplicações de grande porte até iníciode 1990. Atualmente, várias linguagens modernas suportamPOO

Ricardo Terra ([email protected]) POO 8 de julho de 2011 7 / 526

Page 8: JAVA - Apostila.pdf

Introdução – Visão Geral de POO

Objeto“Objeto é uma coisa, uma entidade, alguma coisa quevocê levanta ou chuta, qualquer coisa que você possaimaginar que tenha sua própria identidade.” (MikeO’Docherty, 2005)

Possuem características (atributos)

Possuem comportamentos (métodos)

Assume responsabilidades no domínio do problema

Ricardo Terra ([email protected]) POO 8 de julho de 2011 8 / 526

Page 9: JAVA - Apostila.pdf

Introdução – Visão Geral de POO

Classe“Uma classe encapsula características comuns a grupos deobjetos.” (Mike O’Docherty, 2005)

Pode ser pensada de várias formas:Um conjunto de especificações que caracterizam comoseus membros devem serUm molde que produz objetos com a mesma forma...

EnfimDesenvolvedores utilizam classes para descrever elementosde programação que alguns tipos de objetos terão

Ricardo Terra ([email protected]) POO 8 de julho de 2011 9 / 526

Page 10: JAVA - Apostila.pdf

Introdução – Visão Geral de POO

ClasseAtributos

Representam as informações (características) que os objetosda classe terãoPor exemplo, uma pessoa tem um nome, idade, peso etc

MétodosRepresentam as ações (comportamentos) que os objetos daclasse realizarãoPor exemplo, uma pessoa respira, come, bebe etc

EncapsulamentoClasse é a menor unidade modular de POO, isto é, não existenada menor que uma classeAssim, classe é definida como um grupo de atributos,métodos e outros membros que são tratado como umaúnica unidade modular

Ricardo Terra ([email protected]) POO 8 de julho de 2011 10 / 526

Page 11: JAVA - Apostila.pdf

Introdução – Visão Geral de POO

Herança

Basicamente, é a habilidade de definir novas classesbaseadas em classes existentes

Suponha:Um animal

Animal morre

Um mamífero é um animalMamífero morreMamífero mama (novo)

Um leão é um mamíferoLeão morreLeão mamaLeão ruge (novo)

Ricardo Terra ([email protected]) POO 8 de julho de 2011 11 / 526

Page 12: JAVA - Apostila.pdf

Introdução – Visão Geral de POO

Herança requer o entendimento dos conceitos desuperclasse e subclasses

Superclasses são as classes mais genéricas em sua hierarquiaSubclasses são as classes mais específicas em sua hierarquia

Com base no exemplo anterior:Animal

superclasse de Mamífero e Leão

Mamíferosuperclasse de Leão

subclasse de Animal

Leãosubclasse de Animal e Mamífero

Ricardo Terra ([email protected]) POO 8 de julho de 2011 12 / 526

Page 13: JAVA - Apostila.pdf

Introdução – Visão Geral de POO

Sobreposição

Você sobrepõe uma operação quando deseja que umaoperação herdada seja realizada diferentemente pelasubclasse

Por exemplo, uma cobra se alimenta de ratos, mas um tipoespecífico de cobra (subclasse) se alimenta diferentemente

Assim, é necessário sobrepor o método alimentar:Classe Cobra

void alimentar ( Rato comida) { /∗ mata e come ∗/ }

Classe Cascavel

@Overridevoid alimentar ( Rato comida) { /∗ come mesmo vivo ∗/ }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 13 / 526

Page 14: JAVA - Apostila.pdf

Introdução – Visão Geral de POO

Sobrecarga

Você sobrecarrega uma operação quando deseja que amesma operação também seja realizada por entradasdiferentes

Por exemplo, uma cobra se alimenta de ratos, mas um tipoespecífico de cobra (subclasse) se alimenta também deratazanas

Assim, é necessário sobrecarregar o método alimentar:Classe Cobra

void alimentar ( Rato comida) { /∗ mata e come ∗/ }

Classe Cascavel

@Overridevoid alimentar ( Rato comida) { /∗ come mesmo vivo ∗/ }void alimentar ( Ratazana comida) { /∗ come também ∗/ }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 14 / 526

Page 15: JAVA - Apostila.pdf

Introdução – Visão Geral de POO

PolimorfismoHabilidade de um objeto poder ser tratado como qualqueruma de suas classes mais genéricas (superclasses)

Com base no exemplo anterior:Leão pode ser visto como um animal

Contudo, se for visto como animal, só poderá morrer

Um leão pode ser visto como um mamíferoContudo, se for visto como mamífero, só poderá morrer emamar

Ricardo Terra ([email protected]) POO 8 de julho de 2011 15 / 526

Page 16: JAVA - Apostila.pdf

Introdução – Visão Geral de POO

Repasso

Ricardo Terra ([email protected]) POO 8 de julho de 2011 16 / 526

Page 17: JAVA - Apostila.pdf

Introdução – Visão Geral de POO

Agenda TelefônicaAtributos

lista de contatos

Operaçõesinserir contatoalterar contatoexcluir contato

Ricardo Terra ([email protected]) POO 8 de julho de 2011 17 / 526

Page 18: JAVA - Apostila.pdf

Introdução – Visão Geral de POO

Contato (para uma agenda telefônica)Atributos

nomeendereçotelefoneemail

Operaçõesobter/alterar nomeobter/alterar endereçoobter/alterar telefoneobter/alterar email

Ricardo Terra ([email protected]) POO 8 de julho de 2011 18 / 526

Page 19: JAVA - Apostila.pdf

Introdução – Visão Geral de POO

Cavalo (como ele é)Atributos

pesoalturacorraça...

Operaçõesandarcomerpuxar carroçarelinchar...

Ricardo Terra ([email protected]) POO 8 de julho de 2011 19 / 526

Page 20: JAVA - Apostila.pdf

Introdução – Visão Geral de POO

Exercícios: modele as seguintes classesConta

Equação (de 2o grau)

Escola

Filme

Telefone

Ricardo Terra ([email protected]) POO 8 de julho de 2011 20 / 526

Page 21: JAVA - Apostila.pdf

Conteúdo

1 Introdução

2 UMLDiagrama de Classe

3 Java

4 POO

5 Padrões de Projeto

6 Tópicos Relevantes

7 Materiais Complementares

8 Extras

Ricardo Terra ([email protected]) POO 8 de julho de 2011 21 / 526

Page 22: JAVA - Apostila.pdf

UML

Diagrama de Classe

Ricardo Terra ([email protected]) POO 8 de julho de 2011 22 / 526

Page 23: JAVA - Apostila.pdf

UML – Diagrama de Classe

Classe x ObjetoAs classes formam o alicerce do diagrama de classes. Paratrabalhar com diagrama de classes, você precisa ter umanoção clara da diferença entre classes e objetos

Assim:

Classe é a definição/molde para um recurso. Ela incluiinformações que descrevem os recursos de uma entidade ecomo ela pode ser utilizada

Objeto, ao contrário, é uma instância de uma classe.Pode-se dizer que um objeto é uma entidade identificável deforma exclusiva de acordo com as regras definidas pelaclasse

Ricardo Terra ([email protected]) POO 8 de julho de 2011 23 / 526

Page 24: JAVA - Apostila.pdf

UML – Diagrama de Classe

Importância“Se alguém chegar perto de você em um beco escuro edisser: “Psiu, quer ver um diagrama UML?”, esseprovavelmente seria um diagrama de classes. A maioriados diagramas UML que vejo são diagramas de classes.”(FOWLER, 2005)

“O diagrama de classes provavelmente é o diagrama maisutilizado da UML. Na verdade, o diagrama de classes é aferramenta de modelagem principal para descrever aprópria UML.” (PENDER, 2004)

Ricardo Terra ([email protected]) POO 8 de julho de 2011 24 / 526

Page 25: JAVA - Apostila.pdf

UML – Diagrama de Classe

Definição

Um diagrama de classes descreve os tipos de objetospresentes no sistema e os vários tipos de relacionamentoestáticos existentes entre eles

Os diagramas de classe também mostram os atributos eoperações de uma classe e as restrições que se aplicam àmaneira como os objetos estabelecem dependência

Ricardo Terra ([email protected]) POO 8 de julho de 2011 25 / 526

Page 26: JAVA - Apostila.pdf

UML – Diagrama de Classe

Uma classe é uma descrição de um conjunto de objetosque partilham os mesmos atributos, operações, relações esemântica

Por exemplo, na classe Pessoa, é dito que uma pessoa temnome, idade, altura etc. Contudo, não diz qual é o nome, aidade, a altura etc

Se algo tem um nome, uma idade, uma altura etc, esse algoé um objeto de Pessoa

Ricardo Terra ([email protected]) POO 8 de julho de 2011 26 / 526

Page 27: JAVA - Apostila.pdf

UML – Diagrama de Classe

Uma classe é descrita em seus aspectos estruturais por seusatributos e em seus aspectos comportamentais por suasoperações

Uma classe é representada como abaixo:

Ricardo Terra ([email protected]) POO 8 de julho de 2011 27 / 526

Page 28: JAVA - Apostila.pdf

UML – Diagrama de Classe

É errado pensar que uma classe deve corresponder a umaentidade humana, uma coisa física, algo que você vê outoca etc

Por exemplo, pode-se representar entidades mais abstratas:

Venda, Saudade, Amor etc

Ricardo Terra ([email protected]) POO 8 de julho de 2011 28 / 526

Page 29: JAVA - Apostila.pdf

UML – Diagrama de Classe

AtributosSão propriedades (características) semelhantes que osobjetos de uma classe possuem

Por exemplo, na classe Pessoa, o nome, a idade, a alturasão seus atributos

Um atributo pode ser de um tipo primitivo, uma coleção,um arranjo, um objeto de outra classe etc

Os valores dos atributos diferenciam objetos. Por exemplo,na classe Carro, sabe-se, dentre outras propriedades, queo meu carro é prata. Como o seu é preto, não pode ser omesmo carro

Em outras palavras, o valor do atributo cor diferenciou osobjetos

Ricardo Terra ([email protected]) POO 8 de julho de 2011 29 / 526

Page 30: JAVA - Apostila.pdf

UML – Diagrama de Classe

Atributos e operações permitem que sejam especificadosdetalhes de sua visibilidade e de sua multiplicidade(abordaremos isso a frente)

A sintaxe básica de um atributo é:[visibilidade] nome : [tipo] { = valor-inicial }

Exemplos:+ nome : String

- salario : double = 1000.00

# nota : int

∼ cor : double

Ricardo Terra ([email protected]) POO 8 de julho de 2011 30 / 526

Page 31: JAVA - Apostila.pdf

UML – Diagrama de Classe

Operações

São comportamentos (ações) que os objetos de umaclasse possuem

Por exemplo, na classe Pessoa, comer, beber, dormir sãosuas operações

Os valores dos atributos diferenciam objetos. Contudo, elesinfluenciam nas operações. Por exemplo, na classe Pessoa,uma pessoa que pesa 100kg certamente vai comer maisque uma que pesa 45kg

Existem operações que não sofrem influência dos atributos,mas não é comum

Ricardo Terra ([email protected]) POO 8 de julho de 2011 31 / 526

Page 32: JAVA - Apostila.pdf

UML – Diagrama de Classe

A sintaxe básica de uma operação é:[visibilidade] nome ( [parâmetros] ) : [retorno]

Exemplos:- mostrar( ) : void

+ calcularTaxa( valorDolar : double ) : double

# somar( a : int , b: int ) : int

∼ delta( ): double

Ricardo Terra ([email protected]) POO 8 de julho de 2011 32 / 526

Page 33: JAVA - Apostila.pdf

UML – Diagrama de Classe

Atributos e operações estáticos

Um atributo ou operação que não pertence a umainstância da classe, mas à classe como um todo sãochamados de atributo ou operação estático

Atributos e operações estáticos são compartilhados portodas as instâncias da classe, não pertencendo a umainstância específica

Ricardo Terra ([email protected]) POO 8 de julho de 2011 33 / 526

Page 34: JAVA - Apostila.pdf

UML – Diagrama de Classe

Por exemplo, na classe ContaPoupanca, a taxa derendimento é comum a todas as contas poupanças

Logo, é um atributo estático

Atributos ou operações estáticos são representados comum sublinhado. Observe:

Ricardo Terra ([email protected]) POO 8 de julho de 2011 34 / 526

Page 35: JAVA - Apostila.pdf

UML – Diagrama de Classe

Visibilidade

É possível especificar como os atributos e operações serãovistos no sistema

Eis os níveis de visibilidade:(+) PÚBLICO: Todas as classes visualizam

(-) PRIVADO: Somente a própria classe visualiza

(#) PROTEGIDO: Todas as classes do mesmo pacote etambém as subclasses visualizam

(∼) PACOTE: Todas as classes do mesmo pacote visualizam

Ricardo Terra ([email protected]) POO 8 de julho de 2011 35 / 526

Page 36: JAVA - Apostila.pdf

UML – Diagrama de Classe

Exemplo (hipotético, cunho acadêmico)

Somente a própria classe tem acesso direto aos atributos

Qualquer classe pode ligar ou desligar o veículo

Somente classes do mesmo pacote ou subclasses podem acelerar ou frear oveículo

Somente a própria classe pode ativar o ABS

Somente classes do mesmo pacote podem saber o consumo do veículo

Ricardo Terra ([email protected]) POO 8 de julho de 2011 36 / 526

Page 37: JAVA - Apostila.pdf

UML – Diagrama de Classe

Associação

Uma das maneiras de se criar um atributo é através de umaassociação

Associação é uma linha cheia entre duas classesLogo veremos navegabilidade

Por exemplo, uma NotaFiscal possui pelo menos umobjeto do tipo ItemNotaFiscal e um ItemNotaFiscalestá vinculado a uma única NotaFiscal

Ricardo Terra ([email protected]) POO 8 de julho de 2011 37 / 526

Page 38: JAVA - Apostila.pdf

UML – Diagrama de Classe

Observe que não é necessário (nem correto) explicitar queNotaFiscal possui uma coleção de ItemNotaFiscal

A própria associação diz isso

Código Java correspondente

public class NotaFiscal {private Collection <ItemNotaFiscal > i tensNotaF iscal ;. . .

}

public class ItemNotaFiscal {. . .

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 38 / 526

Page 39: JAVA - Apostila.pdf

UML – Diagrama de Classe

Navegabilidade

É possível definir a navegabilidade de uma associação

No exemplo anterior, a navegabilidade é só ocorre deNotaFiscal para ItemNotaFiscal

Isto é, o ItemNotaFiscal não sabe a NotaFiscal em quese encontra

Nos próximos slides veremos como a navegabilidade mudao projeto

Ricardo Terra ([email protected]) POO 8 de julho de 2011 39 / 526

Page 40: JAVA - Apostila.pdf

UML – Diagrama de Classe

Original: Somente a NotaFiscal conhece ItemNotaFiscal

Código Java correspondente

public class NotaFiscal {private Collection <ItemNotaFiscal > i tensNotaF iscal ;. . .

}

public class ItemNotaFiscal {. . .

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 40 / 526

Page 41: JAVA - Apostila.pdf

UML – Diagrama de Classe

Somente o ItemNotaFiscal conhece a NotaFiscal

Código Java correspondente

public class NotaFiscal {. . .

}

public class ItemNotaFiscal {private NotaFiscal notaFiscal ;. . .

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 41 / 526

Page 42: JAVA - Apostila.pdf

UML – Diagrama de Classe

Ambas as classes se conhecem (Associação Bidirecional)

Código Java correspondente

public class NotaFiscal {private Collection <ItemNotaFiscal > i tensNotaF iscal ;. . .

}

public class ItemNotaFiscal {private NotaFiscal notaFiscal ;. . .

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 42 / 526

Page 43: JAVA - Apostila.pdf

UML – Diagrama de Classe

Composição

Tipo especial de associação em que se deseja indicar umaideia de todo e parte

A parte não vive sem o todo

É representado por um losango preenchido ao lado daentidade que representa o todo

No exemplo abaixo, seria impossível existir umItemNotaFiscal sem estar vinculado a uma NotaFiscal

Ricardo Terra ([email protected]) POO 8 de julho de 2011 43 / 526

Page 44: JAVA - Apostila.pdf

UML – Diagrama de Classe

Agregação

Tipo especial de associação em que se deseja indicar umaassociação mais forte

Contudo, a entidade agregada tem vida sozinha

É representado por um losango vazio ao lado da entidadeque representa o todo

No exemplo abaixo, um Motor está agregado a um Carro,mas é possível existir um motor sem estar em um carro

Ricardo Terra ([email protected]) POO 8 de julho de 2011 44 / 526

Page 45: JAVA - Apostila.pdf

UML – Diagrama de Classe

MultiplicidadeA multiplicidade em uma associação indica o número deobjetos que um objeto da classe pode ter de uma outraclasse

Multiplicidades são números simples ou intervalos denúmeros

Tabela: Multiplicidade mais comuns

0..1 Uma instância opcional1 Exatamente uma instância

0..* Zero ou mais instâncias1..* Pelo menos uma instância

Ricardo Terra ([email protected]) POO 8 de julho de 2011 45 / 526

Page 46: JAVA - Apostila.pdf

UML – Diagrama de Classe

Casamento Tradicional

Poliginia

Poliandria

???

Ricardo Terra ([email protected]) POO 8 de julho de 2011 46 / 526

Page 47: JAVA - Apostila.pdf

UML – Diagrama de Classe

Classes AssociativasAlgumas associações de muitos para muitos exige anecessidade da criação de uma classe associativa entre asduas classes associadas

No exemplo abaixo existe a classe Paciente com seusatributos e a classe Exame com seus atributos. Dorelacionamento entre Paciente e Exame, tem-se a data darealização e o diagnóstico

Ricardo Terra ([email protected]) POO 8 de julho de 2011 47 / 526

Page 48: JAVA - Apostila.pdf

UML – Diagrama de Classe

Generalização

Trata-se da ação de uma classe herdar toda a estrutura deuma outra classe

Uma subclasse sempre herda de sua superclasse:AtributosOperaçõesRelacionamentos

Uma subclasse pode:Adicionar atributos e operaçõesAdicionar relacionamentosSobrepor (override) operações herdadasSobrecarregar (overload) operações herdadas

A herança é completa, isto é, não tem como uma classeherdar somente certos atributos ou operações

Ricardo Terra ([email protected]) POO 8 de julho de 2011 48 / 526

Page 49: JAVA - Apostila.pdf

UML – Diagrama de Classe

ContaCorrente e ContaPoupanca herdam ContaIsto é, são subclasses imediatas de Conta

Ricardo Terra ([email protected]) POO 8 de julho de 2011 49 / 526

Page 50: JAVA - Apostila.pdf

UML – Diagrama de Classe

Classe AbstrataSe for um bom observador, percebeu que a classe Contano último slide estava em itálico

Isso indica que a classe é abstrata

Uma classe abstrata é uma classe que não tem instâncias

É utilizada somente como mecanismo de reúso e paraprovêr a capacidade polimórfica

Ricardo Terra ([email protected]) POO 8 de julho de 2011 50 / 526

Page 51: JAVA - Apostila.pdf

UML – Diagrama de Classe

PacotesOs pacotes em um diagrama de classes são altamenteutilizados, pois, na implementação do sistema, aorganização das classes são sempre feitas utilizandopacotes

Ricardo Terra ([email protected]) POO 8 de julho de 2011 51 / 526

Page 52: JAVA - Apostila.pdf

UML – Diagrama de Classe

Notas e comentáriosComo em qualquer diagrama UML, podem ser inseridosnotas e comentários

Ricardo Terra ([email protected]) POO 8 de julho de 2011 52 / 526

Page 53: JAVA - Apostila.pdf

UML – Diagrama de Classe

CuidadoDiagrama de Classes não é um modelo ER

O maior perigo com os diagramas de classes é que vocêpode focar exclusivamente na estrutura e ignorar ocomportamento

Ricardo Terra ([email protected]) POO 8 de julho de 2011 53 / 526

Page 54: JAVA - Apostila.pdf

UML – Diagrama de Classe

Exercício de Fixação 01

A gráfica ABC trabalha com diversos autores que escrevem oslivros que ela publica. Alguns autores escreveram apenas umlivro, enquanto outros já escreveram vários. Além disso, algunslivros foram escritos por vários autores, porém um livro devepossuir pelo menos um autor. A gráfica ABC trabalha tambémcom diversas impressoras, porém um livro só pode ser impressoem uma única impressora.

Deve ser possível buscar os livros de um autor, saber qual foi aimpressora em que o livro foi impresso, saber a quantidade depáginas que uma impressora já imprimiu e a quantidade depáginas que ela imprimiu de um determinado livro, entre outros.

Ricardo Terra ([email protected]) POO 8 de julho de 2011 54 / 526

Page 55: JAVA - Apostila.pdf

UML – Diagrama de Classe

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

Ricardo Terra ([email protected]) POO 8 de julho de 2011 55 / 526

Page 56: JAVA - Apostila.pdf

UML – Diagrama de Classe

Exercício de Fixação 02

Um veículo tem chassi, modelo, peso, ano de fabricação. Umveículo não existe por si só, ele deve ser um avião ou um carro.Todo veículo liga e desliga. Um carro acelera e frea e um aviãodecola, voa e pousa.

Ricardo Terra ([email protected]) POO 8 de julho de 2011 56 / 526

Page 57: JAVA - Apostila.pdf

UML – Diagrama de Classe

Exercício de Fixação 03

Um imóvel possui um endereço, área (em m2) e um proprietário. Oimóvel pode ser uma casa ou um apartamento. Caso seja casa,possuirá também o número do registro do lote e, caso sejaapartamento, possuirá o número do andar e um flag indicando sepossui ou não elevador. Um proprietário possui cpf, nome e telefone.Pelo menos, as seguintes operações devem existir:

Alterar a área de um imóvel

Alterar o proprietário de um imóvel

Alterar o flag se possui ou não elevador do apartamento

Recuperar a quantidade de imóveis de um proprietário

Alterar o telefone de um proprietário

PS: Atenção com os parâmetros e com o tipo de retorno das operações

Ricardo Terra ([email protected]) POO 8 de julho de 2011 57 / 526

Page 58: JAVA - Apostila.pdf

UML – Diagrama de Classe

Exercício de Fixação 04Uma pessoa possui cpf e nome. Um professor é uma pessoa que também possui umatitulação e a IES (Instituição de Ensino Superior) vinculada. Um aluno também é umapessoa e possui a informação de qual período se encontra e qual o seu curso (um cursopossui um registro do MEC, um nome e sua área de concentração). Uma palestrapossui um nome e um assunto e pode ser ministrada por diversos professores. Para cadaprofessor ministrando cada palestra, deve constar a data e a localização (rua, número,bairro, cidade, estado e telefone) deste evento e, um aluno, pode assistir vários eventos.Pelo menos as seguintes operações devem existir:

Alterar a área de um imóvelAlterar o nome de uma pessoaAlterar a titulação de um professorAlterar a IES de um professorAlterar o período em curso de um alunoAlterar o curso de um alunoAlterar o registro do MEC de um cursoAlterar o nome de uma palestraAlterar a data de um eventoAlterar a localização de um eventoAlterar o telefone de uma localização

Ricardo Terra ([email protected]) POO 8 de julho de 2011 58 / 526

Page 59: JAVA - Apostila.pdf

Conteúdo

1 Introdução

2 UML

3 JavaIntroduçãoTipos BásicosOperadoresComandos condicionaisComandos de repetiçãoArranjosMétodos

4 POO

5 Padrões de Projeto

6 Tópicos Relevantes

7 Materiais Complementares

8 ExtrasRicardo Terra ([email protected]) POO 8 de julho de 2011 59 / 526

Page 60: JAVA - Apostila.pdf

Java

Introdução

Ricardo Terra ([email protected]) POO 8 de julho de 2011 60 / 526

Page 61: JAVA - Apostila.pdf

Java – Introdução

Logo Mascote – Duke

Ricardo Terra ([email protected]) POO 8 de julho de 2011 61 / 526

Page 62: JAVA - Apostila.pdf

Java – Introdução

ObjetivosApaixonar-se por Java

Diferenciar:Programação Estruturada (Pascal, C...)Programação Orientada a Objetos (Java, C++...)

Pré-requisitosLógica de Programação

Linguagem C

Ricardo Terra ([email protected]) POO 8 de julho de 2011 62 / 526

Page 63: JAVA - Apostila.pdf

Java – Introdução

Edições Java

Java SE – Java Standard Edition (Versão Atual: 6)

www.oracle.com/technetwork/java/javase

Java EE – Java Enterprise Edition

www.oracle.com/technetwork/java/javaee

Java ME – Java Micro Edition

www.oracle.com/technetwork/java/javame

Ricardo Terra ([email protected]) POO 8 de julho de 2011 63 / 526

Page 64: JAVA - Apostila.pdf

Java – Introdução

Tipos de Aplicações

AppletsAplicação que normalmente utiliza o navegador do clientepara prover a interface do usuárioProcessamento realizado no servidor

ApplicationsDispensa explicação

ServletsExecução em servidores webExemplos: JSP, JSF, Struts etc

MidletsExecução em pequenos dispositivos

PortletsExecução em portais

Ricardo Terra ([email protected]) POO 8 de julho de 2011 64 / 526

Page 65: JAVA - Apostila.pdf

Java – Introdução

Falácias sobre JavaJava é muito fácil de aprender

Java é muito difícil de aprender

Java é um ambiente de programação

Todos os programas Java executam em páginas web

JavaScript é uma versão mais simples de Java

Java é interpretado e, portanto, muito lerdo paraaplicações sérias em uma plataforma específica

Leia artigo “Análise Comparativa do Código Gerado porCompiladores Java e C++” publicado no SBLP 2010

Ricardo Terra ([email protected]) POO 8 de julho de 2011 65 / 526

Page 66: JAVA - Apostila.pdf

Java – Introdução

Principais Características da Linguagem Java

Compilação para bytecodes

Provê portabilidade (saberemos logo o porquê)

Suporte a multi-programação

Suporte a threads

OO

Segura

Não existe ponteirosGerência automática de memória (não existe mais malloc,free etc)

Eficiente

JIT Compiler, otimizações dinâmicas etc

Ricardo Terra ([email protected]) POO 8 de julho de 2011 66 / 526

Page 67: JAVA - Apostila.pdf

Java – Introdução

Java SE – Componentes – Entendimento Visual

Ricardo Terra ([email protected]) POO 8 de julho de 2011 67 / 526

Page 68: JAVA - Apostila.pdf

Java – Introdução

Java SE – ComponentesAPI – Application Programming Interface

Biblioteca com diversas classe e funções úteis para serutilizada no desenvolvimento de aplicações

JVM – Java Virtual MachineMáquina virtual em que a aplicação Java é executadaContém implementação de toda API Java

JRE – Java Runtime EnvironmentAmbiente de execução de aplicativos JavaContém a JVM

JDK – Java Development KitAmbiente de desenvolvimento de aplicativos Java(compilação, depuração etc)Contém o JRE

Ricardo Terra ([email protected]) POO 8 de julho de 2011 68 / 526

Page 69: JAVA - Apostila.pdf

Java – Introdução

Ricardo Terra ([email protected]) POO 8 de julho de 2011 69 / 526

Page 70: JAVA - Apostila.pdf

Java – Introdução

FuncionamentoCompilador

Entrada: código fonteSaída: bytecodes

BytecodesCódigo intermediário a ser interpretado pela JVMIndependente de plataforma

JVMClass Loader: carrega o bytecode para a memóriaBytecode Verifier: confere a consistência do bytecodeInterpreter: interpreta os bytecodes para código de máquina

Ricardo Terra ([email protected]) POO 8 de julho de 2011 70 / 526

Page 71: JAVA - Apostila.pdf

Java – Introdução

Java SE – Funcionamento – Entendimento Visual

Ricardo Terra ([email protected]) POO 8 de julho de 2011 71 / 526

Page 72: JAVA - Apostila.pdf

Java – Introdução

Hello Terra – Código

1 public class Hel loTer ra {

3 public s t a t i c void main( S t r i ng [ ] args ) {System . out . p r i n t l n ( " Hel lo Terra ! " ) ;

5 }

7 }

Hello Terra – Explicação Superficial

Case-sensitiveTodo o programa sensível a caixa: A 6= a

Método mainPonto de entrada de uma aplicação Java

System.out.println (sop)Impressão em tela

Ricardo Terra ([email protected]) POO 8 de julho de 2011 72 / 526

Page 73: JAVA - Apostila.pdf

Java – Introdução

Compilação e Execução

Compilar: javac HelloTerra.java

Executar: java HelloTerra

No entanto, o Eclipse faz tudo para você sem que perceba =)

Ricardo Terra ([email protected]) POO 8 de julho de 2011 73 / 526

Page 74: JAVA - Apostila.pdf

Java – Introdução

Java e outras linguagens

Linguagem realmente orientada por objetosMenos que Eiffel

Sintaxe muito baseada na sintaxe de Cif, switch, while, do..while, for ...

Tipos de dados básicos similares ao da linguagem C

Remoção de várias características perigosas de CPonteirosAritmética de ponteirosGerenciamento automático de memória (não existe maismalloc, free etc)

API bem completaWeb, GUI (Graphical User Interface), Networking etc

Ricardo Terra ([email protected]) POO 8 de julho de 2011 74 / 526

Page 75: JAVA - Apostila.pdf

Java – Introdução

ClassesUma vez que vimos Diagrama de Classes, o entendimentofica fácil

Define um TAD (Tipo Abstrato de Dados)

Contém:atributos (propriedades)métodos (comportamento)

Ricardo Terra ([email protected]) POO 8 de julho de 2011 75 / 526

Page 76: JAVA - Apostila.pdf

Java – Introdução

Classe Pessoa – Exemplo Simples

1 public class Pessoa {private S t r i ng nome;

3

public S t r i ng getNome( ) {5 return t h i s .nome;

}7

public void setNome( S t r i ng nome ) {9 t h i s .nome = nome;

}11

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 76 / 526

Page 77: JAVA - Apostila.pdf

Java – Introdução

Estrutura de um Arquivo Java

Pacote

onde o arquivo se encontra

Importsdo que o arquivo necessita

Classe Pública

Apenas uma por arquivoDeve ter o mesmo nome do arquivo

Classes Não Públicas

Conceito Avançado (não veremos)

Ricardo Terra ([email protected]) POO 8 de julho de 2011 77 / 526

Page 78: JAVA - Apostila.pdf

Java – Introdução

Estrutura de uma Classe JavaAtributos

propriedadesestáticos depois dinâmicos

Construtorescomo seus objetos são criadosordenados pela quantidade deparâmetros

Métodoscomportamentosestáticos depois dinâmicos

Ricardo Terra ([email protected]) POO 8 de julho de 2011 78 / 526

Page 79: JAVA - Apostila.pdf

Java – Introdução

Classe Pessoa – Exemplo Mais Completo

package pojo ;2

import java . u t i l . Date ;4

public class Pessoa {6 public f i n a l s t a t i c S t r i ng ESPECIE = "Homo Sapiens " ;

private S t r i ng nome;8 private Date dataNascimento ;

10 public Pessoa ( ) { }

12 public Pessoa ( S t r i ng nome, Date dataNascimento) {t h i s .nome = nome;

14 t h i s . dataNascimento = dataNascimento ;}

16

public S t r i ng getNome( ) {18 return t h i s .nome;

}20 public void setNome( S t r i ng nome ) {

t h i s .nome = nome;22 }

public Date getDataNascimento ( ) {24 return t h i s . dataNascimento ;

}26 public void setDataNascimento ( Date dataNascimento ) {

t h i s . dataNascimento = dataNascimento ;28 }

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 79 / 526

Page 80: JAVA - Apostila.pdf

Java – Introdução

ComentáriosAlgumas vezes se deseja explicar um código, explicitar umainformação em linguagem natural

Eles não deixam o programa mais lento e seu uso éaltamente recomendável

Três tipos:Comentário para bloco de linha (semelhante a C)/*

blablabla*/

Comentário até final de linha (semelhante a C)// blablabla

Comentário JavaDoc (gera manual do sistema)/*

@author Ricardo Terra

*/

Ricardo Terra ([email protected]) POO 8 de julho de 2011 80 / 526

Page 81: JAVA - Apostila.pdf

Java – Introdução

Classe Matematica – Exemplo Comentário

1 /∗∗∗ Classe com atr ibutos e operacoes matematicas

3 ∗ @author Ricardo Terra∗/

5 public class Matematica {/∗∗

7 ∗ Atr ibuto P I com apenas 6 casas decimais∗/

9 public s t a t i c f i n a l double P I = 3.141569; // Constante P I

11 /∗∗∗ Metodo que calcula a area de uma circunferencia

13 ∗ @param raio Raio da circunferencia∗ @return Area da Circunferencia

15 ∗/public s t a t i c double areaCircunferencia ( double ra io ) {

17 /∗∗ A funcao pow da classe Math eleva a uma potencia ,

19 ∗ no caso ao quadrado∗/

21 return P I ∗ Math .pow( raio , 2 ) ;}

23

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 81 / 526

Page 82: JAVA - Apostila.pdf

Java – Introdução

Classe Matematica – JavaDoc gerado

Ricardo Terra ([email protected]) POO 8 de julho de 2011 82 / 526

Page 83: JAVA - Apostila.pdf

Java – Introdução

Padrões BluePrintsNomes de classes

CamelCase com primeira letra em caixa altaEx: Animal, AnimalSelvagem, GuardaChuva ...

Nome de identificadores, atributos ou métodosCamelCase com primeira letra em caixa baixaEx: nome, nomeCompleto, comer(), comerMuito() ...

Nome de pacotesSempre em caixa baixaEx: com.terra.pojo, com.terra.dataaccessobject ...

Evitem caracteres especiais:_, -, ç, ã, á, ê, é ...

Ricardo Terra ([email protected]) POO 8 de julho de 2011 83 / 526

Page 84: JAVA - Apostila.pdf

Java

Tipos Básicos

Ricardo Terra ([email protected]) POO 8 de julho de 2011 84 / 526

Page 85: JAVA - Apostila.pdf

Java – Tipos Básicos

IdentificadoresAtribuição como em C

int valor;

double saldo = 324.20;

Declaração de uma variável pode ocorrer em qualquerlocal, evidentemente, antes do uso

Diferentemente de C, Pascal, Object Pascal ...

Regras de identificadorPrimeiro caracter deve ser letra, _ ou $

São case-sensitive

Logicamente, identificadores deve ser diferente daspalavras reservadas da linguagem

6= de for, while, int ...

Ricardo Terra ([email protected]) POO 8 de julho de 2011 85 / 526

Page 86: JAVA - Apostila.pdf

Java – Tipos Básicos

Tipos Primitivosboolean (1 bit)→ true e false

char (16 bits sem sinal)→ 0 a 65535

byte (8 bits)→ -128 a 127

short (16 bits)→ -32768 a 32767

int (32 bits)→ −231 a 231 − 1

long (64 bits)→ −263 a 263−1

float (32 bits)→ −1.40239846e−46 a 3.40282347e38

double (64 bits)→ −4.94065645841246544e−324 a 1.7976931348623157e308

Qualquer outro tipo não citado acima são classesPor exemplo, String, Date são classes

Ricardo Terra ([email protected]) POO 8 de julho de 2011 86 / 526

Page 87: JAVA - Apostila.pdf

Java – Tipos Básicos

Exemplo – Observando Limites

public s t a t i c void main( S t r i ng [ ] args ) {2 System . out . p r i n t f ( " boolean : %b e %b\n " , Boolean . TRUE , Boolean . FALSE ) ;

4 System . out . p r i n t f ( " char : %d e %d\n " , ( i n t ) Character . MIN_VALUE , ( i n t ) Character .MAX_VALUE ) ;

6 System . out . p r i n t f ( " byte : %d e %d\n " , Byte . MIN_VALUE , Byte .MAX_VALUE ) ;System . out . p r i n t f ( " shor t : %d e %d\n " , Short . MIN_VALUE , Short .MAX_VALUE ) ;

8 System . out . p r i n t f ( " i n t : %d e %d\n " , Integer . MIN_VALUE , Integer .MAX_VALUE ) ;System . out . p r i n t f ( " long : %d e %d\n " , Long . MIN_VALUE , Long .MAX_VALUE ) ;

10

System . out . p r i n t f ( " f loat : %g e %g\n " , F loat . MIN_VALUE , F loat .MAX_VALUE ) ;12 System . out . p r i n t f ( " double : %g e %g\n " , Double . MIN_VALUE , Double .MAX_VALUE ) ;

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 87 / 526

Page 88: JAVA - Apostila.pdf

Java – Tipos Básicos

Tipo char

Representa um caractere UNICODEhttp://www.tamasoft.co.jp/en/general-info/unicode.html

Intervalo de 0 a 255 semelhante à tabela ASCII

Atribuição:‘a’, ‘\u0040’ ou número

Exemplo

1 public s t a t i c void main( S t r i ng [ ] args ) {char ch = ’a’ ;

3 System . out . p r i n t l n ( ch ) ; /∗ a ∗/

5 ch = ’\u0040 ’ ;System . out . p r i n t l n ( ch ) ; /∗ @ ∗/

7

ch = 98;9 System . out . p r i n t l n ( ch ) ; /∗ b ∗/

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 88 / 526

Page 89: JAVA - Apostila.pdf

Java – Tipos Básicos

Exemplo – Imprimindo Tabela Ascii

public s t a t i c void main( S t r i ng [ ] args ) {2 f o r ( char ch = 0; ch < 255; ch++ ) {

System . out . p r i n t f ( "%d: %c\n " , ( i n t ) ch , ch ) ;4 }

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 89 / 526

Page 90: JAVA - Apostila.pdf

Java – Tipos Básicos

Tipos inteiros – byte, short, int e long

Por que não simplificar e utilizar somente long?

Modo octal e hexadecimal de atribuição:Quando se insere 0 antes do número indica base octalEx: 011 equivale a 9

Quando se insere 0x antes do número indica basehexadecimalEx: 0x18 equivale a 24

Atribuir valores fora do limite requer cast, contudo não ativaexceção (nomenclatura de Java para erro)

Ex: byte b = (byte) 128 atribui -128 a b

Divisão por 0 ativa exceção (ArithmeticException)Ex: int i = 2/0 ativa exceção em tempo de execução(não em compilação)

Ricardo Terra ([email protected]) POO 8 de julho de 2011 90 / 526

Page 91: JAVA - Apostila.pdf

Java – Tipos Básicos

Exemplo – Atribuição

1 public s t a t i c void main( S t r i ng [ ] args ) {i n t i 1 = 17;

3 i n t i 2 = 021;i n t i 3 = 0x11 ;

5

System . out . p r i n t f ( "%d %d %d" , i1 , i2 , i 3 ) ;7 }

Pergunta-se

Qual a saída?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 91 / 526

Page 92: JAVA - Apostila.pdf

Java – Tipos Básicos

Tipos de Ponto Flutuante – float e double

float→ precisão simplesNúmero deverá conter o pós-fixo f ou FEx: float f = 9.02f ou float f = 9.02F

double→ precisão duplaAtribuição normal: double d = 9.02

Se desejar, número pode conter o pós-fixo g ou GEx: double d = 9.02g ou double d = 9.02G

Pode-se utilizar notação exponecialEx: double d = 3.02e2 ou double d = 2.56E-3

Não gera exceção em caso de divisão por 01/0 gera ∞-1/0 gera −∞0/0 gera NaN

Ricardo Terra ([email protected]) POO 8 de julho de 2011 92 / 526

Page 93: JAVA - Apostila.pdf

Java – Tipos Básicos

Exemplo – Atribuição

1 public s t a t i c void main( S t r i ng [ ] args ) {f l o a t f = 3.01 f ;

3 double d1 = −3.01;double d2 = 3.564e+2;

5

System . out . p r i n t f ( "%g %g %g\n " , f , d1 , d2 ) ;7

double d3 = 1 .0/0 ;9 double d4 = 0 .0/0 ;

System . out . p r i n t f ( "%g %g\n " , d3 , d4 ) ;11 }

Pergunta-se

Qual a saída?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 93 / 526

Page 94: JAVA - Apostila.pdf

Java – Tipos Básicos

Conversão e Promoção

Promoção implícita (feita automaticamente)Por exemplo, de int para float

Conversão explícita (feita via cast)Por exemplo, de double para int

Quando se trabalha com operações com diversos tipos devariáveis, o valor é promovido para a de maiorcomplexidade

Exceto, em operações entre variáveis inteiras inferiores aoint em que todos os valores são promovidos para intautomaticamente

Ricardo Terra ([email protected]) POO 8 de julho de 2011 94 / 526

Page 95: JAVA - Apostila.pdf

Java – Tipos Básicos

Exemplo

1 public s t a t i c void main( S t r i ng [ ] args ) {byte b = ( byte ) 264; /∗ Conversao Forcada ∗/

3 System . out . p r i n t l n ( b ) ;

5 shor t s = ( shor t ) 3 . 5 ; /∗ Conversao Forcada ∗/System . out . p r i n t l n ( s ) ;

7

i n t i = b + s ; /∗ b e s se promovem para operar ∗/9 System . out . p r i n t l n ( i ) ;

11 f l o a t f = 3; /∗ Promocao Impl ic i ta ∗/System . out . p r i n t l n ( f ) ;

13

double d = 3 / 2 ; /∗ Promocao Impl ic i ta do Resultado ∗/15 System . out . p r i n t l n ( d ) ;

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 95 / 526

Page 96: JAVA - Apostila.pdf

Java – Tipos Básicos

Constantes caractere de barra invertidaPara a maioria dos caracteres, as aspas simples funcionambem, porém para enter, tab, esc seria bem complicadorepresentá-los, uma vez que são teclas de ação. Por isto,Java definiu as constantes especiais de barra invertida

Constantes especiais mais utilizadas\n Nova Linha

\r Retorno de Carro (CR)

\t Tabulação horizontal

\’ Aspas Simples

\" Aspas Duplas

\\ Barra Invertida

Ricardo Terra ([email protected]) POO 8 de julho de 2011 96 / 526

Page 97: JAVA - Apostila.pdf

Java

Operadores

Ricardo Terra ([email protected]) POO 8 de julho de 2011 97 / 526

Page 98: JAVA - Apostila.pdf

Java – Operadores

Quatro classes de operadores:Aritméticos

Relacionais

Lógicos

Bit a bit

Ricardo Terra ([email protected]) POO 8 de julho de 2011 98 / 526

Page 99: JAVA - Apostila.pdf

Java – Operadores

Tabela de Prioridades

Ricardo Terra ([email protected]) POO 8 de julho de 2011 99 / 526

Page 100: JAVA - Apostila.pdf

Java – Operadores

Operadores Artiméticos+

-

/

% (corresponde ao mod do Pascal)

Ricardo Terra ([email protected]) POO 8 de julho de 2011 100 / 526

Page 101: JAVA - Apostila.pdf

Java – Operadores

Prioridades e Associatividades normaisParênteses mudam as prioridades

2 + 2 * 4 != (2 + 2) * 4

Operador /

Operando inteiros:

Divisão Inteira: (7 / 2 = 3)

Pelo menos um ponto flutuante:Divisão Fracionária:

7.0 / 2.0 = 3.5

7.0 / 2 = 3.5

7 / 2.0 = 3.5

Operador %

Resto de divisão inteiraEx: 4 % 2 = 0 e 5 % 2 = 1

Ricardo Terra ([email protected]) POO 8 de julho de 2011 101 / 526

Page 102: JAVA - Apostila.pdf

Java – Operadores

Operadores Aritméticos em Atribuições Compostas

Em geral, os operadores aritméticos possuem um operadorde atribuição correspondente:

Exemplo:

A = A + 2 ↔ A += 2

Outros:-=

*=

/=

%=

Ricardo Terra ([email protected]) POO 8 de julho de 2011 102 / 526

Page 103: JAVA - Apostila.pdf

Java – Operadores

Exemplo de operadores de atribuição compostos

public s t a t i c void main( S t r i ng [ ] args ) {2 i n t valor = 10;

4 valor += 10;System . out . p r i n t f ( "%d" , valor ) ; /∗ valor : 20 ∗/

6

valor −= 10;8 System . out . p r i n t f ( "%d" , valor ) ; /∗ valor : 10 ∗/

10 valor ∗= 5;System . out . p r i n t f ( "%d" , valor ) ; /∗ valor : 50 ∗/

12

valor /= 10;14 System . out . p r i n t f ( "%d" , valor ) ; /∗ valor : 5 ∗/

16 valor %= 3;System . out . p r i n t f ( "%d" , valor ) ; /∗ valor : 2 ∗/

18 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 103 / 526

Page 104: JAVA - Apostila.pdf

Java – Operadores

Operadores Aritméticos de incremento e decremento++ (incrementa 1)

-- (decrementa 1)

Exemplos:A = A + 1 ↔ A += 1 ↔ A++ ↔ ++A

A = A - 1 ↔ A -= 1 ↔ A-- ↔ --A

Posicionamento (vale para ++ e para --)++ após a variável:

pós-incremento (retorna e incrementa)

++ antes da variável:

pré-incremento (incrementa e retorna)

Ricardo Terra ([email protected]) POO 8 de julho de 2011 104 / 526

Page 105: JAVA - Apostila.pdf

Java – Operadores

Exemplos

1 i n t i = 0;System . out . p r i n t f ( "%d" , i ++);System . out . p r i n t f ( "%d" , i ) ;System . out . p r i n t f ( "%d" , −− i ) ;

2 i n t i = 0;System . out . p r i n t f ( "%d" , ++ i ) ;System . out . p r i n t f ( "%d" , i ) ;System . out . p r i n t f ( "%d" , i −−);System . out . p r i n t f ( "%d" , i ) ;

Pergunta-se

Qual a saída de cada printf?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 105 / 526

Page 106: JAVA - Apostila.pdf

Java – Operadores

Entendeu mesmo?

1 public s t a t i c void main( S t r i ng [ ] args ) {i n t i = 0;

3 System . out . p r i n t f ( "%d" , i ++ ) ;System . out . p r i n t f ( "%d" , i−− ) ;

5 System . out . p r i n t f ( "%d" , −− i ) ;System . out . p r i n t f ( "%d" , i ) ;

7

i = 6;9 System . out . p r i n t f ( "%g" , ++ i / 2.0 ) ;

}

Pergunta-se

Qual a saída de cada printf?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 106 / 526

Page 107: JAVA - Apostila.pdf

Java – Operadores

Operadores Relacionais:== (comparação)

!= (diferença)

< > <= >=

Operadores Lógicos:

São eles: & (and), | (or) e ! (not)

Normalmente, para and e or, utiliza-se operadores de curtocircuito que fazem com que a expressão só seja analisadaaté que seja possível determinar o resultado

São eles: && (and) e || (or)

Ricardo Terra ([email protected]) POO 8 de julho de 2011 107 / 526

Page 108: JAVA - Apostila.pdf

Java – Operadores

Operadores Lógicos de Curto Circuito

Ao encontrarem um valor que determine seu resultado, nãotestam mais as outras condições, isto é, a expressão só seráanalisada até que seja possível determinar o resultado

Exemplo: considere que os métodos a e b retornem booleanoa() & b()→ executa os dois métodos para obter oresultado

a() | b()→ executa os dois métodos para obter oresultado

a() && b()→ se o método a retornar false, o resultadoserá false e o método b nem será executado

a() || b()→ se o método a retornar true, o resultadoserá true e o método b nem será executado

Ricardo Terra ([email protected]) POO 8 de julho de 2011 108 / 526

Page 109: JAVA - Apostila.pdf

Java – Operadores

Entendeu mesmo?

private s t a t i c boolean a ( ) { return fa lse ; }2

private s t a t i c boolean b ( ) { return true ; }4

private s t a t i c boolean c ( ) { return fa lse ; }6

private s t a t i c boolean d ( ) { return true ; }8

public s t a t i c void main( S t r i ng [ ] args ) {10 System . out . p r i n t f ( "%d" , a ( ) & b ( ) & c ( ) & d ( ) ) ;

System . out . p r i n t f ( "%d" , a ( ) && b ( ) && c ( ) && d ( ) ) ;12 System . out . p r i n t f ( "%d" , a ( ) || b ( ) || c ( ) || d ( ) ) ;

}

Pergunta-se

Quais métodos serão executados e qual o retorno dos printf’sdas linhas 10, 11 e 12?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 109 / 526

Page 110: JAVA - Apostila.pdf

Java – Operadores

Tiro no pé!

1 public s t a t i c void main( S t r i ng [ ] args ) {i n t a = 0;

3 i f ( a != 0 & 2 / a > 5 ) {System . out . p r i n t l n ( "OK" ) ;

5 } else {System . out . p r i n t l n ( "NOK" ) ;

7 }}

Pergunta-se

O programa acima apresenta um erro fatal. Como evitá-lo?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 110 / 526

Page 111: JAVA - Apostila.pdf

Java – Operadores

Operadores bit a bit:& (and)

Ex: 3 & 1 ↔ 0011 & 0001 ↔ 0001 ↔ 1

| (or)Ex: 3 | 1 ↔ 0011 | 0001 ↔ 0011 ↔ 3

ˆ (xor)Ex: 3 ˆ 1 ↔ 0011 ˆ 0001 ↔ 0010 ↔ 2

Ricardo Terra ([email protected]) POO 8 de julho de 2011 111 / 526

Page 112: JAVA - Apostila.pdf

Java – Operadores

Operadores bit a bit:~ (complemento de um)

Ex: 3 ↔ ˜0011 ↔ 1100 ↔ 12

<< (deslocamento à esquerda)Ex: 4 << 1 ↔ 0100 << 1 ↔ 1000 ↔ 8

>> (deslocamento à direita)Ex: 4 >> 1 ↔ 0100 >> 1 ↔ 0010 ↔ 2

>>> (deslocamento à direita com sinal)Ex: -127 >>> 1 ↔ 2147483584

Ricardo Terra ([email protected]) POO 8 de julho de 2011 112 / 526

Page 113: JAVA - Apostila.pdf

Java – Operadores

Desafio

public s t a t i c void main( S t r i ng [ ] args ) {2 i n t x = 10 , y = −2;

4 System . out . p r i n t l n ( (−2 ∗ −1) << 3 ) ;

6 System . out . p r i n t l n ( ++x − −−y + ( ( x >> 3) << 2) ) ;

8 System . out . p r i n t l n ( (x % 5) << ( (4 % 2) + 4) ) ;}

Pergunta-se

Qual a saída de cada printf?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 113 / 526

Page 114: JAVA - Apostila.pdf

Java – Operadores

Exercícios10 & 13 ?

10 | 13 ?

10 ˆ 13 ?

0 ?

8 » 1 ?

2 « 2 ?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 114 / 526

Page 115: JAVA - Apostila.pdf

Java

Comandos condicionais

Ricardo Terra ([email protected]) POO 8 de julho de 2011 115 / 526

Page 116: JAVA - Apostila.pdf

Java – Comandos condicionais

Comandos condicionais (if, switch e operador ternário)Comando condicionais são aqueles que dependendo deuma condição executam um bloco, caso a condição nãoseja atendida, o bloco não será executado

Java provê suporte a três comandos condicionais:

if

switch

operador ternário (? :)

Ricardo Terra ([email protected]) POO 8 de julho de 2011 116 / 526

Page 117: JAVA - Apostila.pdf

Java – Comandos condicionais

Comandos condicionais - ifSintaxe do comando if

i f ( condicao ) {comando1;comando2;comando3;

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 117 / 526

Page 118: JAVA - Apostila.pdf

Java – Comandos condicionais

Observações:

Os parênteses que envolvem a condição sãoOBRIGATÓRIOS

Diferentemente de Pascal, Delphi (Object Pascal) etc

A condição deverá retornar um tipo booleano

Os comandos somente serão executados se a condição forverdadeira

Ricardo Terra ([email protected]) POO 8 de julho de 2011 118 / 526

Page 119: JAVA - Apostila.pdf

Java – Comandos condicionais

Comandos condicionais - if

O uso dos braços NÃO é obrigatório caso seja apenas umúnico comando

Porém, a boa prática recomenda a utilização de braçosindependente do número de comandos

Melhor indentação do código

i f ( t rue ) comando;

equivale a:

i f ( t rue ) {comando;

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 119 / 526

Page 120: JAVA - Apostila.pdf

Java – Comandos condicionais

Comandos condicionais - ifComo faço o conhecido:

se verdade então . . . senão . . .

i f ( condicao ) {comando1;comando2;comando3;

} else {comando4;comando5;comando6;

}

Pergunta-se

Quais comandos serão executados se a condição forverdadeira? E se for falsa?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 120 / 526

Page 121: JAVA - Apostila.pdf

Java – Comandos condicionais

Comandos condicionais - if

1 i n t a = Teclado . le r In teger ( " D ig i te a" ) ;i n t b = Teclado . le r In teger ( " D ig i te b" ) ;

3

i f ( a >= b ) {5 System . out . p r i n t f ( "%d e maior ou igual a %d! " , a, b ) ;

} else {7 System . out . p r i n t f ( "%d e menor que %d! " , a, b ) ;

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 121 / 526

Page 122: JAVA - Apostila.pdf

Java – Comandos condicionais

Comandos condicionais - ifComando if podem ser aninhados

1 i n t nota = Teclado . le r In teger ( " D ig i te uma nota de 0 a 100 " ) ;

3 i f ( nota >= 90 ) {System . out . p r i n t l n ( " Nota A" ) ;

5 } else i f ( nota >= 80 ) {System . out . p r i n t l n ( " Nota B " ) ;

7 } else i f ( nota >= 70 ) {System . out . p r i n t l n ( " Nota C" ) ;

9 } else {System . out . p r i n t l n ( "Reprovado" ) ;

11 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 122 / 526

Page 123: JAVA - Apostila.pdf

Java – Comandos condicionais

Exemplo if

char op = Teclado . lerChar ( " D ig i te um operador (+−/∗) " ) ;2

i f ( op == ’+ ’ || op == ’−’ ) {4 System . out . p r i n t l n ( "Op. Baixa Prior idade .\n " ) ;

} else i f ( op == ’ / ’ || op == ’∗ ’ ) {6 System . out . p r i n t l n ( "Op. Alta Pr ior idade .\n " ) ;

} else {8 System . out . p r i n t l n ( " Caractere Inval ido !\n " ) ;

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 123 / 526

Page 124: JAVA - Apostila.pdf

Java – Comandos condicionais

Comandos condicionais - switchNa instrução switch, uma variável de tipo primitivo char ouint é comparada com cada valor em questão. Se umvalor coincidente é achado, a instrução (ou instruções)depois do teste é executada

Sintaxe:

switch ( var iavel ) {case 1: comandoA; break ;case 2: comandoB; break ;case 3: comandoC; break ;default : comandoPadrao;

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 124 / 526

Page 125: JAVA - Apostila.pdf

Java – Comandos condicionais

Comandos condicionais - switchSe nenhum valor for encontrado, a instrução default éexecutada

O comando break é necessário para quebrar o switch,pois assim que encontrada a opção correta, é executadotudo em seguida

Ricardo Terra ([email protected]) POO 8 de julho de 2011 125 / 526

Page 126: JAVA - Apostila.pdf

Java – Comandos condicionais

Comandos condicionais - switch

char l e t ra = ’B ’ ;2

switch ( le t ra ) {4 case ’A’ : System . out . p r i n t l n ( " Entrou em A" ) ; break ;

case ’B ’ : System . out . p r i n t l n ( " Entrou em B " ) ;6 case ’C’ : System . out . p r i n t l n ( " Entrou em C" ) ; break ;

case ’D’ : System . out . p r i n t l n ( " Entrou em D" ) ; break ;8 default : System . out . p r i n t l n ( " Entrou em Default " ) ;

}

Pergunta-se

Qual a saída?

E se o valor de letra fosse ’C’? E se fosse ’a’?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 126 / 526

Page 127: JAVA - Apostila.pdf

Java – Comandos condicionais

Comandos condicionais - switch

char l e t ra = ’B ’ ;2

switch ( le t ra ) {4 default : System . out . p r i n t l n ( " Entrou em Default " ) ;

case ’A’ : System . out . p r i n t l n ( " Entrou em A" ) ; break ;6 case ’B ’ : System . out . p r i n t l n ( " Entrou em B " ) ; break ;

case ’C’ : System . out . p r i n t l n ( " Entrou em C" ) ; break ;8 case ’D’ : System . out . p r i n t l n ( " Entrou em D" ) ; break ;

}

Pergunta-se

Qual a saída?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 127 / 526

Page 128: JAVA - Apostila.pdf

Java – Comandos condicionais

Comandos condicionais - switch

char l e t ra = ’b’ ;2

switch ( le t ra ) {4 case ’A’ : System . out . p r i n t l n ( " Entrou em A" ) ; break ;

case ’B ’ : System . out . p r i n t l n ( " Entrou em B " ) ; break ;6 default : System . out . p r i n t l n ( " Entrou em Default " ) ;

case ’C’ : System . out . p r i n t l n ( " Entrou em C" ) ; break ;8 case ’D’ : System . out . p r i n t l n ( " Entrou em D" ) ; break ;

}

Pergunta-se

Qual a saída?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 128 / 526

Page 129: JAVA - Apostila.pdf

Java – Comandos condicionais

Exemplo switch

char op = Teclado . lerChar ( " D ig i te um operador (+−/∗) " ) ;2

switch (op) {4 case ’+ ’ :

case ’−’ : System . out . p r i n t l n ( "Op. Baixa Prior idade .\n " ) ; break ;6 case ’∗ ’ :

case ’ / ’ : System . out . p r i n t l n ( "Op. Alta Pr ior idade .\n " ) ; break ;8 default : System . out . p r i n t l n ( " Caractere Inval ido !\n " ) ;

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 129 / 526

Page 130: JAVA - Apostila.pdf

Java – Comandos condicionais

Comandos condicionais - Operador TernárioExistem situações cujo uso do if não é “elegante”

Por exemplo, suponha que a função max retorne o maiornúmero dentre os dois passados via parâmetros formais

private s t a t i c i n t max( i n t a, i n t b ) {2 i f ( a > b ) {

re turn a;4 } else {

re turn b;6 }

}8

public s t a t i c void main( S t r i ng [ ] args ) {10 System . out . p r i n t f ( "%d" , max( 3 , 7 ) ) ;

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 130 / 526

Page 131: JAVA - Apostila.pdf

Java – Comandos condicionais

Comandos condicionais - Operador TernárioO operador ternário é uma expressão, significando que eledevolve um valor

O operador ternário é muito útil para condicionais (curtas esimples) e tem o seguinte formato:

variável = <condição> ? seTrue : seFalse;

A condição pode estar envolvida entre parênteses parafacilitar a leitura, contudo não é obrigatório

Ricardo Terra ([email protected]) POO 8 de julho de 2011 131 / 526

Page 132: JAVA - Apostila.pdf

Java – Comandos condicionais

Exemplos:

i n t a = 2;i n t b = 3;i n t c = ( a > b ) ? a : b;

Indica que se a for maior que b, c recebe o valor de a, casocontrário, c recebe o valor de b, isto é, c recebe o maiorvalor (a ou b)

Pergunta-se

Qual o valor das variáveis abaixo:i n t peso = ( 2 != 2 ) ? 80 : 63;

char l e t ra = ( 1 == 1 ) ? ’R ’ : ’ T ’ ;

S t r i ng r e s u l t = ( max( a, b ) > 10 ) ? "a ou b > 10 " : "a e b < 10 " ;

Ricardo Terra ([email protected]) POO 8 de julho de 2011 132 / 526

Page 133: JAVA - Apostila.pdf

Java – Comandos condicionais

Comandos condicionais - Operador TernárioNão necessariamente o retorno do operador ternário deveser atribuído a uma variável

Por exemplo, seu retorno pode ser o retorno de uma funçãocomo faz a função max com operador ternário:

private s t a t i c i n t max( i n t a, i n t b ) {return (a > b) ? a : b;

}

Ou mesmo o retorno pode servir como parâmetro dechamada de uma função:

System . out . p r i n t l n ( (a > b) ? "a maior ! " : "b maior ! " ) ;System . out . p r i n t f ( "%d" , (a > b) ? a : b ) ;

Ricardo Terra ([email protected]) POO 8 de julho de 2011 133 / 526

Page 134: JAVA - Apostila.pdf

Java

Comandos de repetição

Ricardo Terra ([email protected]) POO 8 de julho de 2011 134 / 526

Page 135: JAVA - Apostila.pdf

Java – Comandos de repetição

Comandos repetição (while, do...while e for)

Comandos de repetição são utilizados para repetir umbloco de código

Java provê suporte a três comandos de repetição:

while (enquanto)

do...while (faça...enquanto)

for (para)

Ricardo Terra ([email protected]) POO 8 de julho de 2011 135 / 526

Page 136: JAVA - Apostila.pdf

Java – Comandos de repetição

Comandos repetição - while

O comando while é utilizado para repetir um bloco deacordo com uma condição

É considerado um loop de pré-teste

Isto é, testa a condição antes de executar o bloco

Sintaxe:

while ( condicao ) {comando1;comando2;comandoN;

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 136 / 526

Page 137: JAVA - Apostila.pdf

Java – Comandos de repetição

Comandos repetição - while

i n t i = 0 ;

while ( i < 10 ) {System . out . p r i n t f ( "%d" , ++ i ) ;

}

Pergunta-se

Qual a saída?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 137 / 526

Page 138: JAVA - Apostila.pdf

Java – Comandos de repetição

Comandos repetição - do...while

O comando do...while é semelhante ao while, contudoé um comando de repetição de pós-teste

Isto é, somente ao final da execução do bloco que severifica a condição

Geralmente, é utilizado quando se deseja testar acondição somente a partir da segunda iteração

Por exemplo, uma leitura da opção de um menu. Pede paradigitar uma primeira vez. Somente se não digitar uma opçãoválida que pede para digitar novamente

Ricardo Terra ([email protected]) POO 8 de julho de 2011 138 / 526

Page 139: JAVA - Apostila.pdf

Java – Comandos de repetição

Sintaxe:

do {comando1;comando2;comandoN;

} while ( condicao ) ;

Observe o ponto-e-vírgula após os parênteses da condição. Não o esqueça!

Ricardo Terra ([email protected]) POO 8 de julho de 2011 139 / 526

Page 140: JAVA - Apostila.pdf

Java – Comandos de repetição

Comandos repetição - do...while

1 i n t i = 0 ;

3 do {System . out . p r i n t f ( "%d" , ++ i ) ;

5 } while ( 1 != 1 ) ;

Pergunta-se

Qual a saída?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 140 / 526

Page 141: JAVA - Apostila.pdf

Java – Comandos de repetição

Exemplo

i n t i ;2

do {4 i = Teclado . le r In teger ( " D ig i te um numero entre 0 e 10: " ) ;

} while ( i < 0 || i > 10 ) ;6

System . out . p r i n t f ( "Numero digitado : %d\n " , i ) ;

Pergunta-se

Qual a saída?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 141 / 526

Page 142: JAVA - Apostila.pdf

Java – Comandos de repetição

Comandos de repetição - for

Comando de repetição mais poderoso da linguagem

É composta por:Inicialização: executado uma única vez no início do loop

Condição: executado sempre antes de cada iteração. Severdadeira, o bloco é executado. Se falsa, é finalizado

Operação : executado sempre ao término de cada iteração

Sintaxe

f o r ( i n ic ia l i zacao ; condicao ; operacao ) {comando1;comando2;. . .

comandoN;}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 142 / 526

Page 143: JAVA - Apostila.pdf

Java – Comandos de repetição

Exemplo

f o r ( i n t i = 0 ; i < 10; i ++ ) {2 System . out . p r i n t f ( "%d" , i ) ;

}

Pergunta-se

Qual a saída?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 143 / 526

Page 144: JAVA - Apostila.pdf

Java – Comandos de repetição

SintaxeNo laço for, a inicialização, condição e operação sãotodas opcionais

Exemplo

i n t i = 0 ;2

f o r ( ; ; ) { /∗ Sem condicao , admite−se sempre verdade ∗/4 System . out . p r i n t f ( "%d" , ++ i ) ;

}

Pergunta-se

Qual a saída?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 144 / 526

Page 145: JAVA - Apostila.pdf

Java – Comandos de repetição

Comandos de repetição - for

Podemos ter um for dentro de outro, e outro dentro deoutro, e outro dentro de outro...

f o r ( i n t i = 0 ; i <= 2 ; i ++ ) {2 f o r ( i n t j = 0 ; j < 2 ; j ++ ) {

System . out . p r i n t f ( "%d %d" , i , j ) ;4 }

}

Pergunta-se

Qual a saída?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 145 / 526

Page 146: JAVA - Apostila.pdf

Java – Comandos de repetição

Comandos de repetição - for

Um comando for pode ter várias inicializações, umacondição complexa e várias operações

Exemplo

f o r ( i n t i = 1 , d = 2 ∗ i ; i <= 10 || d == 22; i ++ , d = i ∗ 2 ) {2 System . out . p r i n t f ( "%d − %d\n " , i , d ) ;

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 146 / 526

Page 147: JAVA - Apostila.pdf

Java – Comandos de repetição

Comando break

Inserido dentro de um bloco de repetição (pode tambémser while ou do...while)

Caso seja executado, o bloco de repetição é finalizado

Exemplo

i n t i = 0 ;2

f o r ( ; i < 10; i ++ ) {4 i f ( i == 3 ) {

break ;6 }

System . out . p r i n t f ( "%d" , i ) ;8 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 147 / 526

Page 148: JAVA - Apostila.pdf

Java – Comandos de repetição

Comando continue

Inserido dentro de um bloco de repetição

Caso seja executado, a iteração atual do bloco derepetição é interrompida e parte para a próxima iteração

Exemplo

1 f o r ( i n t i = 0 ; i < 10; i ++ ) {i f ( i == 3 || i == 5 ) {

3 continue ;}

5 System . out . p r i n t f ( "%d" , i ) ;}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 148 / 526

Page 149: JAVA - Apostila.pdf

Java – Comandos de repetição

Comando de repetição - for

Logicamente, pode-se utilizar break e continueconjuntamente

Exemplo

1 f o r ( i n t i = 0 ; i < 3 ; i ++ ) {i f ( i == 1 ) {

3 continue ;}

5 f o r ( i n t j = 0 ; j < 2 ; j ++ ) {System . out . p r i n t f ( "%d %d\n " , i , j ) ;

7 break ;}

9 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 149 / 526

Page 150: JAVA - Apostila.pdf

Java – Comandos de repetição

Comando de repetição rotulados

Como Java não possui a instrução goto, ele permite querotule um loop com um nome e assim aplique operaçõescomo break e continue sobre um loop específico, isto é,que não seja o mais interno

Por exemplo, dependendo uma certa condição de umbloco mais interno, você quer quebrar ou continuar a partirdo bloco mais externo

Ricardo Terra ([email protected]) POO 8 de julho de 2011 150 / 526

Page 151: JAVA - Apostila.pdf

Java – Comandos de repetição

Exemplo

externo :2 f o r ( i n t i = 0 ; i < 3 ; i ++ ) {

f o r ( i n t j = 0 ; j < 3 ; j ++ ) {4 i f ( i == 1 && j == 1 ) {

break externo ;6 }

System . out . p r i n t f ( "%d %d\n " , i , j ) ;8 }

}

Pergunta-se

Qual a saída?

E se fosse simplesmente break?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 151 / 526

Page 152: JAVA - Apostila.pdf

Java – Comandos de repetição

Comandos de repetição – foreach

Existe uma sintaxe para o comando for específica paraiteração de arranjos, coleções etc

Esse for é conhecido como foreach e é abordado logoque falarmos sobre arranjos

Ricardo Terra ([email protected]) POO 8 de julho de 2011 152 / 526

Page 153: JAVA - Apostila.pdf

Java

Arranjos

Ricardo Terra ([email protected]) POO 8 de julho de 2011 153 / 526

Page 154: JAVA - Apostila.pdf

Java – Arranjos

Arranjos - ConceitoArranjos – também conhecidos como vetor, array etc – sãocoleções de um mesmo tipo em sequência

Arranjos podem ser de tipos primitivos (char, int, float,double), de objetos, de um outro arranjo, de enumeração...

Pode se ter um arranjo de inteiros ou um arranjo decaracteres ou um arranjo de arranjo de pontos flutuantes

Contudo, não se pode ter um arranjo que contenha inteirose pontos flutuantes

Ricardo Terra ([email protected]) POO 8 de julho de 2011 154 / 526

Page 155: JAVA - Apostila.pdf

Java – Arranjos

Arranjos - Declaração

Declaração:i n t notas [ ] ; /∗ Arranjo de i n t e i r o s ∗/char l e t r a s [ ] ; /∗ Arranjo de caracteres ∗/S t r i ng nomes [ ] ; /∗ Arranjo de s t r i n g s ∗/

A ordem dos colchetes não importa, só não pode ser antesdo tipo:

S t r i ng nomes [ ] ;S t r i ng [ ]nomes;S t r i ng [ ] nomes;[ ] S t r i ng nomes; /∗ ERRADO ∗/

Observe que isso é só a declaração, isto é, não é alocadoespaço algum para os elementos do arranjo

Ricardo Terra ([email protected]) POO 8 de julho de 2011 155 / 526

Page 156: JAVA - Apostila.pdf

Java – Arranjos

Arranjos - Instanciação

Instanciação utilizando o operador new:i n t notas [ ] = new i n t [ 5 ] ; /∗ Alocado 5 i n t e i r o s ∗/char l e t r a s [ ] = new char [ 1 0 ] ; /∗ Alocado 10 caracteres ∗/S t r i ng nomes[ ] = new St r ing [ 100 ] ; /∗ Alocado 100 s t r i n g s ∗/

Ao contrário de linguagens como C, os elementos doarranjo SÃO inicializados automaticamente como a seguir:

Inteiros Flutuantes Boolean ObjetosInicializadoscom:

0 0.0 false null

Ricardo Terra ([email protected]) POO 8 de julho de 2011 156 / 526

Page 157: JAVA - Apostila.pdf

Java – Arranjos

Arranjos - Instanciação

Pode-se inicializar um arranjo já inserindo valores:i n t notas [ ] = { 1 , 2 , 3 , 4 , 5 } ;char l e t r a s [ ] = { ’A’ , ’B ’ , ’C’ } ;S t r i ng nomes[ ] = { " Ricardo " , " V i r g í l i o " , " Ralph " } ;

A notação acima é mais simples, contudo pode ser maisformal:

i n t notas [ ] = new i n t [ ] { 1 , 2 , 3 , 4 , 5 } ;char l e t r a s [ ] = new char [ ] { ’A’ , ’B ’ , ’C’ } ;S t r i ng nomes[ ] = new St r ing [ ] { " Ricardo " , " V i r g í l i o " , " Ralph " } ;

Ricardo Terra ([email protected]) POO 8 de julho de 2011 157 / 526

Page 158: JAVA - Apostila.pdf

Java – Arranjos

Arranjos - Declaração

Um arranjo de tamanho n, tem suas posições indexadas de0 a n-1. Exemplo:

i n t notas [ ] = {8 ,7 ,8 ,9 ,3 } ;notas [ 3 ] = 7 ;System . out . p r i n t f ( "%d" , notas [ 4 ] ) ;

Para obter o tamanho de um arranjo, basta utilizar oatributo lenght. Exemplo:

i n t tam = notas . length ;

Caso se indexe uma posição não válida, uma exceção emtempo de execução (ArrayIndexOutOfBoundsException)é ativada e possivelmente o aplicativo será abruptamenteencerrado

Veremos exceções mais a frente

Ricardo Terra ([email protected]) POO 8 de julho de 2011 158 / 526

Page 159: JAVA - Apostila.pdf

Java – Arranjos

Declarando, inicializando e iterando um arranjo de inteiros

1 i n t notas [ ] = new i n t [ 5 ] ;

3 f o r ( i n t i = 0 ; i < notas . length ; i ++ ) {notas [ i ] = Teclado . le r In teger ( " D ig i te notas [ " + i + " ] " ) ;

5 }

7 f o r ( i n t i = 0 ; i < notas . length ; i ++ ) {System . out . p r i n t f ( " notas[%d] = %d\n " , i , notas [ i ] ) ;

9 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 159 / 526

Page 160: JAVA - Apostila.pdf

Java – Arranjos

Declarando, inicializando e iterando um arranjo de strings

S t r i ng nomes [ ] = new St r ing [ 5 ] ;2

f o r ( i n t i = 0 ; i < nomes . length ; i ++ ) {4 nomes[ i ] = Teclado . l e r S t r i n g ( " Dig i te nomes[ " + i + " ] " ) ;

}6

f o r ( i n t i = 0 ; i < nomes . length ; i ++ ) {8 System . out . p r i n t f ( "nomes[%d] = %s\n " , i , nomes[ i ] ) ;

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 160 / 526

Page 161: JAVA - Apostila.pdf

Java – Arranjos

Arranjos - Acesso aos elementosArranjos permite recuperar ou alterar qualquer um de seuselementos

Os arranjos em Java sempre iniciam-se na posição 0

Isto indica que ele termina em uma posição inferior aotamanho (n-1)

Ricardo Terra ([email protected]) POO 8 de julho de 2011 161 / 526

Page 162: JAVA - Apostila.pdf

Java – Arranjos

Exemplo

char l e t r a s [ ] = new char [ 1 0 ] ;2

l e t r a s [ 0 ] = ’A’ ; /∗ A t r i b u i a 1a posicao do arranjo ∗/4 System . out . p r i n t f ( "%c" , l e t r a s [ 0 ] ) ; /∗ Imprime a 1a posicao ∗/

6 l e t r a s [ 1 ] = ’B ’ ;l e t r a s [ 2 ] = ’C’ ;

8 /∗ . . . ∗/l e t r a s [ 9 ] = ’H’ ;

10 l e t r a s [10] = ’ I ’ ; /∗ ERRO ∗/

O erro acima ativa uma exceção do tipoArrayIndexOutOfBoundsException. Isso pode alterar ofuncionamento normal do programa ou até mesmo“derrubá-lo”

Ricardo Terra ([email protected]) POO 8 de julho de 2011 162 / 526

Page 163: JAVA - Apostila.pdf

Java – Arranjos

Arranjos MultidimensionaisPode-se criar um arranjo de arranjos

O mais comum é o bidimensional que vemos como umamatriz

A declaração é somente acrescentar o número de colunas

Por exemplo: int matriz[][] = new int[4][3]declara-se uma matriz de 4 linhas e 3 colunas

int matriz[][] = {{1,0,0}, {0,1,2}, {2,3,4}, {0,6,7}};

Representação :

1 0 00 1 22 3 40 6 7

Ricardo Terra ([email protected]) POO 8 de julho de 2011 163 / 526

Page 164: JAVA - Apostila.pdf

Java – Arranjos

Arranjo Bidimensional - ExemploCriando uma matriz 3x2, zerando e setando valores

1 i n t matr iz [ ] [ ] = new i n t [ 3 ] [ 2 ] ; /∗ Declara uma matr iz 3x2 ∗/

3 f o r ( i n t i = 0 ; i < matriz . length ; i ++ ) {f o r ( i n t j = 0 ; j < matriz [ i ] . length ; j ++ ) {

5 matriz [ i ] [ j ] = 0 ;}

7 }

9 matriz [ 0 ] [ 0 ] = 1 ; /∗ A t r i b u i o valor 1 ao canto super ior esquerdo ∗/matriz [ 2 ] [ 1 ] = 7 ; /∗ A t r i b u i o valor 7 ao canto i n f e r i o r d i r e i t o ∗/

matriz1 00 00 7

Ricardo Terra ([email protected]) POO 8 de julho de 2011 164 / 526

Page 165: JAVA - Apostila.pdf

Java – Arranjos

Arranjo Bidimensional – CuriosidadePode-se criar uma matriz com cada linha de um tamanho

1 i n t matr iz [ ] [ ] = new i n t [ 3 ] [ ] ; /∗ Cria uma matr iz com 3 l inhas ∗/matriz [0]= new i n t [ 4 ] ; /∗ A t r i b u i 4 colunas a l inha 0 ∗/

3 matriz [1]= new i n t [ 1 ] ; /∗ A t r i b u i 1 colunas a l inha 1 ∗/matriz [2]= new i n t [ 2 ] ; /∗ A t r i b u i 2 colunas a l inha 2 ∗/

matriz0 0 0 000 0

Ricardo Terra ([email protected]) POO 8 de julho de 2011 165 / 526

Page 166: JAVA - Apostila.pdf

Java – Arranjos

Exemplo CompletoLeitura de cada elemento de uma matriz 2x3 e posteriorimpressão

1 i n t matr iz [ ] [ ] = new i n t [ 2 ] [ 3 ] ;

3 f o r ( i n t i = 0 ; i < matriz . length ; i ++ ) {f o r ( i n t j = 0 ; j < matriz [ i ] . length ; j ++ ) {

5 matriz [ i ] [ j ] = Teclado . le r In teger (" D ig i te matr iz [ " + i + " ] " + " [ " + j + " ] " ) ;

7 }}

9

f o r ( i n t i = 0 ; i < matriz . length ; i ++ ) {11 f o r ( i n t j = 0 ; j < matriz [ i ] . length ; j ++ ) {

System . out . p r i n t f ( "%d\t " , matriz [ i ] [ j ] ) ;13 }

System . out . p r i n t l n ( ) ;15 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 166 / 526

Page 167: JAVA - Apostila.pdf

Java – Arranjos

Comandos de repetição – foreach

Para iterar um arranjo ou uma coleção, geralmentefazemos um for bem conhecido:

S t r i ng nomes [ ] = { " Ricardo " , " V i r g i l i o " , " Ralph " } ;

f o r ( i n t i = 0 ; i < nomes . length ; i ++ ) {S t r i ng nomeAtual = nomes[ i ] ;System . out . p r i n t l n ( nomeAtual ) ;

}

Como esse era um for bem comum, Java provê o foreachque é um for com sintaxe simplificada:

S t r i ng nomes [ ] = { " Ricardo " , " V i r g i l i o " , " Ralph " } ;

f o r ( S t r i ng nomeAtual : nomes ) {System . out . p r i n t l n ( nomeAtual ) ;

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 167 / 526

Page 168: JAVA - Apostila.pdf

Java

Métodos

Ricardo Terra ([email protected]) POO 8 de julho de 2011 168 / 526

Page 169: JAVA - Apostila.pdf

Java – Métodos

Até agora, estamos trabalhando com a linguagem Javacomo se fosse uma linguagem estruturada, isto é, sem aorientação a objetos

Criamos uma classe com o método main e fazemos tudodentro desse método

No entanto, mesmo sem termos aprofundado nos conceitosde POO, seria interessante para a familiarização com alinguagem que o método main chamasse outros métodos afim de deixar o código fonte mais claro e organizado

Convém salientar que essa é só uma visão aplicada demétodos quando se trabalha com Java como umalinguagem estruturada

Quando abordarmos os conceitos de POO, vamosaprofundar bem mais

Ricardo Terra ([email protected]) POO 8 de julho de 2011 169 / 526

Page 170: JAVA - Apostila.pdf

Java – Métodos

MétodoSintaxe:

[ v i s i b ] [mod] retorno nome ( < param { , param} > ) { corpo }

visib = visibilidade (private, protected ou public)mod = modificadores (static, final, · · · )

Exemplos

private s t a t i c void imprimir ( ) { . . . }

protected i n t dobro ( i n t x ) { . . . }

public double somar (double a, double b) { . . . }

private void l i s t a r ( i n t notas [ ] ) { . . . }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 170 / 526

Page 171: JAVA - Apostila.pdf

Java – Métodos

Diretrizes (por enquanto)Modificador static

Como o método main é um método estático, todos osmétodos que iremos criar, por enquanto, serão estáticos

Lembrem-se que um membro (atributo ou método) estáticosó acessa membros estáticos

Visibilidade private

O método main é público, justamente porque a JVM deveter permissão para acessá-lo e iniciar a aplicação

Por enquanto, os métodos que vocês criarem somente serãovisíveis pela própria classe

Ricardo Terra ([email protected]) POO 8 de julho de 2011 171 / 526

Page 172: JAVA - Apostila.pdf

Java – Métodos

Exemplo

1 public class Bhaskara {

3 public s t a t i c void main( S t r i ng [ ] args ) {. . .

5 double d = Math .pow( b, 2 ) − 4 ∗ a ∗ c;. . .

7 }}

Pergunta-se

Porque o cálculo de delta não pode ser um método separadopara deixar o código mais legível?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 172 / 526

Page 173: JAVA - Apostila.pdf

Java – Métodos

Exemplo

public class Bhaskara {2

public s t a t i c void main( S t r i ng [ ] args ) {4 . . .

double d = delta ( a, b, c ) ;6 . . .

}8

private s t a t i c double delta ( double a, double b, double c ) {10 re turn Math .pow( b, 2 ) − 4 ∗ a ∗ c;

}12 }

ResumoAgora, delta é um método privado e estático que pode serinvocada por qualquer método da classe Bhaskara

Ricardo Terra ([email protected]) POO 8 de julho de 2011 173 / 526

Page 174: JAVA - Apostila.pdf

Java – Métodos

Um programa Java é uma coleção de classesClasses podem conter diversos métodos

A ordem de declaração não importa (ao contrário dalinguagem C)

Pelo menos uma classe deve possuir o método estáticomain

É a partir dele que a aplicação se inicia

Um método pode:receber parâmetrosdeclarar variáveis locaisconter instruções executáveisretornar um valorativar exceção

Ricardo Terra ([email protected]) POO 8 de julho de 2011 174 / 526

Page 175: JAVA - Apostila.pdf

Java – Métodos

Exemplo

public class Soma {2

public s t a t i c void main( S t r i ng args [ ] ) {4 i n t a = 2 , b = 3 , to ta l ;

to ta l = soma( a, b ) ;6 System . out . p r i n t f ( "Soma: %d" , to ta l ) ;

8 }

10 private s t a t i c i n t soma( i n t x , i n t y ) {re turn x + y ;

12 }

14 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 175 / 526

Page 176: JAVA - Apostila.pdf

Java – Métodos

Retorno de métodosUm método pode retornar valores de qualquer tipo, excetooutros métodos

Um método que retorna nada, deve ter seu retornodeclarado como void

A expressão que segue o return é o valor retornadonão se deve colocar parêntesesreturn x+y; e não return (x+y);

O valor de retorno pode ser ignorado

Término de métodosAo encontrar a chave de fechamentoAo ser retornado (return)Ao ativar uma exceção

Ricardo Terra ([email protected]) POO 8 de julho de 2011 176 / 526

Page 177: JAVA - Apostila.pdf

Java – Métodos

Exemplo

public class ImprimeNome {2

public s t a t i c void main( S t r i ng args [ ] ) {4 S t r i ng nome = " Ricardo " ;

imprimeRetornandoTamanho ( nome ) ;6 }

8 private s t a t i c i n t imprimeRetornandoTamanho ( S t r i ng nome ) {System . out . p r i n t l n ( nome ) ;

10 return nome. length ( ) ;}

12

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 177 / 526

Page 178: JAVA - Apostila.pdf

Java – Métodos

Exercíciosfatorial

escreveMaiorRecebe n e imprime: n > n-1 > n-2 > · · · > 1 > 0

retornaMenorElemento

retornaMaiorElemento

retornaMediaFazer com for e com foreach

Ricardo Terra ([email protected]) POO 8 de julho de 2011 178 / 526

Page 179: JAVA - Apostila.pdf

Java – Métodos

Solução fatorial

1 public class F a t o r i a l {

3 public s t a t i c void main( S t r i ng args [ ] ) {i n t n = Teclado . le r In teger ( " D ig i te n " ) ;

5 System . out . p r i n t f ( "%d! = %d" , n , fa t ( n ) ) ;}

7

private s t a t i c long fa t ( i n t n ) {9 long res = 1 ;

i f ( n == 0 || n == 1 ) {11 return 1;

}13 f o r ( i n t i = 2 ; i <= n ; i ++ ) {

res ∗= i ;15 }

re turn res ;17 }

19 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 179 / 526

Page 180: JAVA - Apostila.pdf

Java – Métodos

Solução escreveMaior

public class EscreveMaior {2

public s t a t i c void main( S t r i ng args [ ] ) {4 i n t n = Teclado . le r In teger ( " D ig i te n " ) ;

escreveMaior ( n ) ;6 }

8 private s t a t i c void escreveMaior ( i n t n ) {f o r ( i n t i = n ; i >= 0 ; i−− ) {

10 System . out . p r i n t f ( "%d " , i ) ;System . out . p r i n t f ( ( i > 0) ? " > " : " \n " ) ;

12 }}

14

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 180 / 526

Page 181: JAVA - Apostila.pdf

Java – Métodos

Solução retornaMenor

public class MenorElemento {2

public s t a t i c void main( S t r i ng args [ ] ) {4 i n t v [ ] = { 2 , 4 , 5 , 1 , 3 } ;

System . out . p r i n t f ( "Menor e l . : %d" , retornaMenor ( v ) ) ;6 }

8 private s t a t i c i n t retornaMenor ( i n t v [ ] ) {i n t menor = v [ 0 ] ;

10 i n t tam = v . length ;f o r ( i n t i = 1 ; i < tam; i ++ ) {

12 i f ( v [ i ] < menor ) {menor = v [ i ] ;

14 }}

16 re turn menor ;}

18

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 181 / 526

Page 182: JAVA - Apostila.pdf

Conteúdo

1 Introdução

2 UML

3 Java

4 POOConceitos IniciaisClasse java.lang.Object

HerançaModificadoresInterfaceHerança Múltipla?Classe Abstrata x InterfaceExceção

5 Padrões de Projeto

6 Tópicos Relevantes

7 Materiais Complementares

8 ExtrasRicardo Terra ([email protected]) POO 8 de julho de 2011 182 / 526

Page 183: JAVA - Apostila.pdf

POO

Conceitos Iniciais

Ricardo Terra ([email protected]) POO 8 de julho de 2011 183 / 526

Page 184: JAVA - Apostila.pdf

POO – Conceitos Iniciais

ClasseComo já foi abordado, “uma classe encapsulacaracterísticas comuns a grupos de objetos.” (MikeO’Docherty, 2005)

Pode ser pensada como uma “receita de bolo”Ela diz que tem tamanho, sabor e recheio. O que realmenteé pequeno, de chocolate e recheado de morango é umobjeto da classe (ou instância da classe)

Em OO, uma classe é a menor unidade modular, isto é, tudodeve estar inserido em uma classe

Uma classe possui:Atributos (propriedades)

Construtores (um tipo especial de método para criação de objetos)

Métodos (comportamentos)

Ricardo Terra ([email protected]) POO 8 de julho de 2011 184 / 526

Page 185: JAVA - Apostila.pdf

POO – Conceitos Iniciais

Declaração de uma Classe

public class Conta {. . .

}

Padrão BluePrintsClasses sempre devem iniciar com a 1a letra em caixa alta.Por exemplo:

Conta, Bhaskara ...

Demais palavras em caixa baixa salvo início de novaspalavras. Por exemplo:

GuardaChuva, ContaCorrente ...

Sempre evitem (não usem) caracteres especiais aoprogramar:

_, -, ç, ã, á, ê, é ...

Ricardo Terra ([email protected]) POO 8 de julho de 2011 185 / 526

Page 186: JAVA - Apostila.pdf

POO – Conceitos Iniciais

AtributoSintaxe:

[ v i s i b ] [mod] t ipo nome { = valor− i n i c i a l }

visib = visibilidade (private, protected ou public)mod = modificadores (static, final, ...)

Exemplos

public S t r i ng nome;

private double sa lar io = 1000.00;

protected i n t nota ;

double cor ;

Ricardo Terra ([email protected]) POO 8 de julho de 2011 186 / 526

Page 187: JAVA - Apostila.pdf

POO – Conceitos Iniciais

Modificadoresfinal

Torna o atributo imutável

staticTorna o atributo estático, isto é, pertence à classe

Exemplos

/∗ O cpf nunca será alterado ∗/private f i n a l long cpf ;

/∗Taxa de rendimento compartilhada entre todosos objetos do t ipo ContaPoupanca

∗/private s t a t i c double taxaRendimento ;

Ricardo Terra ([email protected]) POO 8 de julho de 2011 187 / 526

Page 188: JAVA - Apostila.pdf

POO – Conceitos Iniciais

Declaração de atributos na classe Conta

public class Conta {2 private s t a t i c i n t autoIncremento = 1;

private f i n a l i n t numero ;4 private double saldo ;

private Corrent i s ta cor rent i s ta ;6 . . .

}

Padrão BluePrintsAtributos sempre devem iniciar com a 1a letra em caixabaixa. Por exemplo:

saldo, nome ...

Demais letras em caixa baixa salvo início de novas palavras.Por exemplo:

nomeCompleto, registroGeral ...

Ricardo Terra ([email protected]) POO 8 de julho de 2011 188 / 526

Page 189: JAVA - Apostila.pdf

POO – Conceitos Iniciais

MétodoSintaxe:

[ v i s i b ] [mod] retorno nome ( < param { , param} > ) { corpo }

visib = visibilidade (private, protected ou public)mod = modificadores (static, final, · · · )

Exemplos

private s t a t i c void imprimir ( ) { . . . }

public double somar (double a, double b) { . . . }

private void l i s t a r ( i n t notas [ ] ) { . . . }

Padrão BluePrintsMesma regra de atributos

Ricardo Terra ([email protected]) POO 8 de julho de 2011 189 / 526

Page 190: JAVA - Apostila.pdf

POO – Conceitos Iniciais

Declaração de métodos na classe Conta

1 public class Conta {. . .

3 public i n t getNumero ( ) {return t h i s . numero ;

5 }

7 public Corrent i s ta getCorrent is ta ( ) {re turn t h i s . cor rent i s ta ;

9 }

11 public void setCor rent i s ta ( Corrent i s ta cor rent i s ta ) {t h i s . cor rent i s ta = cor rent i s ta ;

13 }

15 public double getSaldo ( ) {return t h i s . saldo ;

17 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 190 / 526

Page 191: JAVA - Apostila.pdf

POO – Conceitos Iniciais

Declaração de métodos na classe Conta

1 public boolean r e t i r a r ( double valor ) {i f ( valor <= t h i s . saldo ) {

3 t h i s . saldo −= valor ;re turn true ;

5 }return fa lse ;

7 }

9 public void depositar ( double valor ) {t h i s . saldo += valor ;

11 }

13 public boolean t r a n s f e r i r ( Conta contaDestino , double valor ) {i f ( t h i s . r e t i r a r ( valor ) ) {

15 contaDestino . depositar ( valor ) ;re turn true ;

17 }return fa lse ;

19 }}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 191 / 526

Page 192: JAVA - Apostila.pdf

POO – Conceitos Iniciais

Declaração de métodos na classe Conta

public class Conta {2 . . .

public i n t getNumero ( ) {4 return t h i s . numero ;

}6

public Corrent i s ta getCorrent is ta ( ) {8 return t h i s . cor rent i s ta ;

}10

public void setCor rent i s ta ( Corrent i s ta cor rent i s ta ) {12 t h i s . cor rent i s ta = cor rent i s ta ;

}14

public double getSaldo ( ) {16 return t h i s . saldo ;

}18

public boolean r e t i r a r ( double valor ) {20 i f ( valor <= t h i s . saldo ) {

t h i s . saldo −= valor ;22 return true ;

}24 return fa lse ;

}26

public void depositar ( double valor ) {28 t h i s . saldo += valor ;

}30

public boolean t r a n s f e r i r ( Conta contaDestino , double valor ) {32 i f ( t h i s . r e t i r a r ( valor ) ) {

contaDestino . depositar ( valor ) ;34 return true ;

}36 return fa lse ;

}38 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 192 / 526

Page 193: JAVA - Apostila.pdf

POO – Conceitos Iniciais

ConstrutorTipo especial de método responsável pela criação deobjetos

Por exemplo, como eu crio uma conta? Como eu crio umcorrentista?

Se você não cria um construtor, Java cria um vazio paravocê. Esse construtor somente permite que você crieobjetos daquela classe utilizando o operador new

Contudo, se você cria um construtor, Java não mais cria umvazio para você

Ricardo Terra ([email protected]) POO 8 de julho de 2011 193 / 526

Page 194: JAVA - Apostila.pdf

POO – Conceitos Iniciais

ConstrutorSintaxe:

[ v i s i b ] nome−da−classe ( < param { , param} > ) { corpo }

DiretrizesSOMENTE é chamado na criação de um novo objeto

SEMPRE possui o mesmo nome da classe

NÃO possui tipo de retorno

GERALMENTE é público

Observação

Atributos final devem SEMPRE ser inicializado em umconstrutor

Ricardo Terra ([email protected]) POO 8 de julho de 2011 194 / 526

Page 195: JAVA - Apostila.pdf

POO – Conceitos Iniciais

Declaração de construtores na classe Conta

1 public class Conta {. . .

3 public Conta ( Corrent i s ta cor rent i s ta ) {t h i s ( cor rent i s ta , 0.0 ) ;

5 }

7 public Conta ( Corrent i s ta corrent i s ta , double saldo ) {t h i s . cor rent i s ta = cor rent i s ta ;

9 t h i s . numero = autoIncremento++;t h i s . saldo = saldo ;

11 }. . .

13 }

Observação

A instrução this( correntista, 0.0 ) invoca o outroconstrutor passando o correntista e 0.0

Ricardo Terra ([email protected]) POO 8 de julho de 2011 195 / 526

Page 196: JAVA - Apostila.pdf

POO – Conceitos Iniciais

Declaração de construtores na classe Correntista

public class Corrent is ta {2 private f i n a l long cpf ;

private S t r i ng nome;4

public Corrent is ta ( long cpf , S t r i ng nome) {6 t h i s . cpf = cpf ;

t h i s .nome = nome;8 }

10 public long getCpf ( ) {return t h i s . cpf ;

12 }

14 public S t r i ng getNome( ) {return t h i s .nome;

16 }

18 public void setNome( S t r i ng nome ) {t h i s .nome = nome;

20 }}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 196 / 526

Page 197: JAVA - Apostila.pdf

POO – Conceitos Iniciais

Criando objetosUm objeto é a concretização de uma classe

Em outras palavras, é a instanciação de uma classe

O operador new permite que objetos sejam criados a partirde uma classe. Por exemplo:

S t r i ng s = new St r ing ( " Java é doido demais ! " ) ;Date data = new Date ( ) ;Animal girafa = new Girafa ( "Melman" , new Mania( "Doença" ) ) ;

O operador new aloca memória no heap da JVM e cria aestrutura básica de um objeto da classe

Bem mais fácil que em C

Ricardo Terra ([email protected]) POO 8 de julho de 2011 197 / 526

Page 198: JAVA - Apostila.pdf

POO – Conceitos Iniciais

Pergunta-se

Suponha uma classe hipotética X em que não foi definidonenhum construtor

Como criar um objeto dessa classe?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 198 / 526

Page 199: JAVA - Apostila.pdf

POO – Conceitos Iniciais

Pergunta-se

Suponha uma classe hipotética X em que não foi definidonenhum construtor

Como criar um objeto dessa classe?

Responde-senew X()

Pois, como não foi criado nenhum construtor, Java cria umvazio automaticamente

Ricardo Terra ([email protected]) POO 8 de julho de 2011 198 / 526

Page 200: JAVA - Apostila.pdf

POO – Conceitos Iniciais

Como criar um objeto da classe Correntista?A classe Correntista só tem um construtor, logo o únicomodo é:

new Corrent is ta ( 123 , " Ricardo Terra " ) /∗ valores hipotét icos ∗/

Ricardo Terra ([email protected]) POO 8 de julho de 2011 199 / 526

Page 201: JAVA - Apostila.pdf

POO – Conceitos Iniciais

Como criar um objeto da classe Conta?Inicialmente, qualquer construtor da classe Conta requerum objeto da classe Correntista. Logo:

Corrent is ta c = new Corrent is ta ( 123 , " Ricardo Terra " )

Assim:new Conta ( c )

new Conta ( c , 1000.00 ) ;

Caso não tenha um objeto da classe Correntista, vocêpode ser um pouco “ousado”:

new Conta ( new Corrent is ta ( 456 , " Maria " ) )

new Conta ( new Corrent is ta ( 456 , " Maria " ) , 1000.00 )

Ricardo Terra ([email protected]) POO 8 de julho de 2011 200 / 526

Page 202: JAVA - Apostila.pdf

POO – Conceitos Iniciais

Métodos AcessoresNa maioria das vezes, opta-se por criar atributos privados epara modificá-los criam-se métodos acessores (getters esetters)

Isto faz com que não se tenha acesso direto aos atributos,mas conseguindo obtê-los e modificá-los

Esses métodos acessores seguem o seguinte padrão:

Método setter se chama setNomeAtributo. Além disso,retorna void e possui um único parâmetro formal do mesmotipo do atributo

Método getter se chama getNomeAtributo. Além disso,retorna o mesmo tipo do atributo e não possui parâmetroformal

Ricardo Terra ([email protected]) POO 8 de julho de 2011 201 / 526

Page 203: JAVA - Apostila.pdf

POO – Conceitos Iniciais

Exemplo – Métodos Acessores em Correntista

1 public class Corrent i s ta {private f i n a l long cpf ;

3 private S t r i ng nome;

5 public Corrent i s ta ( long cpf , S t r i ng nome) {t h i s . cpf = cpf ;

7 t h i s .nome = nome;}

9

public long getCpf ( ) {11 return t h i s . cpf ;

}13

public S t r i ng getNome( ) {15 return t h i s .nome;

}17

public void setNome( S t r i ng nome ) {19 t h i s .nome = nome;

}21 }

Pergunta-se

Onde está o setCpf?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 202 / 526

Page 204: JAVA - Apostila.pdf

POO – Conceitos Iniciais

Referência this

this é uma referência ao objeto correnteÉ um boa prática, logo deve SEMPRE ser utilizado

Além de boa prática, resolve problema de escopos:1 public class ExemploThis {

private i n t x = 2;3

public void m( ) {5 i n t x = 4;

System . out . p r i n t f ( "%d" , x ) ;7 System . out . p r i n t f ( "%d" , t h i s . x ) ;

}9 }

Qual a saída?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 203 / 526

Page 205: JAVA - Apostila.pdf

POO – Conceitos Iniciais

Exemplo Completo

1 public s t a t i c void main( S t r i ng [ ] args ) {Corrent is ta eu = new Corrent is ta ( 123 , " Ricardo " ) ;

3 Conta minhaConta = new Conta ( eu , 2000 ) ;

5 Conta contaDela = new Conta ( new Corrent is ta ( 456 , " Maria " ) ) ;

7 System . out . p r i n t f ( "%d %s %.2 f \n " , minhaConta . getNumero ( ) ,minhaConta . getCorrentista ( ) . getNome( ) , minhaConta . getSaldo ( ) ) ;

9 System . out . p r i n t f ( "%d %s %.2 f \n " , contaDela . getNumero ( ) ,contaDela . getCorrentista ( ) . getNome( ) , contaDela . getSaldo ( ) ) ;

11

contaDela . depositar ( 500.00 ) ;13

i f ( ! contaDela . r e t i r a r ( 600 ) ) {15 contaDela . r e t i r a r ( contaDela . getSaldo ( ) ) ;

}17

minhaConta . t r a n s f e r i r ( contaDela , 0 .5 ∗ minhaConta . getSaldo ( ) ) ;19

System . out . p r i n t f ( "%d %s %.2 f \n " , minhaConta . getNumero ( ) ,21 minhaConta . getCorrentista ( ) . getNome( ) , minhaConta . getSaldo ( ) ) ;

System . out . p r i n t f ( "%d %s %.2 f \n " , contaDela . getNumero ( ) ,23 contaDela . getCorrentista ( ) . getNome( ) , contaDela . getSaldo ( ) ) ;

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 204 / 526

Page 206: JAVA - Apostila.pdf

POO – Conceitos Iniciais

Problemas Comuns (merecem atenção redobrada)

Um atributo final deve ser iniciado uma única vez e deveser feito em um construtor

Por isso, é importante utilizar this para chamar um outroconstrutor dentro de um construtor

Não se utiliza this para acessar um membro (atributo oumétodo) estático (static)

Por exemplo, o atributo estático autoIncremento ou éutilizado sem this ou Conta.autoIncremento

Um membro estático não pode utilizar thisComo ele não faz parte de nenhum objeto, um membroestático só pode utilizar membros estáticos

Ricardo Terra ([email protected]) POO 8 de julho de 2011 205 / 526

Page 207: JAVA - Apostila.pdf

POO – Conceitos Iniciais

Problemas Comuns (merecem atenção redobrada)

Suponha que a classe Pessoa não tenha construtor algumdefinido. Para criar um objeto do tipo Pessoa, basta:

new Pessoa ( )

No entanto, suponha que tenha criado um construtordizendo que pessoa deve ter um nome. Então, o únicomodo de criar pessoa agora é passando o nome:

new Pessoa ( " Ricardo Terra " )

new Pessoa ( ) /∗ não funciona mais ∗/

Lembre-se, Java só cria o construtor vazio se você não criarconstrutor algum

Ricardo Terra ([email protected]) POO 8 de julho de 2011 206 / 526

Page 208: JAVA - Apostila.pdf

POO – Conceitos Iniciais

Problemas Comuns (merecem atenção redobrada)

E se eu quiser que uma pessoa possa ser criada sem nadaou com o nome?

1 public class Pessoa {private S t r i ng nome;

3

public Pessoa ( ) {5 }

7 public Pessoa ( S t r i ng nome) {t h i s .nome = nome;

9 }

11 public S t r i ng getNome( ) {re turn nome;

13 }

15 public void setNome( S t r i ng nome ) {t h i s .nome = nome;

17 }}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 207 / 526

Page 209: JAVA - Apostila.pdf

POO – Conceitos Iniciais

Dicas para evitar problemasNão crie método acessor setter para atributos final

Não funcionará, eles não mudam

É importante inicializar todos os atributos no construtorPode gerar problemas como valores indesejados ouexceções (futuro)

Siga a ordem de declaração na classePrimeiro atributos, depois construtores e depois métodos

Siga o padrão de nomenclatura

Faça comentários a todo momento

Ricardo Terra ([email protected]) POO 8 de julho de 2011 208 / 526

Page 210: JAVA - Apostila.pdf

POO – Conceitos Iniciais

Exercício de Fixação 01

Pratique os conceitos de OO aprendidos no BlueJimplementando o seguinte modelo UML:

Ricardo Terra ([email protected]) POO 8 de julho de 2011 209 / 526

Page 211: JAVA - Apostila.pdf

POO – Conceitos Iniciais

Exercício de Fixação 02

Pratique os conceitos de OO aprendidos no BlueJimplementando o seguinte modelo UML:

Ricardo Terra ([email protected]) POO 8 de julho de 2011 210 / 526

Page 212: JAVA - Apostila.pdf

POO – Conceitos Iniciais

ResumoClasse e Objeto

Declaração de atributos, métodos e construtores

Associação de classes

Modificadores de visibilidade

Modificador static

Modificador final (em atributos)

Reúso

Referência this

Encapsulamento (métodos acessores)

Instanciação (operador new)

Ricardo Terra ([email protected]) POO 8 de julho de 2011 211 / 526

Page 213: JAVA - Apostila.pdf

POO

Classe java.lang.Object

Ricardo Terra ([email protected]) POO 8 de julho de 2011 212 / 526

Page 214: JAVA - Apostila.pdf

POO – Classe java.lang.Object

Em Java, todas as classes são subclasses dejava.lang.Object

Logo, as seguintes declarações da classe A sãoequivalentes:

public class A { . . . }

public class A extends Object { . . . }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 213 / 526

Page 215: JAVA - Apostila.pdf

POO – Classe java.lang.Object

Capacidade PolimórficaIsto proporciona a capacidade polimórfica de qualquerclasse Java, uma vez que qualquer objeto pode ser tratadocomo Object

Na verdade, a capacidade polimórfica se dá pela herança

Exemplo

1 Object v [ ] = new Object [ ] { " S t r i n g " , 2 , new A( ) , new Date ( ) } ;

3 f o r ( Object o : v ) {System . out . p r i n t l n ( o ) ;

5 }

Pergunta-se

2 é objeto?Qual será a saída do programa?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 214 / 526

Page 216: JAVA - Apostila.pdf

POO – Classe java.lang.Object

Herança

Toda classe Java já possui implementados diversos métodosherdados da classe Object

Os seguintes métodos são os mais relevantes:

equals

hashCode

toString

finalize

Ricardo Terra ([email protected]) POO 8 de julho de 2011 215 / 526

Page 217: JAVA - Apostila.pdf

POO – Classe java.lang.Object

Método toString

Assinatura:public S t r i ng toS t r i ng ( )

Ao imprimir um objeto, é impresso o string retornado poresse método

Pessoa p = new Pessoa ( " Ricardo " , 21) ;System . out . p r i n t l n ( p ) ;

Se esse método não for sobrescrito, ele imprime o nomequalificado1 da classe, @ e hashcode

Por exemplo: com.terra.pojo.Pessoa@19821f

No entanto, se sobrescrito, pode retornar o que desejarPor exemplo: Ricardo tem 21 anos

1pacote + nome da classe

Ricardo Terra ([email protected]) POO 8 de julho de 2011 216 / 526

Page 218: JAVA - Apostila.pdf

POO – Classe java.lang.Object

Método equals

Assinatura:public boolean equals ( Object o)

Basicamente, compara a igualdade de dois objetosPessoa p1 = new Pessoa ( " Ricardo " , 21) ;Pessoa p2 = new Pessoa ( " Ricardo " , 21) ;System . out . p r i n t l n ( p1 . equals ( p2 ) ) ;

Se esse método não for sobrescrito, ele verifica se ambosobjetos ocupam a mesma posição de memória. Logo, noexemplo, retornará false

No entanto, se sobrescrito para comparar os valores de seusatributos, no exemplo, possivelmente retornará true

Ricardo Terra ([email protected]) POO 8 de julho de 2011 217 / 526

Page 219: JAVA - Apostila.pdf

POO – Classe java.lang.Object

Método hashCode

Assinatura:public i n t hashCode ( )

Esse método retorna código hash. Um código hash podeser um número inteiro, positivo ou negativo. Objetos iguaistêm de retornar códigos hash idênticos

Indicações:Se o método equals é sobrescrito, o método hash tambémdeve ser

Uso:Tabela de Hash

Ricardo Terra ([email protected]) POO 8 de julho de 2011 218 / 526

Page 220: JAVA - Apostila.pdf

POO – Classe java.lang.Object

Coletor de Lixo (GC)Em Java, o gerenciamento de memória é realizadoautomaticamente por um processo chamado Coletor deLixo (Garbage Colletor – GC) que é executado dentro daJVM

Você pode forçar a ativação do GC com System.gc()

No entanto, Java poderá ignorar

Exemplo

S t r i ng s t r = " casa " ;s t r = " carta " ;System .gc( ) ; /∗ ta lvez ative ∗/. . .

Ricardo Terra ([email protected]) POO 8 de julho de 2011 219 / 526

Page 221: JAVA - Apostila.pdf

POO – Classe java.lang.Object

Método finalize

Assinatura:protected void f i n a l i z e ( ) throws Throwable

Esse método é executado no momento em que o coletorde lixo (GC) vai liberar a memória ocupada pelo objeto

A implementação padrão (em Object) é vazia. Logo, senão sobreposto, não faz nada

No entanto, se sobrescrito, pode fazer o que desejarPor exemplo: fechar uma conexão, dar o último suspiro, sesalvar etc

Ricardo Terra ([email protected]) POO 8 de julho de 2011 220 / 526

Page 222: JAVA - Apostila.pdf

POO – Classe java.lang.Object

Método finalize – Programa Assassino

Suponha a seguinte classe Deus:1 public class Deus {

private s t a t i c Collection < Imortal > protegidos3 = new HashSet< Imortal > ( ) ;

5 public s t a t i c void proteger ( Imortal i ) {protegidos .add( i ) ;

7 }}

Suponha a seguinte classe Imortal:1 public class Imortal {

@Override3 protected void f i n a l i z e ( ) throws Throwable {

Deus . proteger ( t h i s ) ;5 }

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 221 / 526

Page 223: JAVA - Apostila.pdf

POO – Classe java.lang.Object

Método finalize – Programa Assassino

public class ProgramaAssassino {2

public s t a t i c void main( S t r i ng [ ] args ) {4 while ( t rue ) {

new Imortal ( ) ;6 }

}8

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 222 / 526

Page 224: JAVA - Apostila.pdf

POO – Classe java.lang.Object

Exemplo Completo – Classe Pessoa

1 public class Pessoa {private S t r i ng nome;

3 private i n t idade ;

5 public Pessoa ( S t r i ng nome, i n t idade ) {t h i s .nome = nome;

7 t h i s . idade = idade ;}

9

public S t r i ng getNome( ) {11 return t h i s .nome;

}13

public void setNome( S t r i ng nome ) {15 t h i s .nome = nome;

}17

public i n t getIdade ( ) {19 return t h i s . idade ;

}21

public void setIdade ( i n t idade ) {23 t h i s . idade = idade ;

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 223 / 526

Page 225: JAVA - Apostila.pdf

POO – Classe java.lang.Object

Exemplo Completo – Classe Pessoa

1 @Overridepublic S t r i ng toS t r i ng ( ) {

3 return t h i s .nome + " tem " + t h i s . idade + " anos " ;}

5

@Override7 public void f i n a l i z e ( ) {

System . out . p r i n t l n ( " Bye : " + t h i s ) ;9 }

11 @Overridepublic i n t hashCode ( ) {

13 f i n a l i n t prime = 31;i n t r e s u l t = 1 ;

15 r e s u l t = prime ∗ r e s u l t + idade ;r e s u l t = prime ∗ r e s u l t + ( (nome == n u l l ) ? 0 : nome.hashCode ( ) ) ;

17 return r e s u l t ;}

19

@Override21 public boolean equals ( Object o ) {

i f ( o != n u l l && o instanceof Pessoa ) {23 Pessoa p = ( Pessoa ) o ;

return p.nome. equals ( t h i s .nome ) && p. idade == t h i s . idade ;25 }

return fa lse ;27 }

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 224 / 526

Page 226: JAVA - Apostila.pdf

POO – Classe java.lang.Object

Exemplo Completo

public s t a t i c void main( S t r i ng [ ] args ) {2 Pessoa p1 = new Pessoa ( " Ralph " , 28 ) ;

Pessoa p2 = new Pessoa ( " Ralph " , 28 ) ;4 Pessoa p3 = new Pessoa ( " Terra " , 21 ) ;

Pessoa p4 = new Pessoa ( " V i r g i l i o " , 40 ) ;6

System . out . p r i n t l n ( p3 ) ;8

p4 = n u l l ;10 System .gc ( ) ;

12 System . out . p r i n t f ( "%s \t %s " , p1 , p2 ) ;

14 i f ( p1 . equals ( p2 ) ) {System . out . p r i n t l n ( p1 + " eq " + p2 ) ;

16 } else {System . out . p r i n t l n ( p1 + " ne " + p2 ) ;

18 }}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 225 / 526

a.s. e d.s.?

a.s. e d.s.?

a.s. e d.s.?

a.s. e d.s.?

Page 227: JAVA - Apostila.pdf

POO – Classe java.lang.Object

ImportanteImprimir this é o mesmo que imprimir this.toString()

Nunca se esqueça:

comparação de tipos primitivos: ==

comparação de objetos: método equals()

Ricardo Terra ([email protected]) POO 8 de julho de 2011 226 / 526

Page 228: JAVA - Apostila.pdf

POO – Classe java.lang.Object

ResumoClasse java.lang.Object

equals

hashCode

toString

finalize

Coletor de Lixo

Sobreposição desses métodos

Ricardo Terra ([email protected]) POO 8 de julho de 2011 227 / 526

Page 229: JAVA - Apostila.pdf

POO

Herança

Ricardo Terra ([email protected]) POO 8 de julho de 2011 228 / 526

Page 230: JAVA - Apostila.pdf

POO – Herança

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

Ricardo Terra ([email protected]) POO 8 de julho de 2011 229 / 526

Page 231: JAVA - Apostila.pdf

POO – Herança

Modelo 1: Classe Empregado – Implementação

public class Empregado {2 private long cpf ;

private S t r i ng nome;4

public Empregado( long cpf , S t r i ng nome) {6 t h i s . cpf = cpf ;

t h i s .nome = nome;8 }

10 /∗ Metodos Acessores ∗/}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 230 / 526

Page 232: JAVA - Apostila.pdf

POO – Herança

Modelo 1: Classe Gerente – Implementação

public class Gerente {2 private long cpf ;

private S t r i ng nome;4 private Departamento departamento ;

6 public Gerente ( long cpf , S t r i ng nome, Departamento departamento ) {t h i s . cpf = cpf ;

8 t h i s .nome = nome;t h i s . departamento = departamento ;

10 }

12 /∗ Metodos Acessores ∗/}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 231 / 526

Page 233: JAVA - Apostila.pdf

POO – Herança

Modelo 1: Classe Departamento – Implementação

public class Departamento {2 private i n t codigo ;

private S t r i ng nome;4

public Departamento ( i n t codigo , S t r i ng nome) {6 t h i s . codigo = codigo ;

t h i s .nome = nome;8 }

10 /∗ Metodos Acessores ∗/}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 232 / 526

Page 234: JAVA - Apostila.pdf

POO – Herança

Refletindo...Um gerente tem tudo que empregado tem!

Logo, é possível?Empregado e = new Gerente (1 , " Ricardo " , new Departamento(1 , " T I " ) )

Não, mas porquê? Fraca Modelagem OOMesmo nós sabendo que um gerente é um empregado, nãohá nada dizendo isso na modelagem OO

Solução? Herança!

Ricardo Terra ([email protected]) POO 8 de julho de 2011 233 / 526

Page 235: JAVA - Apostila.pdf

POO – Herança

Solução...

Herança consiste em uma classe herdar todo os membros(atributos e métodos) de uma outra classe

Fazer uma modelagem OO adequada ao problema, isto é,onde um gerente é um empregado!

Para isso, no exemplo anterior, a classe Gerente deveriaestender a classe Empregado. Assim:

Gerente será uma subclasse de Empregado

Empregado será superclasse de Gerente

Herança habilita a capacidade polimórficaAgora, um gerente pode ser visto como um meroempregado

Ricardo Terra ([email protected]) POO 8 de julho de 2011 234 / 526

Page 236: JAVA - Apostila.pdf

POO – Herança

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

Ricardo Terra ([email protected]) POO 8 de julho de 2011 235 / 526

Page 237: JAVA - Apostila.pdf

POO – Herança

Modelo 2: Classe Departamento – Implementação

Nenhuma modificação

Ricardo Terra ([email protected]) POO 8 de julho de 2011 236 / 526

Page 238: JAVA - Apostila.pdf

POO – Herança

Modelo 2: Classe Empregado – Implementação

1 public class Empregado {protected long cpf ;

3 protected S t r i ng nome;

5 public Empregado( long cpf , S t r i ng nome) {t h i s . cpf = cpf ;

7 t h i s .nome = nome;}

9

/∗ Metodos Acessores ∗/11 }

O que mudou?Atributos private viram protected

Ricardo Terra ([email protected]) POO 8 de julho de 2011 237 / 526

Page 239: JAVA - Apostila.pdf

POO – Herança

Modelo 2: Classe Gerente – Implementação

public class Gerente extends Empregado{2 private Departamento departamento ;

4 public Gerente ( long cpf , S t r i ng nome, Departamento departamento ) {super ( cpf , nome) ;

6 t h i s . departamento = departamento ;}

8

/∗ Metodos Acessores somente de departamento ∗/10 }

O que mudou?Gerente estende Empregado, logo devido a essa extensão:

foram removidos os atributos cpf e nome

foram removidos os métodos acessores de cpf e nome

Ricardo Terra ([email protected]) POO 8 de julho de 2011 238 / 526

Page 240: JAVA - Apostila.pdf

POO – Herança

Modelo 2: Classe Gerente – Implementação

1 public Gerente ( long cpf , S t r i ng nome, Departamento departamento ) {super ( cpf , nome) ;

3 t h i s . departamento = departamento ;}

E esse super?Por regra, o construtor de Gerente deve chamar umconstrutor de Empregado

Geralmente, Java sempre chama o construtor vazio atravésde super()

Contudo, Empregado não tem o construtor vazio, portantotemos que na primeira linha do construtor de Gerentechamar algum construtor existente em Empregado

Isso é logo abordado em mais detalhes

Ricardo Terra ([email protected]) POO 8 de julho de 2011 239 / 526

Page 241: JAVA - Apostila.pdf

POO – Herança

Refletindo novamente...Agora, a modelagem indica que um gerente tem tudo queempregado tem!

Logo, agora é possível?Empregado e = new Gerente (1 , " Ricardo " , new Departamento(1 , " T I " ) )

Sim, mas porquê? Modelagem OO adequada ao problema

Ricardo Terra ([email protected]) POO 8 de julho de 2011 240 / 526

Page 242: JAVA - Apostila.pdf

POO – Herança

Exemplo Completo

1 public s t a t i c void main( S t r i ng [ ] args ) {Empregado e = new Empregado(2 , " V i r g i l i o Borges " ) ;

3 Gerente g = new Gerente (1 , " Ricardo " , new Departamento (1 , " T I " ) ) ;

5 Empregado v [ ] = {e ,g } ;

7 f o r (Empregado o : v ) {System . out . p r i n t l n (o . getCpf ( ) + " " + o .getNome ( ) ) ;

9 }}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 241 / 526

Page 243: JAVA - Apostila.pdf

POO – Herança

Funcionamento dos construtoresEm uma hierarquia, não se pode criar uma especializaçãode certa classe sem chamar um construtor de suasuperclasse imediata

Caso você não invoque explicitamente, Java insere umachamada padrão super() que, na verdade, invoca oconstrutor vazio da superclasse imediata

Logo, suponha o seguinte construtor a classe A:public A( ) {}

igual apublic A( ) {

super ( ) ; // invocando o construtor vazio da superclasse}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 242 / 526

Page 244: JAVA - Apostila.pdf

POO – Herança

Exemplo 1 – Iguais!!!

1 public class A {

3 }

1 public class B extends A {

3 }

1 public class A {

3 public A( ) {

5 }

7 }

1 public class B extends A {

3 public B ( ) {

5 }

7 }

1 public class A {

3 public A( ) {super ( ) ;

5 }

7 }

1 public class B extends A {

3 public B ( ) {super ( ) ;

5 }

7 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 243 / 526

Page 245: JAVA - Apostila.pdf

POO – Herança

Revisão da Capacidade Polimórfica

Pode?

A a = new A ( ) ;

A a = new B ( ) ;

B b = new B ( ) ;

B b = new A ( ) ; /∗ erro , por acaso A é subclasse de B? ∗/

Ricardo Terra ([email protected]) POO 8 de julho de 2011 244 / 526

Page 246: JAVA - Apostila.pdf

POO – Herança

Nunca me preocupei com construtores. Ignorância é umabenção!

public class A { }

public class B extends A { }

Claro que não!A tem um construtor vazio criado por Java!

B tem um construtor vazio criado por Java que chama oconstrutor vazio de A!

Ricardo Terra ([email protected]) POO 8 de julho de 2011 245 / 526

Page 247: JAVA - Apostila.pdf

POO – Herança

Nunca me preocupei com construtores. Ignorância é mesmouma benção!

public class A { }

public class B extends A {i n t x ;public B ( i n t x ) {

t h i s . x = x ;}

}

Claro que não!A tem um construtor vazio criado por Java!

B pode ter qualquer construtor, pois Java insereautomaticamente uma chamada ao construtor vazio de A(que existe)!

Ricardo Terra ([email protected]) POO 8 de julho de 2011 246 / 526

Page 248: JAVA - Apostila.pdf

POO – Herança

Enfim...Em uma hierarquia, não se pode criar uma especializaçãode certa classe sem chamar um construtor de suasuperclasse imediata

Caso você não invoque explicitamente, Java insere umachamada padrão super() que, na verdade, invoca oconstrutor vazio da superclasse imediata

Conclusão: em uma hierarquia, você só pode deixar deinvocar o construtor da superclasse se, e somente se, asuperclasse tiver um construtor vazio

Ricardo Terra ([email protected]) POO 8 de julho de 2011 247 / 526

Page 249: JAVA - Apostila.pdf

POO – Herança

Referência super

Assim, como this é uma referência à própria classe, superé uma referência à superclasse

Por exemplo:usamos this() para invocar construtores da própria classe,agora usamos super() para invocar construtores dasuperclasseusamos this. para acessar atributos e invocar métodos daprópria classe, agora usamos super. para acessar atributose invocar métodos da superclasse

Ricardo Terra ([email protected]) POO 8 de julho de 2011 248 / 526

Page 250: JAVA - Apostila.pdf

POO – Herança

Sessão “Vale a pena ver de novo”: Sobreposição

Você sobrepõe uma operação quando deseja que umaoperação herdada seja realizada diferentemente pelasubclasse

Por exemplo, uma cobra se alimenta de ratos, mas um tipoespecífico de cobra (subclasse) se alimenta diferentemente

Assim, é necessário sobrepor o método alimentar:Classe Cobra

void alimentar ( Rato comida) { /∗ mata e come ∗/ }

Classe Cascavel

@Overridevoid alimentar ( Rato comida) { /∗ come mesmo vivo ∗/ }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 249 / 526

Page 251: JAVA - Apostila.pdf

POO – Herança

Sessão “Vale a pena ver de novo”: Sobrecarga

Você sobrecarrega uma operação quando deseja que amesma operação também seja realizada por entradasdiferentes

Por exemplo, uma cobra se alimenta de ratos, mas um tipoespecífico de cobra (subclasse) se alimenta também deratazanas

Assim, é necessário sobrecarregar o método alimentar:Classe Cobra

void alimentar ( Rato comida) { /∗ mata e come ∗/ }

Classe Cascavel

@Overridevoid alimentar ( Rato comida) { /∗ come mesmo vivo ∗/ }void alimentar ( Ratazana comida) { /∗ come também ∗/ }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 250 / 526

Page 252: JAVA - Apostila.pdf

POO – Herança

Exemplo Completo

Nada como uma aplicação mais prática paraentendermos melhor...

Ricardo Terra ([email protected]) POO 8 de julho de 2011 251 / 526

Page 253: JAVA - Apostila.pdf

POO – Herança

Classe Conta

public class Conta {protected f i n a l Corrent is ta cor rent i s ta ;protected double saldo ;

public Conta( Corrent is ta corrent i s ta , double saldo ) {t h i s . cor rent i s ta = cor rent i s ta ;t h i s . saldo = saldo ;

}

public Conta( Corrent is ta cor rent i s ta ) {t h i s ( cor rent i s ta , 0.0 ) ;

}

public Corrent is ta getCorrent is ta ( ) {re turn cor rent i s ta ;

}

public double getSaldo ( ) {return saldo ;

}/∗ continua ∗/

Ricardo Terra ([email protected]) POO 8 de julho de 2011 252 / 526

Page 254: JAVA - Apostila.pdf

POO – Herança

Classe Conta

public void depositar ( double valor ) {t h i s . saldo += valor ;

}

public boolean r e t i r a r ( double valor ) {i f ( valor <= t h i s . saldo ) {

t h i s . saldo −= valor ;re turn true ;

}return fa lse ;

}

@Overridepublic S t r i ng toS t r i ng ( ) {

return t h i s . cor rent i s ta .getNome( ) + " tem R$ " + t h i s . saldo ;}

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 253 / 526

Page 255: JAVA - Apostila.pdf

POO – Herança

Importante sobre a classe Conta

Observe a visibilidade dos atributos

Observe a chamada entre construtores utilizando this

Observe a sobreposição do método toString

Ricardo Terra ([email protected]) POO 8 de julho de 2011 254 / 526

Page 256: JAVA - Apostila.pdf

POO – Herança

Classe ContaCorrente

public class ContaCorrente extends Conta {private double l i m i t e ;

public ContaCorrente ( Corrent is ta corrent i s ta , double saldo , double l i m i t e ) {super ( cor rent i s ta , saldo ) ;t h i s . l i m i t e = l i m i t e ;

}

@Overridepublic boolean r e t i r a r ( double valor ) {

i f ( valor <= t h i s . saldo + t h i s . l i m i t e ) {t h i s . saldo −= valor ;re turn true ;

}return fa lse ;

}

public void depositar ( Cheque cheque ) {t h i s . saldo += cheque. getValor ( ) ;

}

@Overridepublic S t r i ng toS t r i ng ( ) {

return super . toS t r i ng ( ) + " mais l i m i t e de R$ " + t h i s . l i m i t e ;}

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 255 / 526

Page 257: JAVA - Apostila.pdf

POO – Herança

Importante sobre a classe ContaCorrente

Observe que estende a classe Conta

Logo, deve chamar algum construtor de Conta

E chama: super( correntista, saldo );

Mas, poderia ser também: super( correntista );

E se não chamasse nenhum? O que aconteceria?

Observe a sobreposição dos métodos retirar e toString

Observe a sobrecarga do método depositar

Ricardo Terra ([email protected]) POO 8 de julho de 2011 256 / 526

Page 258: JAVA - Apostila.pdf

POO – Herança

Exemplo Completo

public s t a t i c void main( S t r i ng [ ] args ) {2 Conta c = new Conta ( new Corrent i s ta ( 111 , " Fred " ) , 25.0 ) ;

ContaCorrente cc = new ContaCorrente ( new Corrent i s ta ( 222 , " Luciano " ) , 100.00 , 1000.00 ) ;4

System . out . p r i n t l n ( c ) ; /∗ Fred tem R$25 .00 ∗/6 System . out . p r i n t l n ( cc ) ; /∗ Luciano tem R$100 .00 mais l i m i t e de R$1000 .00 ∗/

8 System . out . p r i n t l n ( c . getSaldo ( ) ) ; /∗ 25.00 ∗/System . out . p r i n t l n ( " Retirada de R$26 . 0 : " + c . r e t i r a r ( 26.0 ) ) ; /∗ fa l se ∗/

10 System . out . p r i n t l n ( c . getSaldo ( ) ) ; /∗ 25.00 ∗/

12 System . out . p r i n t l n ( cc . getSaldo ( ) ) ; /∗ 100.00 ∗/System . out . p r i n t l n ( " Retirada de R$ 200 ,00: " + cc . r e t i r a r ( 200.00 ) ) ; /∗ t rue ∗/

14 System . out . p r i n t l n ( cc . getSaldo ( ) ) ; /∗ −100.00 ∗/

16 cc . depositar ( 50 ) ;System . out . p r i n t l n ( cc . getSaldo ( ) ) ; /∗ −100.00 ∗/

18

cc . depositar ( new Cheque( 60.00 ) ) ;20 System . out . p r i n t l n ( cc . getSaldo ( ) ) ; /∗ 10.00 ∗/

22 Object v [ ] = new Object [ ] { c , cc } ;f o r ( Object x : v ) {

24 System . out . p r i n t l n ( x ) ; /∗ Mesmo que x . toS t r ing ( ) ∗/}

26 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 257 / 526

Poderia ser x.getSaldo()?

Page 259: JAVA - Apostila.pdf

POO – Herança

Por que não poderia ser x.getSaldo?Não funciona, porque x está sendo enxergado comoObject

Assim, somente se vê as operações que existem em Object,pois não se pode garantir que o arranjo só tenha objetos dotipo Conta (mesmo tendo, nesse caso específico)

Além disso, é importante mencionar que um objeto não secomporta diferentemente pelo modo como é visto

Referindo-me ao caso do toString

Ricardo Terra ([email protected]) POO 8 de julho de 2011 258 / 526

Page 260: JAVA - Apostila.pdf

POO – Herança

ResumoHerança

Visão geralFuncionamento dos construtoresSobreposição de métodosSobrecarga de métodosCapacidade polimórfica (polimorfismo)

Ricardo Terra ([email protected]) POO 8 de julho de 2011 259 / 526

Page 261: JAVA - Apostila.pdf

POO

Modificadores

Ricardo Terra ([email protected]) POO 8 de julho de 2011 260 / 526

Page 262: JAVA - Apostila.pdf

POO – Modificadores

Modificador finalAté agora, vimos o uso do modificador final somente ematributos. No entanto, o modificador final pode ser tambématribuído a métodos e classes

Uso do modificador finalEm atributos: atributo fica imutável

Inicializado uma única vez no construtor

Em métodos: método não pode ser sobrescrito

Terá o mesmo comportamento em todas as subclasses

Em classes: classe não pode ter subclasses

Na árvore de heranças, tal classe será uma folha

Ricardo Terra ([email protected]) POO 8 de julho de 2011 261 / 526

Page 263: JAVA - Apostila.pdf

POO – Modificadores

Sessão “Vale a pena ver de novo”: Modificador final ematributos

public class Pessoa {2 private f i n a l S t r i ng nome;

4 public Pessoa ( S t r i ng nome) {t h i s .nome = nome;

6 }

8 public S t r i ng getNome( ) {re turn nome;

10 }}

Pergunta-se:

Onde está o setNome?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 262 / 526

Page 264: JAVA - Apostila.pdf

POO – Modificadores

Modificador final em classes. Pode?

1 public class A {

3 }

1 public class B extends A {

3 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 263 / 526

Page 265: JAVA - Apostila.pdf

POO – Modificadores

Modificador final em classes. E agora?

1 public f i n a l class A {

3 }

1 public class B extends A {

3 }

Pergunta-se:

Por que não pode?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 264 / 526

Page 266: JAVA - Apostila.pdf

POO – Modificadores

Modificador final em método. Pode?

1 public class A {public void f ( ) {

3 System . out . p r i n t l n ( "Opa! " ) ;}

5 }

1 public class B extends A {@Override

3 public void f ( ) {System . out . p r i n t l n ( "Epa! " ) ;

5 }}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 265 / 526

Page 267: JAVA - Apostila.pdf

POO – Modificadores

Modificador final em método. E agora?

public class A {2 public f i n a l void f ( ) {

System . out . p r i n t l n ( "Opa! " ) ;4 }

}

1 public class B extends A {@Override

3 public void f ( ) {System . out . p r i n t l n ( "Epa! " ) ;

5 }}

Pergunta-se:

Por que não pode??

E ainda, B pode estender A?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 266 / 526

Page 268: JAVA - Apostila.pdf

POO – Modificadores

Perguntas Interessantes...1 Se o método equals da classe Object fosse final, o que

aconteceria?

2 E se o método toString da classe Object fosse final, oque aconteceria?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 267 / 526

Page 269: JAVA - Apostila.pdf

POO – Modificadores

Modificador abstractVimos o conceito de classe abstrata quando aprendemosUML, em que uma classe que não tem instâncias e éutilizada somente como mecanismo de reúso e para provêra capacidade polimórfica

Isso é verdade, contudo vamos aprofundar mais no usodesse modificador, inclusive para métodos

Ricardo Terra ([email protected]) POO 8 de julho de 2011 268 / 526

Page 270: JAVA - Apostila.pdf

POO – Modificadores

Uso do modificador abstractEm atributos: não existe tal conceito

Em métodos: método não possui implementação

o método e sua classe deverão ser abstratos, pois se a classecontém algum método abstrato, ela deve ser abstrata

deve ser implementado em alguma subclasse concreta, nãonecessariamente a subclasse imediata

Em classes: classe não pode ser instanciada (new)

pode ter nenhum ou todos os métodos abstratos

serve como molde de herança, mecanismo de polimorfismo,melhorar modelagens etc

Ricardo Terra ([email protected]) POO 8 de julho de 2011 269 / 526

Page 271: JAVA - Apostila.pdf

POO – Modificadores

Exemplo Conceitual

Ricardo Terra ([email protected]) POO 8 de julho de 2011 270 / 526

Page 272: JAVA - Apostila.pdf

POO – Modificadores

Classe A

Método f abstrato, logo a classe deve ser abstrata

Possui também o método g que é concreto

public abstract class A {2 public abstract void f ( ) ;

4 public void g( ) {/∗ . . . ∗/

6 }}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 271 / 526

Page 273: JAVA - Apostila.pdf

POO – Modificadores

Classe B1

Classe concreta, pois implementa f

1 public class B1 extends A{@Override

3 public void f ( ) {/∗ . . . ∗/

5 }}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 272 / 526

Page 274: JAVA - Apostila.pdf

POO – Modificadores

Classe B2

Classe abstrata, pois não implementa f

Mas, sobrepõe g e define um novo método h

public abstract class B2 extends A{2 @Override

public void g( ) {4 /∗ . . . ∗/

}6

public void h ( ) {8 /∗ . . . ∗/

}10 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 273 / 526

Page 275: JAVA - Apostila.pdf

POO – Modificadores

Classe C

Classe concreta, pois implementa f

public class C extends B2 {2 @Override

public void f ( ) {4 /∗ . . . ∗/

}6 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 274 / 526

Page 276: JAVA - Apostila.pdf

POO – Modificadores

Utilização Prática 01

Uma classe pode possuir nenhum método abstrato e serabstrata

Isso ocorre quando não se deseja instâncias de tal classee/ou quando a classe serve como molde de herançapossibilitando a capacidade polimórfica

Exemplo

public abstract class A {2 public void f ( ) {

/∗ . . . ∗/4 }

6 public void g( ) {/∗ . . . ∗/

8 }}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 275 / 526

Page 277: JAVA - Apostila.pdf

POO – Modificadores

Utilização Prática 01

Um exemplo clássico dessa utilização é a classe Conta

Uma conta pode ser ContaCorrente ou ContaPoupanca,mas não simplesmente Conta

Logo, Conta deve ser abstrata

Aí, com isso, qualquer conta (corrente ou poupança ououtras) poderão ser tratadas como uma simples conta

Ricardo Terra ([email protected]) POO 8 de julho de 2011 276 / 526

Page 278: JAVA - Apostila.pdf

POO – Modificadores

Utilização Prática 01 – Classe Conta com modificadores

1 public abstract class Conta {/∗ . . . ∗/

3

public f i n a l double getSaldo ( ) {5 return saldo ;

}7

public f i n a l void depositar ( double valor ) {9 t h i s . saldo += valor ;

}11 /∗ . . . ∗/

13 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 277 / 526

Page 279: JAVA - Apostila.pdf

POO – Modificadores

Outros exemplos...Além de Conta podemos vislumbrar outras classes que seencaixam nesse cenário:

Animal

Veiculo

etc

Ricardo Terra ([email protected]) POO 8 de julho de 2011 278 / 526

Page 280: JAVA - Apostila.pdf

POO – Modificadores

Utilização Prática 02

O que se pode dizer de comum das “coisas” nos próximosslides?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 279 / 526

Page 281: JAVA - Apostila.pdf

POO – Modificadores

Ricardo Terra ([email protected]) POO 8 de julho de 2011 280 / 526

Page 282: JAVA - Apostila.pdf

POO – Modificadores

Ricardo Terra ([email protected]) POO 8 de julho de 2011 280 / 526

Page 283: JAVA - Apostila.pdf

POO – Modificadores

Ricardo Terra ([email protected]) POO 8 de julho de 2011 280 / 526

Page 284: JAVA - Apostila.pdf

POO – Modificadores

Ricardo Terra ([email protected]) POO 8 de julho de 2011 280 / 526

Page 285: JAVA - Apostila.pdf

POO – Modificadores

Utilização Prática 02

Então:Todas são figuras!Todas têm cor!Todas têm perímetro e área!

Logo, como modelar?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 281 / 526

Page 286: JAVA - Apostila.pdf

POO – Modificadores

Utilização Prática 02 – Modelagem péssima!!!

Mas, por quê?Não existe capacidade polimórficaDuplicação de código

Ricardo Terra ([email protected]) POO 8 de julho de 2011 282 / 526

Page 287: JAVA - Apostila.pdf

POO – Modificadores

Utilização Prática 02 – Modelagem muito ruim!!!

Mas, por quê?Pode-se criar objetos do tipo Figura

Métodos area e perimetro tem um implementação banalem Figura e são sobrescritos nas subclasses

Além disso, nada os obriga a serem sobrescritosPor exemplo, método perimetro de Circunferencia

Ricardo Terra ([email protected]) POO 8 de julho de 2011 283 / 526

Page 288: JAVA - Apostila.pdf

POO – Modificadores

Utilização Prática 02 – Modelagem ruim!!!

Mas, por quê?Métodos area e perimetro tem um implementação banalem Figura e são sobrescritos nas subclasses

Além disso, nada os obriga a serem sobrescritosPor exemplo, método perimetro de Circunferencia

Ricardo Terra ([email protected]) POO 8 de julho de 2011 284 / 526

Page 289: JAVA - Apostila.pdf

POO – Modificadores

Utilização Prática 02 – Modelagem adequada!!!

Mas, por quê?Existe capacidade polimórfica

Não existe duplicação de código

Métodos area e perimetro devem ser sobrescritos nassubclasses concretas

Ricardo Terra ([email protected]) POO 8 de julho de 2011 285 / 526

Page 290: JAVA - Apostila.pdf

POO – Modificadores

Utilização Prática 02 – adequada – Classe Figura

1 public abstract class Figura {protected f i n a l S t r i ng cor ;

3

public Figura ( S t r i ng cor ) {5 super ( ) ;

t h i s . cor = cor ;7 }

9 public f i n a l S t r i ng getCor ( ) {re turn t h i s . cor ;

11 }

13 public abstract double perimetro ( ) ;public abstract double area ( ) ;

15 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 286 / 526

Observe que uma classe abstrata podeter construtores. Mesmo não podendo criarinstâncias, as subclasses devem respeitar comose constrói uma figura

Page 291: JAVA - Apostila.pdf

POO – Modificadores

Utilização Prática 02 – adequada – Classe Circunferencia

1 public class Circunferencia extends Figura {private Ponto ponto ;

3 private double ra io ;

5 public Circunferencia ( S t r i ng cor , Ponto ponto , double ra io ) {super ( cor ) ;

7 t h i s . ponto = ponto ;t h i s . ra io = raio ;

9 }/∗ . . . ∗/

11 @Overridepublic double area ( ) {

13 re turn Math . P I ∗ Math .pow( t h i s . raio , 2 ) ;}

15

@Override17 public double perimetro ( ) {

return 2 ∗ Math . P I ∗ t h i s . ra io ;19 }

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 287 / 526

Page 292: JAVA - Apostila.pdf

POO – Modificadores

Pergunta Interessante...

Uma classe ou método podem ser final e abstract aomesmo tempo?

Não, mas por quê?Se for método, não pode sobrescrever o método abstractpor causa do final que diz que uma versão nãoimplementada do método é a última versão. Isso não fazsentido!

Se for classe, não pode ter subclasses por causa do final eela não pode ter instâncias por causa do abstract. Isso nãofaz sentido!

Ricardo Terra ([email protected]) POO 8 de julho de 2011 288 / 526

Page 293: JAVA - Apostila.pdf

POO – Modificadores

Pergunta Interessante...

Uma classe ou método podem ser final e abstract aomesmo tempo?

Não, mas por quê?Se for método, não pode sobrescrever o método abstractpor causa do final que diz que uma versão nãoimplementada do método é a última versão. Isso não fazsentido!

Se for classe, não pode ter subclasses por causa do final eela não pode ter instâncias por causa do abstract. Isso nãofaz sentido!

Ricardo Terra ([email protected]) POO 8 de julho de 2011 288 / 526

Page 294: JAVA - Apostila.pdf

POO – Modificadores

Outra Pergunta Interessante...

Porque não se pode instanciar classes abstratas?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 289 / 526

Page 295: JAVA - Apostila.pdf

POO

Interface

Ricardo Terra ([email protected]) POO 8 de julho de 2011 290 / 526

Page 296: JAVA - Apostila.pdf

POO – Interface

Problema MotivadorSuponha um sistema de grande porte (10MLOC)desenvolvido em Java e utilizando SGBD MySql

Suponha ainda que suas classes estejam acopladasdiretamente às classes do MySql

Pergunta-se: E se quiser mudar para outro SGBD?

obteremos essa resposta ao longo desta subseção

Ricardo Terra ([email protected]) POO 8 de julho de 2011 291 / 526

Page 297: JAVA - Apostila.pdf

POO – Interface

InterfaceInterface não é uma classe, mas um conjunto de requisitospara classes que precisam se adequar à ela

Geralmente, o fornecedor de algum serviço afirma: “Se suaclasse estiver em conformidade com uma determinadainterface, então realizarei o serviço”

Representações UML:

Ricardo Terra ([email protected]) POO 8 de julho de 2011 292 / 526

Page 298: JAVA - Apostila.pdf

POO – Interface

InterfacePode ser pensada como uma classe completamenteabstrata em que:

não possui construtores

todos os seus membros (atributos e métodos) são públicos

todos os seus atributos são constantes estáticaspublic static final ...

todos os seus métodos são abstratospublic abstract ...

Mais importante, uma interface é implementada e nãoestendida

justamente porque não há o que estenderainda, uma classe pode implementar n interfaces

Ricardo Terra ([email protected]) POO 8 de julho de 2011 293 / 526

Page 299: JAVA - Apostila.pdf

POO – Interface

Interface – SintaxeSuponha a seguinte interface IMatematica:

Essa interface é um contrato, o qual indica que:cálculos que necessitem do PI devem utilizar aqueledeclarado na interface

implementações devem ser capazes de calcular ahipotenusa de um triângulo e o perímetro de umacircunferência

Ricardo Terra ([email protected]) POO 8 de julho de 2011 294 / 526

Page 300: JAVA - Apostila.pdf

POO – Interface

Interface – Sintaxe – IMatematica

public inter face IMatematica {2 double PI = 3.141596;

4 double hipotenusa (double a, double b ) ;

6 double perimetroCircunferencia (double ra io ) ;

8 }

ou

public inter face IMatematica {2 public s t a t i c f i n a l double PI = 3.141596;

4 public abstract double hipotenusa (double a, double b ) ;

6 public abstract double perimetroCircunferencia (double ra io ) ;

8 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 295 / 526

Em atributos, não é necessário colocarpublic static final, mas se quiser...

Em métodos, não é necessário colocarpublic abstract, mas se quiser...

Page 301: JAVA - Apostila.pdf

POO – Interface

Interface – Sintaxe – Implementações

Suponha agora que foram desenvolvidas duasimplementações dessa interface:

1 TerraMatematica: uma implementação da interfacedesenvolvida por mim

2 AlunoMatematica: uma implementação da interfacedesenvolvida por um aluno

Já adiantando, a ideia é que a aplicação só conheçaIMatematica, ou seja, funcionará com qualquerimplementação sem impacto à aplicação

Ricardo Terra ([email protected]) POO 8 de julho de 2011 296 / 526

Page 302: JAVA - Apostila.pdf

POO – Interface

Interface – Sintaxe – TerraMatematica

public class TerraMatematica implements IMatematica {2

@Override4 public double hipotenusa ( double a, double b ) {

re turn Math . sq r t ( Math .pow( a, 2 ) + Math .pow( b, 2 ) ) ;6

} ;8

@Override10 public double perimetroCircunferencia ( double ra io ) {

re turn 2 ∗ PI ∗ ra io ;12 }

14 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 297 / 526

Page 303: JAVA - Apostila.pdf

POO – Interface

Interface – Sintaxe – TerraMatematica

public class AlunoMatematica implements IMatematica {2

@Override4 public double hipotenusa ( double a, double b ) {

double x = a∗a + b∗b;6 double r e s u l t = Math . sq r t ( x ) ;

re turn r e s u l t ;8 } ;

10 @Overridepublic double perimetroCircunferencia ( double ra io ) {

12 double r e s u l t = 2 ∗ PI ∗ ra io ;re turn r e s u l t ;

14 }

16 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 298 / 526

Page 304: JAVA - Apostila.pdf

POO – Interface

Interface – Sintaxe – Exemplo de Uso

public s t a t i c void main( S t r i ng [ ] args ) {2 IMatematica m = Factory . getMatematica ( ) ;

4 System . out . p r i n t f ( " Sendo a=3 , b=4 , h=%.2 f \n " ,m. hipotenusa ( 3 , 4 ) ) ;

6

System . out . p r i n t f ( " Sendo raio =2.069 , perimetro = %.2 f " ,8 m. perimetroCircunferencia ( 2.069 ) ) ;

}

ImportanteObserve que não se sabe qual a implementação foiretornada pela fábrica, isto é, se abstrai desse detalhe

Assim, pode-se trocar a implementação sem impacto àaplicação

Ricardo Terra ([email protected]) POO 8 de julho de 2011 299 / 526

Page 305: JAVA - Apostila.pdf

POO – Interface

Interface – UtilidadeA maior utilidade de interfaces é – sem dúvida alguma –desacoplar a aplicação das implementações

No último exemplo, toda a aplicação conhece apenas ainterface IMatematica sem dependência direta àimplementação utilizada

Ricardo Terra ([email protected]) POO 8 de julho de 2011 300 / 526

Page 306: JAVA - Apostila.pdf

POO – Interface

Interface – UtilidadeVoltando ao nosso problema motivador, a solução é autilização de interfaces (mais especificamente o princípiode projeto conhecido como Programação por Interface)

Assim, a Sun Microsystems (hoje Oracle) criou a API JDBCque define como deve ser o acesso ao banco de dadosindependente do SGBD utilizado

Como fez isso? Por meio da criação de várias interfaces

Diante disso, as empresas de SGBDs – como Oracle, MySql,IBM etc – tiveram que criar implementações para cadauma das interfaces da API JDBC

Ao conjunto dessas implementações é dado o nome deconector (connector)

Ricardo Terra ([email protected]) POO 8 de julho de 2011 301 / 526

Page 307: JAVA - Apostila.pdf

POO – Interface

Interface – Utilidade

Ricardo Terra ([email protected]) POO 8 de julho de 2011 302 / 526

Page 308: JAVA - Apostila.pdf

POO – Interface

Interface – Exemplo do PatoO Pato é um animal que:

voa, mas voa malanda, mas anda malnada, mas nada mal

Assim, essas são ideias de funções/atribuições, por exemplo:

urubu também voa e nada, mas diferente de um patotubarão também nada, mas nada diferente de um pato

É possível uma modelagem que permite que um patopossua essas três funções/atribuições, isto é, possa ser umvoador, um andador e um nadador ao mesmo tempo?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 303 / 526

Page 309: JAVA - Apostila.pdf

POO – Interface

Interface – Exemplo do Pato – Solução

Pode-se implementar diversas interfaces, logo a solução é acriação de interfaces para cada função/atribuição:

interface Voador com método voar

interface Andador com método andar

interface Nadador com método nadar

Interface – Exemplo do Pato – Solução

public inter face Voador { . . . }public inter face Andador { . . . }public inter face Nadador { . . . }

public class Pato extends Ave implements Voador , Andador , Nadador { . . . }

public class Urubu extends Ave implements Voador , Andador { . . . }

public class Tubarao extends Peixe implements Nadador { . . . }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 304 / 526

Page 310: JAVA - Apostila.pdf

POO – Interface

Interface – Exemplo do Pato – Solução

Desse modo, cada classe implementa as interfaces com osserviços que deseja disponibilizar, veja:

Ricardo Terra ([email protected]) POO 8 de julho de 2011 305 / 526

Page 311: JAVA - Apostila.pdf

POO

Herança Múltipla?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 306 / 526

Page 312: JAVA - Apostila.pdf

POO – Herança Múltipla?

Herança Múltipla

Herança Múltipla consiste em uma classe herdar de mais deuma classe. Por exemplo:

public Pessoa extends Mamifero , Animal { . . . }

public RadioRelogio extends Radio , Relogio { . . . }

No entanto, Java não provê herança múltipla. Logo, asdeclarações acima – mesmo lógicas e óbvias para nós –não são válidas na linguagem Java

Porém, válidas em outras linguagens OO, como C++

Ricardo Terra ([email protected]) POO 8 de julho de 2011 307 / 526

Page 313: JAVA - Apostila.pdf

POO – Herança Múltipla?

Herança Múltipla

Java optou por não prover herança múltipla devido àcomplexidade gerada ao compilador

Alguns possíveis problemas seriam:

colisão de atributos e métodos

ambiguidade ao se acessar atributos ou invocar métodos

complexidade dos construtores

etc

Ricardo Terra ([email protected]) POO 8 de julho de 2011 308 / 526

Page 314: JAVA - Apostila.pdf

POO – Herança Múltipla?

Assim...Na necessidade de herança múltipla, têm-se trêsalternativas bem definidas:

1 Não utilizar herança múltipla, isto é, remodelar o problemade forma que não necessite de herança múltipla

convém salientar que não possuir herança múltipla, nãodiminui o poder de expressão da linguagem

2 Utilizar herança indireta (se possível)isto é, se C quer estender A e B, faça C estender B eB estender A, assim C será também subclasse de A e de B

3 Utilizar interfacesuma classe pode implementar diversas interfaces

Ricardo Terra ([email protected]) POO 8 de julho de 2011 309 / 526

Page 315: JAVA - Apostila.pdf

POO – Herança Múltipla?

Alternativa: Herança Indireta

Dado a herança múltipla de Pessoa:public Pessoa extends Mamifero , Animal { . . . }

Como Mamifero é um Animal, pode-se:public Pessoa extends Mamifero { . . . }public Mamifero extends Animal { . . . }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 310 / 526

:

Page 316: JAVA - Apostila.pdf

POO – Herança Múltipla?

Alternativa: InterfacesNo entanto, a última alternativa não resolve o problema doRádio Relógio, simplesmente porque Rádio não é umRelógio nem o contrário

Assim, a solução é um pouco complicada1 Criar interfaces para as classes Radio e Relogio

recomenda-se chamá-las de IRadio e IRelogio

2 Fazer RadioRelogio estender Radio e implementarIRelogio (comum estender a mais complexa)

3 Em RadioRelogio, colocar como atributo um objeto do tipoRelogio

4 Implementar os métodos de IRelogio redirecionando paraos métodos do objeto do tipo Relogio

Ricardo Terra ([email protected]) POO 8 de julho de 2011 311 / 526

Page 317: JAVA - Apostila.pdf

POO – Herança Múltipla?

Alternativa: Interfaces

Ricardo Terra ([email protected]) POO 8 de julho de 2011 312 / 526

:

Page 318: JAVA - Apostila.pdf

POO

Classe Abstrata x Interface

Ricardo Terra ([email protected]) POO 8 de julho de 2011 313 / 526

Page 319: JAVA - Apostila.pdf

POO – Classe Abstrata x Interface

Diferenciando: Classe Abstrata x InterfaceHerdar uma classe abstrata ou uma interface permite apropriedade polimórfica, isto é, se aplica o conceito do éum(a)

Por exemplo: A a = new B()

O tipo A pode ser:

uma classe concreta estendida por B

uma classe abstrata estendida por B

uma interface implementada por B

Contudo, existem diversas diferenças entre classes abstratase interfaces como pode ser observado no próximo slide

Ricardo Terra ([email protected]) POO 8 de julho de 2011 314 / 526

Page 320: JAVA - Apostila.pdf

POO – Classe Abstrata x Interface

Diferenciando: Classe Abstrata x Interface

Ricardo Terra ([email protected]) POO 8 de julho de 2011 315 / 526

Page 321: JAVA - Apostila.pdf

POO

Exceção

Ricardo Terra ([email protected]) POO 8 de julho de 2011 316 / 526

Page 322: JAVA - Apostila.pdf

POO – Exceção

Iniciando...Antes de entrarmos com sintaxe, é importante mencionarque exceção é um mecanismo muito poderoso dalinguagem Java

No entanto, deve-se dominá-lo para não se fazer mau usoÉ poderoso, mas pesado e exige muitos recursos

Ricardo Terra ([email protected]) POO 8 de julho de 2011 317 / 526

Page 323: JAVA - Apostila.pdf

POO – Exceção

Tratamento de Exceções

Associado a robustezHabilidade do aplicativo em reagir apropriadamente asituações anormais, ou melhor, uma circunstânciaexcepcional

Circunstância ExcepcionalDivisão por zero (ArithmeticException)

Uso de um índice inválido em arranjo (ArrayIndexOutOfBoundsException)

Acesso a uma referência nula (NullPointerException)

Perda de conexão com um BD (SQLException)

Acesso a um arquivo corrompido (IOException)

Estouro de memória ou pilha (OutOfMemoryError e StackOverflowError)

Ricardo Terra ([email protected]) POO 8 de julho de 2011 318 / 526

Page 324: JAVA - Apostila.pdf

POO – Exceção

Tratamento de Exceções

A linguagem Java provê uma forma das exceções seremtratados isoladamente do código que lida com o negócioda aplicação

O código abaixo ilustra a sintaxe utilizada em Java paraseparar o negócio da aplicação do tratamento de falhas

t r y {. . ./∗ negocio da aplicacao ∗/. . .

} catch ( PossivelExcecao e) {. . ./∗ tratamento da exceção ∗/. . .

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 319 / 526

Page 325: JAVA - Apostila.pdf

POO – Exceção

Tratamento de Exceções – Premissa

Um método executa ou falha

Se falha, é porque ativa uma exceção

Tratamento de Exceções – Vantagens

Código do negócio separado tratamento de exceçãoblocos distintos

Permite propagar exceções na pilha de chamada defunções

Se a chama b que chama c e esse último ativa umaexceção, tal exceção pode chegar em a

É possível agrupar e diferenciar tipos de erroshierarquia de exceção (fantástica, veremos no próximo slide)

Ricardo Terra ([email protected]) POO 8 de julho de 2011 320 / 526

Page 326: JAVA - Apostila.pdf

POO – Exceção

Hierarquia de Exceção

A hierarquia de exceção é um bom exemplo de uso deherança

Um objeto de exceção é sempre de uma classe derivadade java.lang.Throwable

Inclusive, java.lang.Throwable é subclasse dejava.lang.Object

Throwable – Principais Métodos

/∗ Retorna uma mensagem detalhada da exceção ∗/S t r i ng getMessage ( )

/∗ Imprime a exceção e ainda toda a pi lha de execução ∗/void printStackTrace ( )

Ricardo Terra ([email protected]) POO 8 de julho de 2011 321 / 526

Page 327: JAVA - Apostila.pdf

POO – Exceção

Hierarquia de Exceção

Ricardo Terra ([email protected]) POO 8 de julho de 2011 322 / 526

Page 328: JAVA - Apostila.pdf

POO – Exceção

Hierarquia de Exceção – Classificação

ErrosSubclasses de Error

Impossível de tratá-las, normalmente erros fatais

Exceções Não VerificáveisSubclasses de RuntimeException

O compilador não requer seu tratamento

Exceções VerificáveisAs que não são descendem nem de Error nem deRuntimeException

Devem ser:Ou tratadas ( try / catch / finally )

Ou progagadas ( throws )

Ricardo Terra ([email protected]) POO 8 de julho de 2011 323 / 526

Page 329: JAVA - Apostila.pdf

POO – Exceção

Exceção: Tratada ou Propagada?

Quando uma exceção é ativada, existem duas alternativas:

Tratar (resolver o problema)

Progagar (transferir o problema)

Por exemplo: “Piti”ExceptionProblema Tratar? Propagar?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 324 / 526

Page 330: JAVA - Apostila.pdf

POO – Exceção

Tratamento de Exceçãotry

Bloco Protegido, executado em completo se nada anormalacontece

catch

Bloco de Tratamento, executado se ocorre uma exceção dotipo indicado. Nunca o deixe vazio!

Um mesmo bloco protegido pode ter várias cláusulas catchAssim, o fluxo é desviado para o bloco catch correspondente

finally

Bloco de Finalização, sempre executado até mesmo depoisdo return de um método

Exceto System.exit()

Ricardo Terra ([email protected]) POO 8 de julho de 2011 325 / 526

Page 331: JAVA - Apostila.pdf

POO – Exceção

Tratamento de Exceção – Sintaxe

t r y {. . .. . ./∗ bloco protegido ∗/. . .. . .

} catch ( E1 e) {. . ./∗ bloco executado sse E1 fo r ativada ∗/. . .

} catch ( E2 e) {. . ./∗ bloco executado sse E2 fo r ativada ∗/. . .

} f i n a l l y {. . ./∗ bloco sempre executado ( ativando ou não qualquer exceção) ∗/. . .

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 326 / 526

Pode:

só try

try e catch∗

try e finally

try, catch∗ e finally

Page 332: JAVA - Apostila.pdf

POO – Exceção

Tratamento de Exceção – Exemplo 01a

. . .t r y {

a ( ) ; b ( ) ; c ( ) ; d ( ) ;} catch ( E1 e) {

e ( ) ; f ( ) ;} catch ( E2 e) {

g ( ) ; h ( ) ;} catch ( E3 e) {

i ( ) ; j ( ) ;}

m( ) ; n ( ) ;. . .

Pergunta-se: Quais métodos serão executados caso ative...1 exceção E1 no método a?2 exceção E3 no método b?3 exceção E2 no método d?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 327 / 526

Page 333: JAVA - Apostila.pdf

POO – Exceção

Tratamento de Exceção – Exemplo 01b

. . .t r y {

a ( ) ; b ( ) ; c ( ) ; d ( ) ;} catch ( E1 e) {

e ( ) ; f ( ) ;} catch ( E2 e) {

g ( ) ; h ( ) ;} catch ( E3 e) {

i ( ) ; j ( ) ;}

m( ) ; n ( ) ;. . .

Pergunta-se

Quais métodos serão executados caso uma RuntimeExceptionseja ativada no método c?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 328 / 526

Page 334: JAVA - Apostila.pdf

POO – Exceção

Tratamento de Exceção – Exemplo 02a

. . .t r y {

a ( ) ; b ( ) ; c ( ) ; d ( ) ;} catch ( E1 e) {

e ( ) ; f ( ) ;} catch ( E2 e) {

g ( ) ; h ( ) ;} f i n a l l y {

k ( ) ; l ( ) ;}

m( ) ; n ( ) ;. . .

Pergunta-se: Quais métodos serão executados caso ative...1 exceção E1 no método a?2 exceção E2 no método d?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 329 / 526

Page 335: JAVA - Apostila.pdf

POO – Exceção

Tratamento de Exceção – Exemplo 02b

. . .t r y {

a ( ) ; b ( ) ; c ( ) ; d ( ) ;} catch ( E1 e) {

e ( ) ; f ( ) ;} catch ( E2 e) {

g ( ) ; h ( ) ;} f i n a l l y {

k ( ) ; l ( ) ;}

m( ) ; n ( ) ;. . .

Pergunta-se

Quais métodos serão executados caso uma RuntimeExceptionseja ativada no método c?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 330 / 526

Page 336: JAVA - Apostila.pdf

POO – Exceção

Tratamento de Exceção – Fins acadêmicos

Como já mencionada, as exceções não verificáveis nãonecessitam ser tratadas

No entanto, para fins acadêmicos iremos fingir o tratamentode tais exceções apenas para facilitar o entendimento

No final desta seção, veremos porque não tratá-las

Serão utilizadas as mais conhecidas:

Divisão por zero (ArithmeticException)

Uso de um índice inválido em arranjo (ArrayIndexOutOfBoundsException)

Acesso a uma referência nula (NullPointerException)

Ricardo Terra ([email protected]) POO 8 de julho de 2011 331 / 526

Page 337: JAVA - Apostila.pdf

POO – Exceção

Tratamento de Exceção – Exemplo 03

public i n t divide ( i n t a, i n t b ) {2 t r y {

re turn a / b;4 } catch ( ArithmeticException e) {

e . printStackTrace ( ) ;6 re turn 0;

}8 }

Pergunta-se

O que acontece se a exceção for ativada? E se não for?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 332 / 526

Page 338: JAVA - Apostila.pdf

POO – Exceção

Tratamento de Exceção – Exemplo 04

public i n t divide ( i n t a, i n t b ) {2 t r y {

re turn a / b;4 } catch ( ArithmeticException e) {

System . out . p r i n t l n ( " Problema na div isao : " + e . getMessage ( ) ) ;6 re turn 0;

} f i n a l l y {8 System . out . p r i n t f ( " encerrando div isao(%d,%d) " , a, b ) ;

}10 }

Pergunta-se

O que acontece se a exceção for ativada? E se não for?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 333 / 526

Page 339: JAVA - Apostila.pdf

POO – Exceção

Tratamento de Exceção – Exemplo 05

public i n t divide ( i n t a, i n t b ) {2 t r y {

re turn a / b;4 } f i n a l l y {

System . out . p r i n t f ( " encerrando div isao(%d,%d) " , a, b ) ;6 }

}

Pergunta-se

O que acontece se alguma exceção for ativada? E se não for?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 334 / 526

Page 340: JAVA - Apostila.pdf

POO – Exceção

Tratamento de Exceção – Exemplo 06 – Situação Real

1 public void lerArquivo ( S t r i ng fileName ) {t r y {

3 Reader in = new FileReader ( fileName ) ;LineNumberReader reader = new LineNumberReader( in ) ;

5 while ( reader . ready ( ) ) {System . out . p r i n t l n ( reader . getLineNumber ( ) + " : " + reader . readLine ( ) ) ;

7 }reader . close ( ) ;

9 i n . close ( ) ;} catch ( FileNotFoundException e) {

11 System . out . p r i n t l n ( " Arq . nao ex i s te . Causa : " + e . getMessage ( ) ) ;} catch ( IOException e) {

13 System . out . p r i n t l n ( " E r ro de E/S . Causa : " + e . getMessage ( ) ) ;} catch ( Throwable e) {

15 System . out . p r i n t l n ( " E r ro de Inesperado . Causa : " + e . getMessage ( ) ) ;}

17 }

Pergunta-se1 O que ocorre se uma RuntimeException for ativada?2 Pode inverter a ordem das exceções?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 335 / 526

Se não encontrar oarquivo

Algum erro na leitura doarquivo

Qualquer outro erro

Page 341: JAVA - Apostila.pdf

POO – Exceção

Tratamento de Exceção – Exemplo 06 – Situação Real –Explicação

A ordem das exceções deve ser da mais específica para amais genérica

Por exemplo, se Throwable estivesse no 1o bloco catch,qualquer exceção entraria nesse bloco

Porque, na verdade, é verificado se a exceção é subclasseda exceção discriminada no catch

E, como sabemos, todas as exceções são subclasses deThrowable

Como é FileNotFoundException é uma IOException,também não poderia mudar. Logo, nesse exemplo não sepode alterar a ordem do tratamento de exceções

Ricardo Terra ([email protected]) POO 8 de julho de 2011 336 / 526

Page 342: JAVA - Apostila.pdf

POO – Exceção

Propagação de Exceçãothrows

Permite ao método chamado delegar o tratamento do erropara o método chamador

Metáfora com chefe mandando funcionário fazer algo ealgum problema aparece para o funcionário

É uma boa prática de programação, pois permite construirsistemas onde tratamento de erros é centralizado

Propagação de Exceção – Sintaxe

Basta colocar no throws no final da assinatura do método

Por exemplo:

public int f() throws E1

private void g( double d ) throws E1, E2

Ricardo Terra ([email protected]) POO 8 de julho de 2011 337 / 526

Page 343: JAVA - Apostila.pdf

POO – Exceção

Propagação de Exceção – Exemplo 01

1 public s t a t i c Date str ingToDate ( S t r i ng sd ) {DateFormat dateFormat = new SimpleDateFormat ( "dd/MM/yyyy " ) ;

3 dateFormat . setLenient ( fa l se ) ;t r y {

5 return dateFormat . parse ( sd ) ;} catch ( ParseException e) {

7 re turn new Date ( ) ; /∗ caso erro , retorne " agora " ∗/}

9 }

Think about...Exceção ativada caso o string da data seja inválido

Logo, todas as invocações a esse método com um stringinválido terá a data atual como seu retorno

Mas, se quiséssemos deixar essa decisão para quemchamou?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 338 / 526

Page 344: JAVA - Apostila.pdf

POO – Exceção

Propagação de Exceção – Exemplo 01 – Solução

public s t a t i c Date str ingToDate ( S t r i ng sd ) throws ParseException {2 DateFormat dateFormat = new SimpleDateFormat ( "dd/MM/yyyy " ) ;

dateFormat . setLenient ( fa l se ) ;4 return dateFormat . parse ( sd ) ;

}

Então a solução é – caso a exceção seja ativada –progagá-la ao método chamador e não tratá-la

Observe que não mais a trata, mas sim, delega!

Desse modo, cada chamada a esse método terá seupróprio tratamento, pois assim foi delegado a ele

Ricardo Terra ([email protected]) POO 8 de julho de 2011 339 / 526

Page 345: JAVA - Apostila.pdf

POO – Exceção

Propagação de Exceção – Exemplo 01 Completo

1 public s t a t i c void main( S t r i ng [ ] args ) {S t r i ng sd = Teclado . l e r S t r i n g ( " Dig i te seu aniversar io " ) ;

3 t r y {Date d = str ingToDate ( sd ) ;

5 System . out . p r i n t f ( "Voce tem %d anos " ,( System . cu r ren t T imeMi l l i s ( ) − d. getTime ( ) ) /31536000000L ) ;

7 } catch ( ParseException e) {System . out . p r i n t l n ( "Data inval ida . Tente novamente . " ) ;

9 }}

11

public s t a t i c Date str ingToDate ( S t r i ng sd ) throws ParseException {13 DateFormat dateFormat = new SimpleDateFormat ( "dd/MM/yyyy " ) ;

dateFormat . setLenient ( fa l se ) ;15 return dateFormat . parse ( sd ) ;

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 340 / 526

Page 346: JAVA - Apostila.pdf

POO – Exceção

Propagação de Exceção – Exemplo 02a

public s t a t i c void main( S t r i ng args [ ] ) {t r y {

a ( ) ; b ( ) ; c ( ) ; d ( ) ;} catch ( E1 e) {

e ( ) ; f ( ) ;} catch ( E2 e) {

g ( ) ; h ( ) ;}

m( ) ; n ( ) ;}

public s t a t i c void b ( ) throws E1 {x ( ) ; y ( ) ; z ( ) ;

}

Pergunta-se: Quais métodos serão executados caso ative...1 exceção E1 no método y?2 exceção E2 no método z?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 341 / 526

Page 347: JAVA - Apostila.pdf

POO – Exceção

Propagação de Exceção – Exemplo 02b

public s t a t i c void main( S t r i ng args [ ] ) {t r y {

a ( ) ; b ( ) ; c ( ) ; d ( ) ;} catch ( E1 e) {

e ( ) ; f ( ) ;} catch ( E2 e) {

g ( ) ; h ( ) ;}

m( ) ; n ( ) ;}

public s t a t i c void b ( ) throws E1 {x ( ) ; y ( ) ; z ( ) ;

}

Pergunta-se

Quais métodos serão executados caso uma RuntimeExceptionseja ativada no método x?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 342 / 526

Page 348: JAVA - Apostila.pdf

POO – Exceção

Propagação de Exceção – Exemplo 03

public s t a t i c void main( S t r i ng args [ ] ) throws E3 {t r y {

a ( ) ; b ( ) ; c ( ) ; d ( ) ;} catch ( E1 e) {

e ( ) ; f ( ) ;}

m( ) ; n ( ) ;}

public s t a t i c void b ( ) throws E1 , E3 {x ( ) ; y ( ) ;t r y {

z ( ) ;} catch ( E2 e) {

g ( ) ; h ( ) ;}

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 343 / 526

Pergunta-se: Quais métodosserão executados caso ative...

exceção E3 no método y?

exceção E2 no método z?

Page 349: JAVA - Apostila.pdf

POO – Exceção

Verdades cruéisE se propagarmos todas as exceções em todos osmétodos?

Nesse caso, a exceção vai chegar para a JVM tratarNão creio que seja uma boa ideia (ela derruba a aplicação)

Porque que não precisa tratar exceções do tipoRuntimeException?

Simplesmente porque implicitamente todos os métodos jápropagam exceções deste tipo

Por exemplo, a declaração dos dois métodos abaixo éidêntica:

private void f ( )private void f ( ) throws RuntimeException

Ricardo Terra ([email protected]) POO 8 de julho de 2011 344 / 526

Page 350: JAVA - Apostila.pdf

POO – Exceção

Criação de Exceção

Uma exceção é nada mais que uma classe que estendejava.lang.Exception

normalmente sobrescreve o método getMessage

Logo, você pode criar sua própria classe de exceção comatributos, métodos, construtores como uma classe normal

Quando você cria uma exceção, o método que poderáativá-la deve propagar tal exceção

Ativando Exceções

Basta colocar throw antes do objeto de exceção a serativado

Por exemplo:

throw new E1( x, y );

Ricardo Terra ([email protected]) POO 8 de julho de 2011 345 / 526

Page 351: JAVA - Apostila.pdf

POO – Exceção

Criação de Exceção – Exemplo Ilustrativo

Para ilustrar a criação de uma exceção, será alterado ométodo retirar da classe Conta

Esse método não mais retornará boolean, mas sim void

E, caso o saldo seja insuficiente, será ativada uma exceçãodo tipo SemSaldoException

Passos1 Criar a exceção SemSaldoException

2 Alterar o método retirar

3 Ajustar o sistema devido a nova forma de uso do método

Ricardo Terra ([email protected]) POO 8 de julho de 2011 346 / 526

Page 352: JAVA - Apostila.pdf

POO – Exceção

Criação de Exceção – Exemplo Ilustrativo – Passo 1

public class SemSaldoException extends Exception {2 private double saldo ;

private double valor ;4

public SemSaldoException (double saldo , double valor ) {6 t h i s . saldo = saldo ;

t h i s . valor = valor ;8 }

10 @Overridepublic S t r i ng getMessage ( ) {

12 re turn "Nao f o i poss ive l r e t i r a r R$ " + t h i s . valor+ " , pois o saldo e de R$ " + t h i s . saldo

14 + " . Em outras palavras , fa l tou R$ " + ( valor − saldo ) ;}

16 }

ImportanteEstende Exception e não Throwable, por que?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 347 / 526

Page 353: JAVA - Apostila.pdf

POO – Exceção

Criação de Exceção – Exemplo Ilustrativo – Passo 2

public class Conta {2 . . .

public void r e t i r a r ( double valor ) throws SemSaldoException {4 i f ( valor <= t h i s . saldo ) {

t h i s . saldo −= valor ;6 } else {

throw new SemSaldoException ( t h i s . saldo , valor ) ;8 }

}10 . . .

}

Observações

O método retirar agora propaga (throws) a exceção!

Em uma situação específica, o método ativa (throw) aexceção!

Ricardo Terra ([email protected]) POO 8 de julho de 2011 348 / 526

Page 354: JAVA - Apostila.pdf

POO – Exceção

Criação de Exceção – Exemplo Ilustrativo – Passo 3

public s t a t i c void main( S t r i ng [ ] args ) {2 Conta c = new Conta ( new Corrent i s ta ( 111 , " Fred " ) , 25.0 ) ;

. . .4 t r y {

c . r e t i r a r ( 20 ) ;6 } catch ( SemSaldoException e) {

System . out . p r i n t l n ( e . getMessage ( ) ) ;8 }

10 t r y {c . r e t i r a r ( 10 ) ;

12 } catch ( SemSaldoException e) {System . out . p r i n t l n ( e . getMessage ( ) ) ;

14 }. . .

16 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 349 / 526

OK!

Exceção Ativada!

Nao foi possivel retirar R$10.0, pois o saldo e de R$5.0.Em outras palavras, faltou R$5.0

Page 355: JAVA - Apostila.pdf

POO – Exceção

Para concluir esta seção

Eu entendi que exceções do tipo RuntimeException nãoprecisam ser tratadas e entendi também o throws implícito,mas porque Java não quer que tratemos tais exceções?

Simplesmente, porque são muito fáceis de evitar. Em outraspalavras, se ocorrer com regularidade tais exceções emseu sistema, você é um péssimo programador

Nos próximos slides veremos algumas exceções nãoverificáveis e boas práticas para evitá-las

Ricardo Terra ([email protected]) POO 8 de julho de 2011 350 / 526

Page 356: JAVA - Apostila.pdf

POO – Exceção

ArithmeticException – NUNCA!

. . .t r y {

c = a / b;} catch ( ArithmeticException e) {

. . .}. . .

ArithmeticException – SEMPRE!

. . .i f ( b != 0 ) {

c = a / b;}. . .

Ricardo Terra ([email protected]) POO 8 de julho de 2011 351 / 526

Page 357: JAVA - Apostila.pdf

POO – Exceção

NullPointerException – NUNCA!

. . .f o r ( Conta c : contas ) {

t r y {System . out . p r i n t l n (c . getNumero ( ) ) ;

} catch ( NullPointerException e) {. . .

}}. . .

NullPointerException – SEMPRE!

. . .f o r ( Conta c : contas ) {

i f ( c != n u l l ) {System . out . p r i n t l n (c . getNumero ( ) ) ;

}}. . .

Ricardo Terra ([email protected]) POO 8 de julho de 2011 352 / 526

Page 358: JAVA - Apostila.pdf

POO – Exceção

ArrayIndexOutOfBoundsException – NUNCA!

. . .t r y {

v [ i ] = 50;} catch ( ArrayIndexOutOfBoundsException e) {

. . .}. . .

ArrayIndexOutOfBoundsException – SEMPRE!

. . .i f ( i < v . length ) {

v [ i ] = 50;}. . .

Ricardo Terra ([email protected]) POO 8 de julho de 2011 353 / 526

Page 359: JAVA - Apostila.pdf

POO – Exceção

Síntese da Seção

try: bloco protegido

catch: executado se ocorre uma exceção do tipo indicado

finally: sempre executado

throws: na assinatura do método, indicando que elepropaga tal exceção

throw: ativa uma exceção

Ricardo Terra ([email protected]) POO 8 de julho de 2011 354 / 526

Page 360: JAVA - Apostila.pdf

Conteúdo

1 Introdução

2 UML

3 Java

4 POO

5 Padrões de ProjetoSingletonDecoratorAbstract Factory

6 Tópicos Relevantes

7 Materiais Complementares

8 Extras

Ricardo Terra ([email protected]) POO 8 de julho de 2011 355 / 526

Page 361: JAVA - Apostila.pdf

Padrões de Projeto

Padrão de Projeto

É uma solução para um problema recorrente nodesenvolvimento de sistemas. Consiste em uma descriçãoou modelo de como resolver um problema. Normalmente,mostra relacionamentos e interações entre classes e objetos

Exemplo: Singleton, Decorator, Abstract Factory etc

Nessa disciplina, veremos alguns mais utilizados e relevantesà disciplina

Ricardo Terra ([email protected]) POO 8 de julho de 2011 356 / 526

Page 362: JAVA - Apostila.pdf

Padrões de Projeto

Singleton

Ricardo Terra ([email protected]) POO 8 de julho de 2011 357 / 526

Page 363: JAVA - Apostila.pdf

Padrões de Projeto – Singleton

Singleton

É um padrão de criação que faz com que uma classetenha uma única instância

Para isso:Construtor privado

Assim, somente a própria classe pode criar seus objetos

Um atributo privado e estático chamado instance do tipoda classe

Método sincronizado e estático chamado getInstance queretorna a única instância

Ricardo Terra ([email protected]) POO 8 de julho de 2011 358 / 526

Page 364: JAVA - Apostila.pdf

Padrões de Projeto – Singleton

Singleton – Exemplo

1 public class Singleton {private s t a t i c Singleton instance = n u l l ;

3

private Singleton ( ) {5 }

7 public synchronized s t a t i c Singleton getInstance ( ) {i f ( instance == n u l l ) {

9 instance = new Singleton ( ) ;}

11 re turn instance ;}

13 }

Assim...Para obter o objeto da classe, basta:Singleton s = Singleton.getInstance();

Ricardo Terra ([email protected]) POO 8 de julho de 2011 359 / 526

Page 365: JAVA - Apostila.pdf

Padrões de Projeto

Decorator

Ricardo Terra ([email protected]) POO 8 de julho de 2011 360 / 526

Page 366: JAVA - Apostila.pdf

Padrões de Projeto – Decorator

Decorator

É um padrão estrutural que permite – dinamicamente –agregar responsabilidades adicionais a um objeto

É uma alternativa flexível ao uso de subclasses paraextensão de funcionalidades

Largamente utilizado na API de manipulação de arquivosem Java (veja p. 386)

Ricardo Terra ([email protected]) POO 8 de julho de 2011 361 / 526

Page 367: JAVA - Apostila.pdf

Padrões de Projeto – Decorator

Estrutura

Ricardo Terra ([email protected]) POO 8 de julho de 2011 362 / 526

Page 368: JAVA - Apostila.pdf

Padrões de Projeto – Decorator

ExemploSuponha que você tenha um texto a ser renderizado e quealgumas você você deseja que:

seja exibido normalmente

seja exibido em negrito

seja exibido com um link

seja exibido em negrito como um link

Esse é nosso problema exemplo e a solução é uso dopadrão Decorator

Ricardo Terra ([email protected]) POO 8 de julho de 2011 363 / 526

Page 369: JAVA - Apostila.pdf

Padrões de Projeto – Decorator

Exemplo – Diagrama de Classes

Ricardo Terra ([email protected]) POO 8 de julho de 2011 364 / 526

Page 370: JAVA - Apostila.pdf

Padrões de Projeto – Decorator

Exemplo – Interface Text

1 public inter face Text {public S t r i ng getRenderization ( ) ; /∗ obtem o codigo HTML ∗/

3 }

Exemplo – Implementação Simples – PlainText

public class P la inText implements Text {2 private S t r i ng text ;

4 public P la inText ( S t r i ng text ) {t h i s . text = text ;

6 }

8 @Overridepublic S t r i ng getRenderization ( ) {

10 re turn t h i s . text ;}

12 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 365 / 526

Page 371: JAVA - Apostila.pdf

Padrões de Projeto – Decorator

Exemplo – Decorator Abstrato TextDecorator

1 public abstract class TextDecorator implements Text {protected Text decoratedText ; /∗ texto a decorar ∗/

3

public TextDecorator ( Text decoratedText ) {5 t h i s . decoratedText = decoratedText ;

}7

@Override9 public S t r i ng getRenderization ( ) {

re turn decoratedText . getRenderization ( ) ;11 }

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 366 / 526

Page 372: JAVA - Apostila.pdf

Padrões de Projeto – Decorator

Exemplo – Decorator Concreto BoldTextDecorator

public class BoldTextDecorator extends TextDecorator {2

public BoldTextDecorator ( Text decoratedText ) {4 super ( decoratedText ) ;

}6

@Override8 public S t r i ng getRenderization ( ) {

re turn " <b> " + decoratedText . getRenderization ( ) + " </b> " ;10 }

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 367 / 526

Page 373: JAVA - Apostila.pdf

Padrões de Projeto – Decorator

Exemplo – Decorator Concreto LinkTextDecorator

public class LinkTextDecorator extends TextDecorator {2 private S t r i ng l i n k ;

4 public LinkTextDecorator ( Text decoratedText , S t r i ng l i n k ) {super ( decoratedText ) ;

6 t h i s . l i n k = l i n k ;}

8

@Override10 public S t r i ng getRenderization ( ) {

re turn " <a href =\" " + t h i s . l i n k + " \"> "12 + decoratedText . getRenderization ( ) + " </a> " ;

}14 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 368 / 526

Page 374: JAVA - Apostila.pdf

Padrões de Projeto – Decorator

Exemplo – Uso 1 (simples)

public s t a t i c void main( S t r i ng [ ] args ) {Text texto = new PlainText ( " Ricardo Terra " ) ;System . out . p r i n t l n ( texto . getRenderization ( ) ) ;

}

SaídaRicardo Terra

Ricardo Terra ([email protected]) POO 8 de julho de 2011 369 / 526

Page 375: JAVA - Apostila.pdf

Padrões de Projeto – Decorator

Exemplo – Uso 2 (negrito)

public s t a t i c void main( S t r i ng [ ] args ) {Text texto = new BoldTextDecorator (

new PlainText ( " Ricardo Terra " ) ) ;System . out . p r i n t l n ( texto . getRenderization ( ) ) ;

}

Saída<b>Ricardo Terra</b>

Ricardo Terra ([email protected]) POO 8 de julho de 2011 370 / 526

Page 376: JAVA - Apostila.pdf

Padrões de Projeto – Decorator

Exemplo – Uso 3 (link)

public s t a t i c void main( S t r i ng [ ] args ) {Text texto = new LinkTextDecorator (

new PlainText ( " Ricardo Terra " ) ," http : / /www. r icardoter ra .com. br " ) ;

System . out . p r i n t l n ( texto . getRenderization ( ) ) ;}

Saída<a href="http://www.ricardoterra.com.br">RicardoTerra</a>

Ricardo Terra ([email protected]) POO 8 de julho de 2011 371 / 526

Page 377: JAVA - Apostila.pdf

Padrões de Projeto – Decorator

Exemplo – Uso 4 (link em negrito)

public s t a t i c void main( S t r i ng [ ] args ) {Text texto = new LinkTextDecorator (

new PlainText ( " Ricardo Terra " ) ," http : / /www. r icardoter ra .com. br " ) ;

System . out . p r i n t l n ( texto . getRenderization ( ) ) ;}

Saída<a href="http://www.ricardoterra.com.br"><b>RicardoTerra</b></a>

Ricardo Terra ([email protected]) POO 8 de julho de 2011 372 / 526

Page 378: JAVA - Apostila.pdf

Padrões de Projeto

Abstract Factory

Ricardo Terra ([email protected]) POO 8 de julho de 2011 373 / 526

Page 379: JAVA - Apostila.pdf

Padrões de Projeto – Abstract Factory

Abstract Factory

É um padrão de criação que fornece uma forma decriação de família de objetos relacionados oudependentes sem especificar suas classes concretas

Assim, os clientes não se acoplam às implementações(classes concretas), mas sim, apenas às interfaces

Isso vai a favor do princípio de programação conhecidocomo Programação por Interface

Ricardo Terra ([email protected]) POO 8 de julho de 2011 374 / 526

Page 380: JAVA - Apostila.pdf

Padrões de Projeto – Abstract Factory

Estrutura

Ricardo Terra ([email protected]) POO 8 de julho de 2011 375 / 526

Page 381: JAVA - Apostila.pdf

Padrões de Projeto – Abstract Factory

Estrutura – Explicação Básica

Na necessidade de um Button, a aplicação busca arespectiva fábrica

Assim, é retornada um WinFactory ou um OSXFactory

A aplicação não sabe qual fábrica foi retornada, mas,independente de qual fábrica, ela é capaz de criar Button

Devido ao contrato estabelecido pela interface

E assim criará e manipulará botões como Button, isto é,sem saber qual classe concreta realmente estámanipulando

Mais uma vez: Programação por Interfaces

Ricardo Terra ([email protected]) POO 8 de julho de 2011 376 / 526

Page 382: JAVA - Apostila.pdf

Padrões de Projeto – Abstract Factory

ExemploSuponha que você tenha um sistema queautomaticamente antes das 12h a interface do sistema sejagráfica e, após esse horário, a interface seja textual

Esse é nosso problema exemplo e a solução é uso dopadrão Abstract Factory

Isto é, teremos duas fábricas: textual e gráfica

Ricardo Terra ([email protected]) POO 8 de julho de 2011 377 / 526

Page 383: JAVA - Apostila.pdf

Padrões de Projeto – Abstract Factory

Exemplo – Diagrama de Classes

Ricardo Terra ([email protected]) POO 8 de julho de 2011 378 / 526

Page 384: JAVA - Apostila.pdf

Padrões de Projeto – Abstract Factory

Exemplo – Interface Input (alunos devem fazer)

public inter face Input {2 S t r i ng l e r ( ) ;

}

Exemplo – Interface Output

1 public inter face Output {void escrever ( S t r i ng s ) ;

3 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 379 / 526

Page 385: JAVA - Apostila.pdf

Padrões de Projeto – Abstract Factory

Exemplo – Implementação Saída Textual – TextualOutput

1 public class TextualOutput implements Output {

3 @Overridepublic void escrever ( S t r i ng s ) {

5 System . out . p r i n t ( s ) ;}

7 }

Exemplo – Implementação Saída Gráfica – GraphicalOutput

1 public class GraphicalOutput implements Output {

3 @Overridepublic void escrever ( S t r i ng s ) {

5 JOptionPane . showMessageDialog( nul l , s ) ;}

7 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 380 / 526

Page 386: JAVA - Apostila.pdf

Padrões de Projeto – Abstract Factory

Exemplo – Fábrica Abstrata – IOFactory

1 public abstract class IOFactory {

3 public f i n a l s t a t i c IOFactory getIOFactory ( ) {i f (Calendar . getInstance ( ) . get (Calendar .HOUR_OF_DAY) >= 11) {

5 return new TextualFactory ( ) ;} else {

7 return new GraphicalFactory ( ) ;}

9 }

11 public abstract Input getInput ( ) ;

13 public abstract Output getOutput ( ) ;}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 381 / 526

Page 387: JAVA - Apostila.pdf

Padrões de Projeto – Abstract Factory

Exemplo – Fábrica Concreta – TextualFactory

public class TextualFactory extends IOFactory {2

@Override4 public Input getInput ( ) {

return new TextualInput ( ) ;6 }

8 @Overridepublic Output getOutput ( ) {

10 re turn new TextualOutput ( ) ;}

12

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 382 / 526

Page 388: JAVA - Apostila.pdf

Padrões de Projeto – Abstract Factory

Exemplo – Fábrica Concreta – GraphicalFactory

1 public class GraphicalFactory extends IOFactory {

3 @Overridepublic Input getInput ( ) {

5 return new GraphicalInput ( ) ;}

7

@Override9 public Output getOutput ( ) {

return new GraphicalOutput ( ) ;11 }

13 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 383 / 526

Page 389: JAVA - Apostila.pdf

Padrões de Projeto – Abstract Factory

Exemplo – Uso

public s t a t i c void main( S t r i ng [ ] args ) {Output out = IOFactory . getIOFactory ( ) . getOutput ( ) ;out . escrever ( " Abstract Factory por Ricardo Terra " ) ;

}

Saída

11:10 12:20

Ricardo Terra ([email protected]) POO 8 de julho de 2011 384 / 526

Page 390: JAVA - Apostila.pdf

Conteúdo

1 Introdução

2 UML

3 Java

4 POO

5 Padrões de Projeto

6 Tópicos RelevantesStreams

7 Materiais Complementares

8 Extras

Ricardo Terra ([email protected]) POO 8 de julho de 2011 385 / 526

Page 391: JAVA - Apostila.pdf

Tópicos Relevantes

Streams

Ricardo Terra ([email protected]) POO 8 de julho de 2011 386 / 526

Page 392: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

Objetivos desta seção

Manipulação de arquivos texto e binário

Serialização de objetos Java

Ricardo Terra ([email protected]) POO 8 de julho de 2011 387 / 526

Page 393: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

Classe java.io.File

Classe responsável em realizar métodos em arquivos físicos.Para se construir um objeto do tipo File, deve saber onome completo do arquivo. Caso o arquivo esteja na raizdo workspace do Eclipse pode apenas passar o nome doarquivo

Caso se passe o nome de um arquivo que não existe, este écriado na primeira necessidade

Exemplo:new F i l e ( "C:\\pasta\\meuArquivo . t x t " )new F i l e ( "meuArquivoNoWorkspace . t x t " )new F i l e ( " /dev/etc/xpto . t x t " )new F i l e ( " / bin " )

Ricardo Terra ([email protected]) POO 8 de julho de 2011 388 / 526

Page 394: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

Alguns métodos relevantes

boolean canRead ( ) /∗ Permissão de Lei tu ra? ∗/2

boolean canWrite ( ) /∗ Permissão de Esc r i ta ? ∗/4

/∗ Reconhece o t ipo do arquivo ∗/6 boolean i s F i l e ( )

boolean isD i rectory ( )8

renameTo ( ) /∗ Renomeia o arquivo / d i r e t ó r i o ∗/10

mkdir ( ) /∗ Cria d i r e t ó r i o ∗/12

S t r i ng [ ] l i s t ( ) /∗ L i s t a o conteúdo do d i r e t ó r i o ∗/14

F i l e [ ] l i s t F i l e s ( ) /∗ L i s t a todos os arquivos do d i r e t ó r i o ∗/

Ricardo Terra ([email protected]) POO 8 de julho de 2011 389 / 526

Page 395: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

Exemplo java.io.File – Arquivo

1 F i l e f i l e T e x t o = new F i l e ( " arquivoTexto . t x t " ) ;System . out . p r i n t l n ( "Nome do arquivo : " + f i l e T e x t o .getName( ) ) ;

3 System . out . p r i n t l n ( "O arquivo ex i s te? " + f i l e T e x t o . ex i s t s ( ) ) ;System . out . p r i n t l n ( " E um d i r e t o r i o ? " + f i l e T e x t o . i sD i rectory ( ) ) ;

5 i f ( f i l e T e x t o . i s F i l e ( ) ) {System . out . p r i n t l n ( " E um arquivo do d i r e t o r i o : "

7 + f i l e T e x t o . getAbsolutePath ( ) ) ;}

9 System . out . p r i n t l n ( " Posso l e r ? " + f i l e T e x t o .canRead ( ) ) ;System . out . p r i n t l n ( " Posso escrever? " + f i l e T e x t o . canWrite ( ) ) ;

11 System . out . p r i n t l n ( "Renomeou com sucesso? "+ f i l e T e x t o . renameTo( new F i l e ( " renomeado. t x t " ) ) ) ;

Nome do arquivo : arquivoTexto . t x tO arquivo ex i s te? t rueÉ um d i r e t ó r i o ? fa l seÉ um arquivo do d i r e t ó r i o : / Terra / apostilaJava / arquivoTexto . t x tPosso l e r ? t ruePosso escrever? fa l seRenomeou com sucesso? t rue

Ricardo Terra ([email protected]) POO 8 de julho de 2011 390 / 526

Page 396: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

Exemplo java.io.File – Diretório

1 F i l e f i l e D i r e t o r i o = new F i l e ( " streams " ) ;System . out . p r i n t l n ( "Nome do arquivo : " + f i l e D i r e t o r i o .getName( ) ) ;

3 System . out . p r i n t l n ( " E um d i r e t o r i o ? " + f i l e D i r e t o r i o . i sD i rectory ( ) ) ;

5 F i l e [ ] f i l e s = f i l e D i r e t o r i o . l i s t F i l e s ( ) ;System . out . p r i n t l n ( "Conteudo do d i r e t o r i o : " ) ;

7 f o r ( F i l e f : f i l e s ) {System . out . p r i n t l n ( " \ t " + f .getName ( ) ) ;

9 }

Nome do arquivo : streamsÉ um d i r e t ó r i o ? t rueConteúdo do d i r e t ó r i o :

ExemploDiretorio . classExemploDiretorio . javaExemploFile . classExemploFile . java

Ricardo Terra ([email protected]) POO 8 de julho de 2011 391 / 526

Page 397: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

Tipos principais de streamsTexto

Binário

Ricardo Terra ([email protected]) POO 8 de julho de 2011 392 / 526

Page 398: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

Reader

Suas subclasses efetuam leitura textual

Ricardo Terra ([email protected]) POO 8 de julho de 2011 393 / 526

Page 399: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

Exemplo Reader

1 t r y {F i l e f i l e = new F i l e ( " arquivoTexto . t x t " ) ;

3 Reader i n = new FileReader ( f i l e ) ;LineNumberReader reader = new LineNumberReader ( in ) ;

5 while ( reader . ready ( ) ) {System . out . p r i n t ( reader . getLineNumber ( ) + " : " ) ;

7 System . out . p r i n t l n ( reader . readLine ( ) ) ;}

9 reader . close ( ) ;in . close ( ) ;

11 } catch ( FileNotFoundException e) {System . out . p r i n t l n ( " Arq . nao ex i s te . Causa : " + e . getMessage ( ) ) ;

13 } catch ( IOException e) {System . out . p r i n t l n ( " E r ro de E/S . Causa : " + e . getMessage ( ) ) ;

15 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 394 / 526

Page 400: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

Writer

Suas subclasses efetuam escrita textual

Ricardo Terra ([email protected]) POO 8 de julho de 2011 395 / 526

Page 401: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

Exemplo Writer

1 t r y {F i l e f i l e = new F i l e ( " arquivoGravado . t x t " ) ;

3 F i l e W r i t e r out = new F i l e W r i t e r ( f i l e ) ;out . wri te ( " Linguagem Java\n " ) ;

5

P r i n t W r i t e r w r i t e r = new P r i n t W r i t e r ( out ) ;7 w r i t e r . p r i n t l n ( "Aprendendo Streams " ) ;

w r i t e r . p r i n t l n ( " P rofessor Ricardo Terra " ) ;9

w r i t e r . close ( ) ;11 out . close ( ) ;

} catch ( IOException e) {13 System . out . p r i n t l n ( " E r ro de E/S . Causa : " + e . getMessage ( ) ) ;

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 396 / 526

Page 402: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

Um exemplo com Reader

A maioria das vezes quando lemos um arquivo em disco éporque queremos extrair informações dele para seremutilizadas pelo aplicativo

Vamos, por exemplo, considerar um arquivo texto em que:

na 1a linha existe números separados por tabulação (‘\t’)

2 4 6 8 10

O programa deverá ler esses números, guardar em umarranjo e depois imprimir a soma deles

No próximo slide demonstra como deve ser feito

Ricardo Terra ([email protected]) POO 8 de julho de 2011 397 / 526

Page 403: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

Exemplo Completo Reader

1 t r y {F i l e f i l e = new F i l e ( " entrada . t x t " ) ;

3 Reader i n = new FileReader ( f i l e ) ;LineNumberReader reader = new LineNumberReader ( in ) ;

5

i f ( reader . ready ( ) ) {7 S t r i ng [ ] numeros = reader . readLine ( ) . s p l i t ( " \ t " ) ;

i n t [ ] array = new i n t [numeros . length ] ;9 f o r ( i n t i = 0 ; i < numeros . length ; i ++ ) {

array [ i ] = Integer . parseInt ( numeros [ i ] ) ;11 }

i n t soma = 0;13 f o r ( i n t numero : array ) {

soma += numero ;15 }

System . out . p r i n t l n ( "Soma: " + soma ) ;17 }

19 reader . close ( ) ;in . close ( ) ;

21 } catch . . .

Ricardo Terra ([email protected]) POO 8 de julho de 2011 398 / 526

Page 404: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

InputStream

Suas subclasses efetuam leitura binária

Ricardo Terra ([email protected]) POO 8 de julho de 2011 399 / 526

Page 405: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

Exemplo InputStream

t r y {2 f i n a l S t r i ng zeros = " 00000000 " ;

F i l e f i l e = new F i l e ( " s ta r . g i f " ) ;4 InputStream i n = new FileInputStream ( f i l e ) ;

i n t i = 0 ;6 while ( ( i = in . read ( ) ) != −1 ) {

S t r i ng s t r = Integer . toB inaryS t r ing ( i ) ;8 System . out . p r i n t ( zeros . subst r ing ( s t r . length ( ) ) + s t r ) ;

}10 i n . close ( ) ;

} catch ( FileNotFoundException e) {12 System . out . p r i n t l n ( " Arq . nao ex i s te . Causa : " + e . getMessage ( ) ) ;

} catch ( IOException e) {14 System . out . p r i n t l n ( " E r ro de E/S . Causa : " + e . getMessage ( ) ) ;

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 400 / 526

Page 406: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

OutputStream

Suas subclasses efetuam escrita binária

Ricardo Terra ([email protected]) POO 8 de julho de 2011 401 / 526

Page 407: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

Exemplo OutputStream

t r y {2 F i l e f i l e = new F i l e ( " arquivoGravado . bin " ) ;

/∗ Se fo r passado true , o arquivo sera concatenado ∗/4 OutputStream out = new FileOutputStream ( f i l e , fa l se ) ;

out . wri te ( 65 ) ;6 out . wri te ( 66 ) ;

out . wri te ( 67 ) ;8 out . close ( ) ;

} catch ( IOException e) {10 System . out . p r i n t l n ( " E r ro de E/S . Causa : " + e . getMessage ( ) ) ;

}

O que foi gravado?01000001 01000010 01000011

Ricardo Terra ([email protected]) POO 8 de julho de 2011 402 / 526

Page 408: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

Lendo e escrevendo objetos – ObjectStream

É possível escrever dados binários em um arquivo e depoislê-los

Para isso, utilizamos as classes ObjectInputStream eObjectOutputStream

Para um objeto ser gravado em um arquivo, ele deveráimplementar java.io.Serializable

Essa interface não tem nenhum método. É só para que Javasaiba que essa classe será persistida

Os tipos primitivos podem ser gravados também semproblema algum

Vejamos alguns exemplos nos próximos slides

Ricardo Terra ([email protected]) POO 8 de julho de 2011 403 / 526

Page 409: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

Exemplo ObjectOutputStream

t r y {2 F i l e f i l e = new F i l e ( "dados . bin " ) ;

ObjectOutput out = new ObjectOutputStream (4 new FileOutputStream ( f i l e ) ) ;

6 out . w r i t e I n t ( 65 ) ;out . writeDouble ( 66.9 ) ;

8 out . writeChar ( ’C’ ) ;

10 out . close ( ) ;} catch ( FileNotFoundException e) {

12 System . out . p r i n t l n ( " Arq . nao ex i s te . Causa : " + e . getMessage ( ) ) ;} catch ( IOException e) {

14 System . out . p r i n t l n ( " E r ro de E/S . Causa : " + e . getMessage ( ) ) ;}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 404 / 526

Page 410: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

Exemplo ObjectInputStream

1 t r y {F i l e f i l e = new F i l e ( "dados . bin " ) ;

3 ObjectInput i n = new ObjectInputStream (new FileInputStream ( f i l e ) ) ;

5

i n t i = in . readInt ( ) ;7 double d = in . readDouble ( ) ;

char c = in . readChar ( ) ;9

/∗11 ∗ Se fosse a l e i t u r a fosse em ordem diferente ,

∗ os resultados seriam diferentes13 ∗/

System . out . p r i n t f ( "%d %.2 f %c" , i , d, c ) ;15

i n . close ( ) ;17 } catch ( FileNotFoundException e) {

System . out . p r i n t l n ( " Arq . nao ex i s te . Causa : " + e . getMessage ( ) ) ;19 } catch ( IOException e) {

System . out . p r i n t l n ( " E r ro de E/S . Causa : " + e . getMessage ( ) ) ;21 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 405 / 526

Page 411: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

Lendo e escrevendo objetos – ObjectStreamMas, o interessante é gravarmos um objeto de uma classe(que deve estender java.io.Serializable) e funcionado mesmo modo só que utilizará o método writeObject ereadObject

Além disso, perceberá que teremos que tratar mais umaexceção que possa vir a ocorrer:ClassNotFoundException

Pois, quando você ler o objeto de um arquivo, a classe desseobjeto pode não existir no seu projeto

Ricardo Terra ([email protected]) POO 8 de julho de 2011 406 / 526

Page 412: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

Suponha a classe Aluno

1 public class Aluno implements Ser ia l i zab le {private i n t matricula ;

3 private S t r i ng nome;private Date dataNascimento ;

5

public Aluno ( i n t matricula , S t r i ng nome, Date dataNascimento) {7 super ( ) ;

t h i s . matricula = matricula ;9 t h i s .nome = nome;

t h i s . dataNascimento = dataNascimento ;11 }

13 @Overridepublic S t r i ng toS t r ing ( ) {

15 re turn t h i s . matricula + " − " + t h i s .nome + " − "+ Conversor . dateToStr ing (

17 t h i s . dataNascimento , "dd/MM/yyyy " ) ;}

19

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 407 / 526

Page 413: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

Exemplo ObjectOutputStream com Aluno

1 t r y {F i l e f i l e = new F i l e ( " aluno . bin " ) ;

3 ObjectOutput out = new ObjectOutputStream (new FileOutputStream ( f i l e ) ) ;

5

Aluno a = new Aluno ( 1 , " Carlos Eduardo da S i l v a " , new Date ( 0 ) ) ;7 out . writeObject ( a ) ;

9 out . close ( ) ;} catch ( FileNotFoundException e) {

11 System . out . p r i n t l n ( " Arq . nao ex i s te . Causa : " + e . getMessage ( ) ) ;} catch ( IOException e) {

13 System . out . p r i n t l n ( " E r ro de E/S . Causa : " + e . getMessage ( ) ) ;}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 408 / 526

Page 414: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

Exemplo ObjectInputStream com Aluno

1 t r y {F i l e f i l e = new F i l e ( " aluno . bin " ) ;

3 ObjectInput i n = new ObjectInputStream (new FileInputStream ( f i l e ) ) ;

5

Aluno a = ( Aluno ) in . readObject ( ) ;7 System . out . p r i n t l n ( a ) ;

9 i n . close ( ) ;} catch ( ClassNotFoundException e) {

11 System . out . p r i n t l n ( " Classe nao ex i s te . Causa : " + e . getMessage ( ) ) ;} catch ( FileNotFoundException e) {

13 System . out . p r i n t l n ( " Arq . nao ex i s te . Causa : " + e . getMessage ( ) ) ;} catch ( IOException e) {

15 System . out . p r i n t l n ( " E r ro de E/S . Causa : " + e . getMessage ( ) ) ;}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 409 / 526

Page 415: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

Lendo e escrevendo objetos – ObjectStreamO exemplo anterior pode até ser interessante, mas umaluno por arquivo não é a melhor solução

Soluções:Você poderia inserir vários alunos e depois ir lendo até o finaldo arquivo

ou

Gravar uma coleção de alunos no arquivo

Ricardo Terra ([email protected]) POO 8 de julho de 2011 410 / 526

Page 416: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

Exemplo ObjectOutputStream com vários objetos Aluno

t r y {2 F i l e f i l e = new F i l e ( " alunos . bin " ) ;

FileOutputStream out = new FileOutputStream ( f i l e ) ;4 ObjectOutput objectOut = new ObjectOutputStream ( out ) ;

6 objectOut . writeObject ( new Aluno ( 1 , " Carlos " , new Date ( 0 ) ) ) ;objectOut . writeObject ( new Aluno ( 2 , " Maria " , new Date ( 0 ) ) ) ;

8 objectOut . writeObject ( new Aluno ( 3 , " Roberto " , new Date ( 0 ) ) ) ;

10 objectOut . close ( ) ;out . close ( ) ;

12 } catch ( IOException e) {System . out . p r i n t l n ( " E r ro de E/S . Causa : " + e . getMessage ( ) ) ;

14 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 411 / 526

Page 417: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

Exemplo ObjectInputStream com vários objetos Aluno

t r y {2 F i l e f i l e = new F i l e ( " alunos . bin " ) ;

Fi leInputStream i n = new FileInputStream ( f i l e ) ;4 ObjectInput objectIn = new ObjectInputStream ( in ) ;

6 while ( objectIn . available ( ) > 0 ) {Aluno a = ( Aluno ) objectIn . readObject ( ) ;

8 System . out . p r i n t l n ( a ) ;}

10

objectIn . close ( ) ;12 i n . close ( ) ;

} catch ( ClassNotFoundException e) {14 System . out . p r i n t l n ( " Classe nao ex i s te . " + e . getMessage ( ) ) ;

} catch ( FileNotFoundException e) {16 System . out . p r i n t l n ( " Arq . nao ex i s te . " + e . getMessage ( ) ) ;

} catch ( IOException e) {18 System . out . p r i n t l n ( " E r ro de E/S . Causa : " + e . getMessage ( ) ) ;

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 412 / 526

Page 418: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

Exemplo ObjectOutputStream com coleção de objetos Aluno

1 t r y {F i l e f i l e = new F i l e ( " aluno . bin " ) ;

3 ObjectOutput out = new ObjectOutputStream (new FileOutputStream ( f i l e ) ) ;

5

L i s t <Aluno> alunos = new Ar rayL i s t <Aluno > ( ) ;7 alunos .add( new Aluno ( 1 , " Carlos Eduardo " , new Date ( 0 ) ) ) ;

alunos .add( new Aluno ( 2 , " Maria Aparecida " , new Date ( ) ) ) ;9 alunos .add( new Aluno ( 3 , " Roberto Carlos " , new Date ( 0 ) ) ) ;

out . writeObject ( alunos ) ;11

out . close ( ) ;13 } catch ( FileNotFoundException e) {

System . out . p r i n t l n ( " Arq . nao ex i s te . Causa : " + e . getMessage ( ) ) ;15 } catch ( IOException e) {

System . out . p r i n t l n ( " E r ro de E/S . Causa : " + e . getMessage ( ) ) ;17 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 413 / 526

Page 419: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

Exemplo ObjectInputStream com coleção de objetos Aluno

t r y {2 F i l e f i l e = new F i l e ( " aluno . bin " ) ;

ObjectInput i n = new ObjectInputStream (4 new Fi leInputStream ( f i l e ) ) ;

6 L i s t <Aluno> alunos = ( L i s t <Aluno>) in . readObject ( ) ;f o r ( Aluno a : alunos ) {

8 System . out . p r i n t l n ( a ) ;}

10

i n . close ( ) ;12 } catch ( ClassNotFoundException e) {

System . out . p r i n t l n ( " Classe nao ex i s te . Causa : " + e . getMessage ( ) ) ;14 } catch ( FileNotFoundException e) {

System . out . p r i n t l n ( " Arq . nao ex i s te . Causa : " + e . getMessage ( ) ) ;16 } catch ( IOException e) {

System . out . p r i n t l n ( " E r ro de E/S . Causa : " + e . getMessage ( ) ) ;18 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 414 / 526

Page 420: JAVA - Apostila.pdf

Tópicos Relevantes – Streams

Lendo e escrevendo objetos – ObjectStream1 Copiar um arquivo texto para um outro arquivo utilizando

FileReader e FileWriter

2 Copiar uma arquivo binário (imagem, por exemplo) paraum outro arquivo utilizando InputStream e OutputStream

3 Ler um arquivo texto utilizando LineNumberReader e depoisgravá-lo ao inverso utilizando PrintWriter

Por exemplo, arquivo origem está escrito “ABCDE”, o dedestino estará escrito “EDCBA”Dica: Utilize o método inverse de um objeto da classeStringBuilder

Ricardo Terra ([email protected]) POO 8 de julho de 2011 415 / 526

Page 421: JAVA - Apostila.pdf

Conteúdo

1 Introdução

2 UML

3 Java

4 POO

5 Padrões de Projeto

6 Tópicos Relevantes

7 Materiais ComplementaresClasses WrapperClasse MathClasse String

Classe DateClasse StringBuilder e StringBuffer

Classe StringTokenizer

Classe IteratorColeções

8 ExtrasRicardo Terra ([email protected]) POO 8 de julho de 2011 416 / 526

Page 422: JAVA - Apostila.pdf

Materiais Complementares

Classes Wrapper

Ricardo Terra ([email protected]) POO 8 de julho de 2011 417 / 526

Page 423: JAVA - Apostila.pdf

Materiais Complementares – Classes Wrapper

Para cada tipo primitivo de Java existe uma classecorrespondente que basicamente armazena o tipoprimitivo e provê diversas operações comuns, por exemplo:

converter um string para o tipo em questão

obter sua representação binária

Essa classe é denominada classe Wrapper

com esse recurso, um arranjo de objetos pode conter “tiposprimitivos”

Ricardo Terra ([email protected]) POO 8 de julho de 2011 418 / 526

Page 424: JAVA - Apostila.pdf

Materiais Complementares – Classes Wrapper

Tipo Primitivo Classe Wrapperchar Characterbyte Byteshort Shortint Integerlong Longfloat Floatdouble Double

Resumo:Exatamente o nome do tipo primitivo iniciando com caixaalta, exceto: Character e Integer

Ricardo Terra ([email protected]) POO 8 de julho de 2011 419 / 526

Page 425: JAVA - Apostila.pdf

Materiais Complementares – Classes Wrapper

Convertendo um tipo primitivo para um objeto wrapperToda classe wrapper tem um construtor a partir de seu tipoprimitivo e de um string (exceto Character)

Exemplo:Integer i = new Integer ( 231 ) ;Integer i = new Integer ( " 231 " ) ;

Ricardo Terra ([email protected]) POO 8 de julho de 2011 420 / 526

Page 426: JAVA - Apostila.pdf

Materiais Complementares – Classes Wrapper

Convertendo um string para um tipo primitivo

Uma outra utilidade de uma classe wrapper é a deconverter um string para um tipo primitivo correspondente(exceto Character)

Exemplo:i n t i = Integer . parseInt ( " 231 " ) ;double d = Double . parseDouble ( " 231e−2" ) ;

Ricardo Terra ([email protected]) POO 8 de julho de 2011 421 / 526

Page 427: JAVA - Apostila.pdf

Materiais Complementares – Classes Wrapper

Autoboxing e unboxing

A partir do Java 5, a linguagem provê uma formaautomática de conversão de um tipo primitivo para o seuobjeto wrapper e vice-versa

Assim, essa tarefa é realizada de forma completamentetransparente, observe:

Integer i = 231;i n t j = new Integer ( 231 ) ;i n t h = i ;

Ricardo Terra ([email protected]) POO 8 de julho de 2011 422 / 526

Page 428: JAVA - Apostila.pdf

Materiais Complementares – Classes Wrapper – Character

Alguns métodos relevantes

public s t a t i c boolean i s D i g i t ( char ch ) ;2 public s t a t i c boolean i s L e t t e r ( char ch ) ;

public s t a t i c boolean isLowerCase ( char ch ) ;4 public s t a t i c boolean isUpperCase ( char ch ) ;

public s t a t i c char toLowerCase ( char ch ) ;6 public s t a t i c char toUpperCase ( char ch ) ;

Exemplo

char ch = ’a’ ;System . out . p r i n t l n ( Character . i s D i g i t ( ch ) ) ; /∗ fa l se ∗/System . out . p r i n t l n ( Character . i s L e t t e r ( ch ) ) ; /∗ t rue ∗/

i f ( Character . isLowerCase ( ch ) ) { /∗ t rue ∗/ch = Character . toUpperCase ( ch ) ;

}

System . out . p r i n t l n ( ch ) ;}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 423 / 526

Page 429: JAVA - Apostila.pdf

Materiais Complementares – Classes Wrapper – Integer

Alguns métodos relevantes

1 public s t a t i c S t r i ng toB inaryS t r ing ( i n t i ) ;public s t a t i c S t r i ng toHexStr ing ( i n t i ) ;

Exemplo

System . out . p r i n t l n ( Integer . toB inaryS t r ing ( i ) ) ; /∗ 11100111 ∗/System . out . p r i n t l n ( Integer . toHexStr ing ( i ) ) ; /∗ e7 ∗/

Ricardo Terra ([email protected]) POO 8 de julho de 2011 424 / 526

Page 430: JAVA - Apostila.pdf

Materiais Complementares – Classes Wrapper – Double

Alguns métodos relevantes

public boolean i s I n f i n i t e ( ) ;2 public s t a t i c boolean i s I n f i n i t e (double d ) ;

4 public boolean isNaN ( ) ;public s t a t i c boolean isNaN (double d ) ;

Exemplo

double d = 2.0 / 0 ;System . out . p r i n t l n ( Double . i s I n f i n i t e ( d ) ) ; /∗ t rue ∗/

d = 0.0 / 0 ;System . out . p r i n t l n ( Double . isNaN ( d ) ) ; /∗ t rue ∗/

Ricardo Terra ([email protected]) POO 8 de julho de 2011 425 / 526

Page 431: JAVA - Apostila.pdf

Materiais Complementares

Classe Math

Ricardo Terra ([email protected]) POO 8 de julho de 2011 426 / 526

Page 432: JAVA - Apostila.pdf

Materiais Complementares – Classe Math

Classe java.lang.Math

Existe uma classe na própria API Java que lida comatribuições matemáticas

Essa classe chama-se Math e está no pacote java.langÉ importante mencionar que classes no pacote java.langnão necessitam ser importadas

Math contém diversas operações e constantes largamenteutilizadas, como exponenciação, raiz quadrada, logaritmo,seno, coseno, tangente etc

No próximo slide veremos a utilização de algumas delas

Ricardo Terra ([email protected]) POO 8 de julho de 2011 427 / 526

Page 433: JAVA - Apostila.pdf

Materiais Complementares – Classe Math

Método sqrt

Retorna a raiz quadrada de um número, i.e.,√

n

Assinatura:public static double sqrt (double n)

Exemplo

double r a i z = Math . sq r t ( a ) ; /∗ Suponha a = 4 , logo . . . ∗/

Ricardo Terra ([email protected]) POO 8 de julho de 2011 428 / 526

Page 434: JAVA - Apostila.pdf

Materiais Complementares – Classe Math

Método pow

Retorna um número elevado a outro, i.e., ab

Assinatura:public static double pow (double a, double b)

Exemplo

double exp = Math .pow( b, 2 ) ; /∗ Suponha b = 3 , logo . . . ∗/

Ricardo Terra ([email protected]) POO 8 de julho de 2011 429 / 526

Page 435: JAVA - Apostila.pdf

Materiais Complementares – Classe Math

Constante PI

Além de operações, a classe Math possui uma série deconstantes, por exemplo, PI

Assinatura:public static final double PI = 3.141596...

Exemplo

private s t a t i c double area( double ra io ) {return Math . PI ∗ Math .pow( raio , 2 ) ;

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 430 / 526

Page 436: JAVA - Apostila.pdf

Materiais Complementares – Classe Math

Método abs

Retorna o valor absoluto

Assinatura:public static double abs (double a)

Exemplo

double absoluto = Math . abs ( −4.6 ) ;

Ricardo Terra ([email protected]) POO 8 de julho de 2011 431 / 526

Page 437: JAVA - Apostila.pdf

Materiais Complementares – Classe Math

Método ceil

Retorna o valor “arredondado para cima”

Assinatura:public static double ceil (double a)

Exemplo

double acima = Math . cei l ( 4.0001 ) ;

Ricardo Terra ([email protected]) POO 8 de julho de 2011 432 / 526

Page 438: JAVA - Apostila.pdf

Materiais Complementares – Classe Math

Método floor

Retorna o valor “arredondado para baixo”

Assinatura:public static double floor (double a)

Exemplo

double abaixo = Math . f l o o r ( 4.9999 ) ;

Ricardo Terra ([email protected]) POO 8 de julho de 2011 433 / 526

Page 439: JAVA - Apostila.pdf

Materiais Complementares – Classe Math

Método max

Retorna o maior valor entre dois números

Assinatura:public static double max (double a, double b)

Exemplo

double maior = Math .max( a, b ) ;

Ricardo Terra ([email protected]) POO 8 de julho de 2011 434 / 526

Page 440: JAVA - Apostila.pdf

Materiais Complementares – Classe Math

Método min

Retorna o menor valor entre dois números

Assinatura:public static double min (double a, double b)

Exemplo

double menor = Math . min ( a, b ) ;

Ricardo Terra ([email protected]) POO 8 de julho de 2011 435 / 526

Page 441: JAVA - Apostila.pdf

Materiais Complementares – Classe Math

Método round

Retorna o valor arredondadoSe < x .5→ x

Se ≥ x .5→ x + 1

Assinatura:public static long round (double a)

Exemplo

long arredondadoParaCima = Math . round ( 4.5 ) ;long arredondadoParaBaixo = Math . round ( 4.49999 ) ;

Ricardo Terra ([email protected]) POO 8 de julho de 2011 436 / 526

Page 442: JAVA - Apostila.pdf

Materiais Complementares – Classe Math

Método random

Retorna um valor aleatório n, onde 0.0 ≤ n < 1.0

Assinatura:public static double random ()

Exemplo

double aleator io = Math . random ( ) ;

Exemplo – Sorteio de um número

i n t num = Teclado . le r In teger ( " D ig i te o numero de concorrentes " ) ;

System . out . p r i n t f ( "O vencedor f o i %d" ,( i n t ) Math . cei l ( Math . random ( ) ∗ num ) ) ;

Ricardo Terra ([email protected]) POO 8 de julho de 2011 437 / 526

Page 443: JAVA - Apostila.pdf

Materiais Complementares – Classe Math

Método sin

Retorna o seno do valor passado (em radianos)

Assinatura:public static double sin (double a)

Exemplo

double seno = Math . s in ( Math . P I / 2 ) ; /∗ 1 , no caso ∗/

Outros métodosExistem também:

cos

tan

...

Ricardo Terra ([email protected]) POO 8 de julho de 2011 438 / 526

Page 444: JAVA - Apostila.pdf

Materiais Complementares

Classe String

Ricardo Terra ([email protected]) POO 8 de julho de 2011 439 / 526

Page 445: JAVA - Apostila.pdf

Materiais Complementares – Classe String

Em Java, String é uma classe

Logo, possui diversos métodos já implementados quefacilitam a tarefa de programar

Por exemplo, toUpperCase, toLowerCase, charAt etc

Um objeto do tipo String é imutávelIsto é, seus métodos nunca alteram o string, mas sim,retornam um novo objeto String

Quando você “altera” um string, na verdade, um novostring é criado e o coletor de lixo (Garbage Collector ouGC) fica responsável por liberar a área de mémória anterior

Ricardo Terra ([email protected]) POO 8 de julho de 2011 440 / 526

Page 446: JAVA - Apostila.pdf

Materiais Complementares – Classe String

Correto, mas não era a intenção

S t r i ng nome = " Ricardo " ;nome. toUpperCase ( ) ; /∗ O retorno f o i ignorado ∗/System . out . p r i n t l n ( nome ) ; /∗ Imprimira Ricardo ∗/

Correto

S t r i ng nome = " Ricardo " ;nome = nome. toUpperCase ( ) ; /∗ Atr ibu iu o retorno ao nome ∗/System . out . p r i n t l n ( nome ) ; /∗ Imprimira RICARDO ∗/

Ricardo Terra ([email protected]) POO 8 de julho de 2011 441 / 526

Page 447: JAVA - Apostila.pdf

Materiais Complementares – Classe String

Criando um stringInvocando algum construtor da classe String ou utilizandoa notação simplificada

Exemplo

S t r i ng capital = " Belo Horizonte " ;

ou

S t r i ng capital = new St r ing ( " Belo Horizonte " ) ;

Ricardo Terra ([email protected]) POO 8 de julho de 2011 442 / 526

Page 448: JAVA - Apostila.pdf

Materiais Complementares – Classe String

Comparando stringsMuitos fazem a comparação de strings utilizando ooperador ==, mas isso é completamente errado

A comparação com == com objetos, simplesmentecompara se eles estão na mesma área de memória

Em Java, a comparação com == entre strings até funcionadevido a um recurso chamado pool de literais, mas ainda éerrado!

Ricardo Terra ([email protected]) POO 8 de julho de 2011 443 / 526

Page 449: JAVA - Apostila.pdf

Materiais Complementares – Classe String

Pool de literaisInternamente, Java mantém um pool de literais string quesão utilizadas pela aplicação

Quando necessita-se criar um string, o compilador verificase tal string já existe no pool

Se não existir, cria-se o string e o adiciona no poolCaso exista, o compilador não cria o string, simplesmente usao existente

O uso do pool ajuda a economizar memória e só é possíveldevido a imutalidade de objetos da classe String

Ricardo Terra ([email protected]) POO 8 de julho de 2011 444 / 526

Page 450: JAVA - Apostila.pdf

Materiais Complementares – Classe String

Errado

S t r i ng s t r 1 = " Belo Horizonte " ;S t r i ng s t r 2 = " Belo Horizonte " ;

i f ( s t r 1 == s t r 2 ) { /∗ ERRADO. NUNCA FACA ISSO ! ∗/System . out . p r i n t l n ( " S t r i n g s sao iguai s " ) ;

}

Correto

S t r i ng s t r 1 = " Belo Horizonte " ;S t r i ng s t r 2 = " Belo Horizonte " ;

i f ( s t r 1 . equals ( s t r 2 ) ) {System . out . p r i n t l n ( " S t r i n g s sao iguai s " ) ;

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 445 / 526

Page 451: JAVA - Apostila.pdf

Materiais Complementares – Classe String

Comparação

A comparação de strings leva-se em conta a codificaçãoUnicode. O compilador ao testar se dois strings são iguais, éavaliado caractere por caractere, i.e., se o código Unicodede ambos coincide. Isso traz algumas implicações:

A comparação normal (com equals) de strings écase-sensitive:“Brasil” 6= “brasil”

A comparação de strings é accent-sensitive:“Paraná” 6= “Parana”

A comparação de strings diferencia símbolos com adornosdos sem adornos:“La niña” 6= “La nina”“Caçula” 6= “Cacula”

Ricardo Terra ([email protected]) POO 8 de julho de 2011 446 / 526

Page 452: JAVA - Apostila.pdf

Materiais Complementares – Classe String

Comparação

Como já citado, a comparação normal de strings érealizada por meio do método equals:

Exemplo

S t r i ng s t r 1 = " Belo Horizonte " ;S t r i ng s t r 2 = " Belo Horizonte " ;

i f ( s t r 1 . equals ( s t r 2 ) ) {System . out . p r i n t l n ( " S t r i n g s sao iguai s " ) ;

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 447 / 526

Page 453: JAVA - Apostila.pdf

Materiais Complementares – Classe String

Comparação

Contudo, existe um modo de comparar strings semsensibilidade de caixa, i.e., sem diferenciar letras em caixaalta e caixa baixa por meio do método equalsIgnoreCase

Exemplo

S t r i ng s t r 1 = " Belo Horizonte " ;S t r i ng s t r 2 = " bElO hOrIzOnTe " ;

i f ( s t r 1 . equalsIgnoreCase ( s t r 2 ) ) {System . out . p r i n t l n ( " S t r i n g s sao iguai s " ) ;

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 448 / 526

Page 454: JAVA - Apostila.pdf

Materiais Complementares – Classe String

Comparação

Existem outros métodos interessantes de comparação destrings. São eles:

startsWith: Verifica se um string inicia com um certo string

endsWith: Verifica se um string termina com um certo string

regionMatches: Verifica se um substring de um string contémum substring de um outro string (ideia complexa, mas útil)

compareTo: Verifica se um string é igual, maior ou menor queoutro string

Ricardo Terra ([email protected]) POO 8 de julho de 2011 449 / 526

Page 455: JAVA - Apostila.pdf

Materiais Complementares – Classe String

Exemplo

S t r i ng s t r = "O rato roeu a roupa do r e i de Roma" ;

System . out . p r i n t f ( "Comeca com \"O\"? %b\n " , s t r . s ta r t sW i th ( "O" ) ) ;

System . out . p r i n t f ( " Termina com \"Roma\"? %b\n " ,s t r . endsWith ( "Roma" ) ) ;

/∗Compara se ’ s t r ’ da posicao 2 a 5 e igual o s t r i n g " Jerry , o rato ! "da posicao 9 a 12∗/

System . out . p r i n t f ( "Verdade? %b\n " ,s t r . regionMatches ( 2 , " Jerry , o rato ! " , 9 , 4 ) ) ;

System . out . p r i n t l n ( "ABC" . compareTo( "ABC" ) ) ; /∗ 0 , sao iguai s ∗/System . out . p r i n t l n ( "ABC" . compareTo( "BCD" ) ) ; /∗ −1, "ABC" e menor ∗/System . out . p r i n t l n ( "BCD" . compareTo( "ABC" ) ) ; /∗ 1 , "BCD" e maior ∗/

Ricardo Terra ([email protected]) POO 8 de julho de 2011 450 / 526

Page 456: JAVA - Apostila.pdf

Materiais Complementares – Classe String

Extração de partes de um string

Existem dois métodos comuns para extrair partes de umstring:

substring: Extrai um substring a partir de uma posição comou sem limite superior (método sobrecarregado)

charAt: Extrai um caractere em uma determinada posição(observe que a contagem começa de 0)

Exemplo

S t r i ng s t r = " The quick brown fox jumps over the lazy dog" ;

System . out . p r i n t l n ( s t r . subst r ing ( 35 ) ) ; /∗ " lazy dog" ∗/System . out . p r i n t l n ( s t r . subst r ing ( 4 , 9 ) ) ; /∗ " quick " ∗/

System . out . p r i n t f ( "%c" , s t r . charAt ( 0 ) ) ; /∗ ’ T ’ ∗/System . out . p r i n t f ( "%c" , s t r . charAt ( 8 ) ) ; /∗ ’ k ’ ∗/

Ricardo Terra ([email protected]) POO 8 de julho de 2011 451 / 526

Page 457: JAVA - Apostila.pdf

Materiais Complementares – Classe String

Tamanho de um string

Basta utilizar o método length

Exemplo

S t r i ng s t r = " The quick brown fox jumps over the lazy dog" ;

System . out . p r i n t f ( "Tamanho: %d" , s t r . length ( ) ) ; /∗ 43 ∗/

/∗ Imprime o s t r i ng , mas caractere a caractere ∗/f o r ( i n t i = 0 ; i < s t r . length ( ) ; i ++ ) {

System . out . p r i n t f ( "%c" , s t r . charAt ( i ) ) ;}

/∗ Imprime o inverso do s t r i n g ( caractere a caractere ) ∗/f o r ( i n t i = s t r . length ( ) − 1; i >= 0 ; i−− ) {

System . out . p r i n t f ( "%c" , s t r . charAt ( i ) ) ;}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 452 / 526

Page 458: JAVA - Apostila.pdf

Materiais Complementares – Classe String

Concatenando strings

Basta utilizar o operador +, mas também pode usar ométodo concat (desnecessário)

Exemplo

S t r i ng f i rstName = " Ricardo " ;S t r i ng lastName = " Terra " ;

S t r i ng name = firstName + " " + lastName ;System . out . p r i n t l n ( name ) ; /∗ Ricardo Terra ∗/

S t r i ng nameFormatted = lastName . concat ( " , " ) . concat ( f irstName ) ;System . out . p r i n t l n ( nameFormatted ) ; /∗ Terra , Ricardo ∗/

Ricardo Terra ([email protected]) POO 8 de julho de 2011 453 / 526

Page 459: JAVA - Apostila.pdf

Materiais Complementares – Classe String

Localizando strings

Existem dois métodos comuns para localizar strings em umstring:

indexOf: Procura a primeira ocorrência do string e retorna oíndice que ela começa. Caso não exista, retorna -1

lastIndexOf: Procura a última ocorrência do string e retornao índice que ela começa. Caso não exista, retorna -1

Exemplo

S t r i ng s t r = " The quick brown fox jumps over the lazy dog" ;

System . out . p r i n t f ( " \" fox \"? %d\n " , s t r . indexOf ( " fox " ) ) ; /∗ 16 ∗/System . out . p r i n t f ( " \"cat\"? %d\n " , s t r . indexOf ( " cat " ) ) ; /∗ −1 ∗/

System . out . p r i n t f ( " \"he\"? %d\n " , s t r . indexOf ( "he" ) ) ; /∗ 1 ∗/System . out . p r i n t f ( " \"he\"? %d\n " , s t r . lastIndexOf ( "he" ) ) ; /∗ 32 ∗/

Ricardo Terra ([email protected]) POO 8 de julho de 2011 454 / 526

Page 460: JAVA - Apostila.pdf

Materiais Complementares – Classe String

Formatando strings

Existem três métodos comuns para formatar strings:toLowerCase: Retorna um string toda em caixa baixa

toUpperCase: Retorna um string toda em caixa alta

trim: Retorna um string sem espaços em branco no início eno fim

Exemplo

S t r i ng s t r = " Jose " ;

System . out . p r i n t l n ( " < " + s t r . toLowerCase ( ) + " > " ) ; /∗ < jose > ∗/

System . out . p r i n t l n ( " < " + s t r . toUpperCase ( ) + " > " ) ; /∗ < JOSE > ∗/

System . out . p r i n t l n ( " < " + s t r . t r im ( ) + " > " ) ; /∗ <Jose> ∗/

Ricardo Terra ([email protected]) POO 8 de julho de 2011 455 / 526

Page 461: JAVA - Apostila.pdf

Materiais Complementares – Classe String

Um pouco de expressão regular

É possível verificar se um string segue uma expressão regular.Para isso, deve-se utilizar o método matches

Exemplo

S t r i ng s t r = Teclado . l e r S t r i n g ( " Carro com ’ F ’ e termina com ’ i ’ " ) ;

i f ( s t r . matches ( " F .∗ i " ) ) {System . out . p r i n t l n ( "OK! " ) ;

} else {System . out . p r i n t l n ( "NOK! " ) ;

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 456 / 526

Page 462: JAVA - Apostila.pdf

Materiais Complementares – Classe String

Fragmentando strings

É possível dividir um string pela aparição de um caractereou de um string. Para isso, deve-se utilizar o método split

Assinatura:public String[] split ( String separador )

Exemplo

S t r i ng s t r = " Carlos , Joao , Maria , Pedro " ;

S t r i ng nomes[ ] = s t r . s p l i t ( " , " ) ;

f o r ( S t r i ng nome : nomes ) {System . out . p r i n t l n ( nome ) ;

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 457 / 526

Page 463: JAVA - Apostila.pdf

Materiais Complementares

Classe Date

Ricardo Terra ([email protected]) POO 8 de julho de 2011 458 / 526

Page 464: JAVA - Apostila.pdf

Materiais Complementares – Classe Date

Armazenando uma dataEm Java, quando deseja-se armazenar uma data,utilizamos a classe java.util.Date

A classe java.util.Date representa um instanteespecífico no tempo, com precisão de milisegundos

Ricardo Terra ([email protected]) POO 8 de julho de 2011 459 / 526

Page 465: JAVA - Apostila.pdf

Materiais Complementares – Classe Date

ConstrutoresUm tipo Date pode ser criado:

vazio:

Date d = new Date ( ) ;

Isso indica que o objeto d armazena a data exata em que foicriado

a partir no número de milisegundos a partir de 01/01/1970:

Date d1 = new Date ( 450010883000L ) ;/∗ 05/04/1984 08:01:23 ∗/

Date d2 = new Date ( −14821304400000L ) ;/∗ 22/04/1500 12:00:00 ∗/

Isso indica que o objeto d armazena a data correspondentea 01/01/1970 + número de milisegundos passados

Ricardo Terra ([email protected]) POO 8 de julho de 2011 460 / 526

Page 466: JAVA - Apostila.pdf

Materiais Complementares – Classe Date

Alguns métodos relevantes

1 /∗ Retorna o número de milisegundos a p a r t i r de 1/1/1970 ∗/public long getTime ( ) ;

3

/∗ Altera o número de milisegundos a p a r t i r de 1/1/1970 ∗/5 public void setTime ( long time ) ;

7 /∗ Testa se esta data está depois da data especificada ∗/boolean af te r ( Date when ) ;

9

/∗ Testa se esta data está antes da data especificada ∗/11 boolean before ( Date when ) ;

Ricardo Terra ([email protected]) POO 8 de julho de 2011 461 / 526

Page 467: JAVA - Apostila.pdf

Materiais Complementares – Classe Date

Exemplo

1 Date d1 = new Date ( ) ; /∗ Agora ∗/

3 Date d2 = new Date ( d1 . getTime ( ) − 60000 ) ; /∗ 1min antes de agora ∗/

5 d1 . setTime ( 0L ) ; /∗ 01/01/1970 ∗/

7 System . out . p r i n t l n ( "d1 antes de d2? " + d1 . before ( d2 ) ) ; /∗ t rue ∗/System . out . p r i n t l n ( "d1 depois de d2? " + d1 . af te r ( d2 ) ) ; /∗ fa l se ∗/

Ricardo Terra ([email protected]) POO 8 de julho de 2011 462 / 526

Page 468: JAVA - Apostila.pdf

Materiais Complementares – Classe Date

Manipulação de Data

Para operações de manipulação de data como somardias, alterar mês, subtrair uma data de outra, obter adiferença entre duas datas, deve-se utilizar subclasses dejava.util.Calendar

Esse é um tópico para vocês pesquisarem, caso desejem

Ricardo Terra ([email protected]) POO 8 de julho de 2011 463 / 526

Page 469: JAVA - Apostila.pdf

Materiais Complementares

Classe StringBuilder e StringBuffer

Ricardo Terra ([email protected]) POO 8 de julho de 2011 464 / 526

Page 470: JAVA - Apostila.pdf

Materiais Complementares – Classe StringBuilder eStringBuffer

ProblemaSabemos que quando você “altera” um string, na verdade,um novo string é criado e o coletor de lixo (GarbageCollector ou GC) fica responsável por liberar a área demémória anterior

Isto pode não ser um problema ao trabalhar com stringspequenas. Contudo, imagine:

alteração de um caractere em um string armazenando todoo conteúdo do livro do Deitelinserção caractere a caractere em um string

Ricardo Terra ([email protected]) POO 8 de julho de 2011 465 / 526

Page 471: JAVA - Apostila.pdf

Materiais Complementares – Classe StringBuilder eStringBuffer

“Programa Assassino”

S t r i ng tabelaAscii = " " ;

f o r ( char c = 0; c <= 255; c++ ) {tabelaAscii += c ;

}

System . out . p r i n t l n ( tabelaAscii ) ;

Pergunta

O que ocorre por trás desse programa?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 466 / 526

Page 472: JAVA - Apostila.pdf

Materiais Complementares – Classe StringBuilder eStringBuffer

Solução

No exemplo anterior para criar um string contendo os 255caracteres da tabela ASCII, antes foram criados edescartados 255 strings

Logo, para manipulação de strings não é recomendávelutilizar String, mas sim, StringBuilder ou StringBuffer

Essas classes foram criadas exclusivamente para amanipulação de strings e têm a vantagem de não criarstrings a cada alteração

Isto é, fazem um bom uso da memória

Ricardo Terra ([email protected]) POO 8 de julho de 2011 467 / 526

Page 473: JAVA - Apostila.pdf

Materiais Complementares – Classe StringBuilder eStringBuffer

StringBuilder ou StringBuffer

StringBuilder ou StringBuffer funcionam exatamenteda mesma forma

A única diferença é que StringBuffer é thread-safe, istoé, não deixa que dois threads acessem simultaneamente

Sucintamente, é como se todos os métodos deStringBuffer fosse synchronized

Assim, os slides a seguir abordam exclusivamenteStringBuilder, mas funcionam de forma idêntica comStringBuffer

Ricardo Terra ([email protected]) POO 8 de julho de 2011 468 / 526

Page 474: JAVA - Apostila.pdf

Materiais Complementares – Classe StringBuilder eStringBuffer

ConstrutoresTanto StringBuilder quanto StringBuffer podem sercriados:

vazio:

S t r ingBu i lde r s t r B u f f e r = new St r ingBu i lde r ( ) ;

a partir de um string:

S t r ingBu i lde r s t r B u f f e r = new St r ingBu i lde r ( " i n i c i a l " ) ;

com um tamanho inicial já especificado (mas aumentaautomaticamente, caso necessário)

S t r ingBu i lde r s t r B u f f e r = new St r ingBu i lde r (256) ;

Ricardo Terra ([email protected]) POO 8 de julho de 2011 469 / 526

Page 475: JAVA - Apostila.pdf

Materiais Complementares – Classe StringBuilder eStringBuffer

Eis a solução para o “Programa Assassino”

S t r ingBu i lde r tabelaAscii = new St r ingBu i lde r ( 256 ) ;

f o r ( char c = 0; c <= 255; c++ ) {tabelaAscii .append( c ) ;

}

System . out . p r i n t l n ( tabelaAscii . toS t r i ng ( ) ) ;

Ricardo Terra ([email protected]) POO 8 de julho de 2011 470 / 526

Page 476: JAVA - Apostila.pdf

Materiais Complementares – Classe StringBuilder eStringBuffer

Alguns métodos relevantes

/∗ Anexa qualquer coisa ao f i n a l ∗/2 public S t r i n g B u i l d e r append ( ? ) ;

4 /∗ Insere qualquer coisa a p a r t i r de uma posicao ∗/public S t r i n g B u i l d e r i n s e r t ( i n t offset , ? ) ;

6

/∗ Recupera o caractere em uma determinada posicao ∗/8 public char charAt ( i n t index ) ;

10 /∗ Deleta em um interva lo ∗/public S t r i n g B u i l d e r delete ( i n t s ta r t , i n t end ) ;

12

/∗ Recupera o primeiro índice que um s t r i n g começa ∗/14 public i n t indexOf ( S t r i ng s t r ) ;

16 /∗ Recupera o últ imo índice que um s t r i n g começa ∗/public i n t lastIndexOf ( S t r i ng s t r ) ;

18

/∗ Inverte o conteúdo ∗/20 public S t r i n g B u i l d e r reverse ( ) ;Ricardo Terra ([email protected]) POO 8 de julho de 2011 471 / 526

Page 477: JAVA - Apostila.pdf

Materiais Complementares – Classe StringBuilder eStringBuffer

Exemplo Completo

S t r ingBu i lde r s t r B u i l d e r = new St r ingBu i lde r ( ) ;

s t r B u i l d e r .append( " Prof . Ricardo Tra " ) ; /∗ Prof . Ricardo Tra ∗/

s t r B u i l d e r . i n s e r t ( 15 , " er " ) ; /∗ Prof . Ricardo Terra ∗/

s t r B u i l d e r . delete ( 0 , 6 ) ; /∗ Ricardo Terra ∗/

System . out . p r i n t l n ( s t r B u i l d e r . indexOf ( " Ter ra " ) ) ; /∗ 8 ∗/

System . out . p r i n t l n ( s t r B u i l d e r . lastIndexOf ( " r " ) ) ; /∗ 11 ∗/

s t r B u i l d e r . reverse ( ) ;System . out . p r i n t l n ( s t r B u i l d e r ) ; /∗ arreT odraciR ∗/

Ricardo Terra ([email protected]) POO 8 de julho de 2011 472 / 526

Page 478: JAVA - Apostila.pdf

Materiais Complementares

Classe StringTokenizer

Ricardo Terra ([email protected]) POO 8 de julho de 2011 473 / 526

Page 479: JAVA - Apostila.pdf

Materiais Complementares – Classe StringTokenizer

ProblemaComo já visto, o método split divide um string pelaaparição de um caractere ou de um string gerando umarranjo de strings

Contudo, imagine um string que será fragmentado em ummilhão de partes

criar de uma só vez um arranjo de um milhão de stringsrequer grande espaço de memória

Ricardo Terra ([email protected]) POO 8 de julho de 2011 474 / 526

Page 480: JAVA - Apostila.pdf

Materiais Complementares – Classe StringTokenizer

Solução

Pensando nisso, Java provê um classe chamadaStringTokenizer que retorna um token (parte do stringoriginal) por vez

o que praticamente elimina a demanda de memória

Alguns métodos relevantes

1 /∗ Ver i f ica se ainda possui mais tokens ∗/public boolean hasMoreTokens ( ) ;

3

/∗ Retorna o próximo token ∗/5 public S t r i ng nextToken ( ) ;

Ricardo Terra ([email protected]) POO 8 de julho de 2011 475 / 526

Page 481: JAVA - Apostila.pdf

Materiais Complementares – Classe StringTokenizer

Exemplo

1 S t r i ng s t r = " Carlos , Joao , Maria , Pedro " ;

3 St r ingTokenizer s t r Token i ze r = new Str ingTokenizer ( s t r , " , " ) ;

5 while ( s t r Token i ze r . hasMoreTokens ( ) ) {System . out . p r i n t l n ( s t r Token i ze r . nextToken ( ) ) ;

7 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 476 / 526

Page 482: JAVA - Apostila.pdf

Materiais Complementares

Classe Iterator

Ricardo Terra ([email protected]) POO 8 de julho de 2011 477 / 526

Page 483: JAVA - Apostila.pdf

Materiais Complementares – Classe Iterator

IteratorIterator é um objeto que permite ao programador passarpor todos os elementos de uma coleção,independentemente da sua implementação

também conhecido como cursor no contexto de banco dedados

Métodos

/∗ Ver i f ica se ainda possui mais objetos ∗/2 public boolean hasMore ( ) ;

4 /∗ Retorna o próximo objeto ∗/public <T> next ( ) ;

6

/∗ Remove o últ imo objeto recuperado ∗/8 public void remove ( ) ;

Ricardo Terra ([email protected]) POO 8 de julho de 2011 478 / 526

Page 484: JAVA - Apostila.pdf

Materiais Complementares – Classe Iterator

O que pode ser “iterado”?Classes que implementam a interface Iterable

possuem um único método: Iterator<T> iterator ( )

Em Java, todas as coleções implementam tal interface

Exemplo

Collection <St r ing > nomes = new Ar rayL i s t <St r ing > ( ) ;2 nomes.add( " Carla " ) ;

nomes.add( " Pedro " ) ;4 nomes.add( " Ricardo " ) ;

6 f o r ( I te ra to r <St r ing > i t = nomes. i t e r a t o r ( ) ; i t . hasNext ( ) ; ) {S t r i ng nome = i t . next ( ) ;

8 System . out . p r i n t l n ( nome ) ;}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 479 / 526

Page 485: JAVA - Apostila.pdf

Materiais Complementares – Classe Iterator

Mas, com foreach não é bem mais fácil?

Collection <St r ing > nomes = new Ar rayL i s t <St r ing > ( ) ;2 nomes.add( " Carla " ) ;

nomes.add( " Pedro " ) ;4 nomes.add( " Ricardo " ) ;

6 f o r ( S t r i ng nome : nomes ) {System . out . p r i n t l n ( nome ) ;

8 }

Sim, mas, na verdade, o foreach só funciona em classesque implementam Iterable

possuem um único método: Iterator<T> iterator ( )

Em Java, todas as coleções implementam tal interface

Ricardo Terra ([email protected]) POO 8 de julho de 2011 480 / 526

Page 486: JAVA - Apostila.pdf

Materiais Complementares

Coleções

Ricardo Terra ([email protected]) POO 8 de julho de 2011 481 / 526

Page 487: JAVA - Apostila.pdf

Materiais Complementares – Coleções

Problema

Alocação estática: espaço pré-determinado a tempo decompilação. Ex:int v[] = new int[100];

Alocação dinâmica: espaço determinado a tempo decompilação. Ex:int n = Teclado.lerInteger("Tamanho:");int v[] = new int[n];

Mas, e quando não temos ideia do tamanho?

Estruturas de dados com tamanho variávelTais como listas, conjuntos, filas, pilhas ...

Ricardo Terra ([email protected]) POO 8 de julho de 2011 482 / 526

Page 488: JAVA - Apostila.pdf

Materiais Complementares – Coleções

Observe o que a API de Java provê para nós

FocoNeste material, abordaremos somente à classe ArrayList

No entanto, observe que se trabalharmos com a interfaceCollection, a implementação não importa

Ricardo Terra ([email protected]) POO 8 de julho de 2011 483 / 526

Page 489: JAVA - Apostila.pdf

Materiais Complementares – Coleções

Explicação sucinta dos sub-tipos de Collection

List: listas encadeadas (pode haver repetição)

Set: conjunto (não há repetição)

Queue: implementação de fila (FIFO)

Stack: implementação de pilha (FILO)

Ricardo Terra ([email protected]) POO 8 de julho de 2011 484 / 526

Page 490: JAVA - Apostila.pdf

Materiais Complementares – Coleções

Alguns métodos relevantes de Collection

/∗ Adiciona um objeto na coleção ∗/2 boolean add( E o ) ;

4 /∗ Remove um objeto da coleção ∗/boolean remove( Object o)

6

/∗ Adiciona toda uma coleção à coleção ∗/8 boolean addAll ( Collection c)

10 /∗ Remove todos os elementos da coleção ∗/void clear ( )

12

/∗ Ver i f ica se t a l objeto ex i s te na coleção ∗/14 boolean contains ( Object o)

16 /∗ Retorna o tamanho da coleção ∗/i n t s i ze ( )

18

/∗ Ver i f ica se a coleção está vazia ∗/20 boolean isEmpty ( )

22 /∗ Retorna os objetos da coleção como um arranjo ∗/Object [ ] toArray ( )

Ricardo Terra ([email protected]) POO 8 de julho de 2011 485 / 526

Page 491: JAVA - Apostila.pdf

Materiais Complementares – Coleções

Alguns métodos relevantes de List

1 /∗ Retorna um objeto em um dado índice ∗/E get ( i n t i ) ;

Pergunta

Por que o método get não está na interface Collection?

Ricardo Terra ([email protected]) POO 8 de julho de 2011 486 / 526

Page 492: JAVA - Apostila.pdf

Materiais Complementares – Coleções

Utilizando...

Collection <St r ing > nomes = new Ar rayL i s t <St r ing > ( ) ;

nomes.add( " Ricardo " ) ;nomes. clear ( ) ;System . out . p r i n t f ( " Vazia? %b\n " , nomes. isEmpty ( ) ) ; /∗ t rue ∗/

nomes.add( " Ricardo " ) ;nomes.add( " V i r g i l i o " ) ;nomes.add( " Cesar " ) ;System . out . p r i n t l n ( nomes. s i ze ( ) ) ; /∗ 3 ∗/System . out . p r i n t l n ( nomes. contains ( " Ricardo " ) ) ; /∗ t rue ∗/

f o r ( S t r i ng nome : nomes ) {System . out . p r i n t l n (nome) ;

}

ArrayList pode ser trocado por qualquer subclasse deCollection sem impacto algum à aplicação

Ricardo Terra ([email protected]) POO 8 de julho de 2011 487 / 526

Page 493: JAVA - Apostila.pdf

Materiais Complementares – Coleções

Observação Importante

Observe que o exemplo anterior aplica “Programação porContrato”

Você pode mudar a implementação da coleção semimpacto algum à aplicação

Mas, se você precisasse utilizar algum método específico,como o método get que só existe na interface List

Nos slides a seguir, são mostradas duas possíveis soluções

Ricardo Terra ([email protected]) POO 8 de julho de 2011 488 / 526

Page 494: JAVA - Apostila.pdf

Materiais Complementares – Coleções

Solução 1: diminuir o grau de abstração

L i s t <St r ing > nomes = new Ar rayL i s t <St r ing > ( ) ;

nomes.add( " Ricardo " ) ;nomes. clear ( ) ;System . out . p r i n t f ( " Vazia? %b\n " , nomes. isEmpty ( ) ) ; /∗ t rue ∗/

nomes.add( " Ricardo " ) ;nomes.add( " V i r g i l i o " ) ;nomes.add( " Cesar " ) ;System . out . p r i n t l n ( nomes. s i ze ( ) ) ; /∗ 3 ∗/System . out . p r i n t l n ( nomes. contains ( " Ricardo " ) ) ; /∗ t rue ∗/

f o r ( i n t i = 0 ; i < nomes. s i ze ( ) ; i ++ ) {System . out . p r i n t l n ( nomes. get ( i ) ) ;

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 489 / 526

Page 495: JAVA - Apostila.pdf

Materiais Complementares – Coleções

Solução 2: Fazer cast

Collection <St r ing > nomes = new Ar rayL i s t <St r ing > ( ) ;

nomes.add( " Ricardo " ) ;nomes. clear ( ) ;System . out . p r i n t f ( " Vazia? %b\n " , nomes. isEmpty ( ) ) ; /∗ t rue ∗/

nomes.add( " Ricardo " ) ;nomes.add( " V i r g i l i o " ) ;nomes.add( " Cesar " ) ;System . out . p r i n t l n ( nomes. s i ze ( ) ) ; /∗ 3 ∗/System . out . p r i n t l n ( nomes. contains ( " Ricardo " ) ) ; /∗ t rue ∗/

i f ( nomes instanceof L i s t ) {L i s t <St r ing > listaNomes = ( L i s t <St r ing >) nomes;f o r ( i n t i = 0 ; i < nomes. s i ze ( ) ; i ++ ) {

System . out . p r i n t l n ( listaNomes . get ( i ) ) ;}

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 490 / 526

Page 496: JAVA - Apostila.pdf

Materiais Complementares – Coleções

Ordenando...

É importante que você possa ordenar uma lista (não umacoleção)

Para isso, basta:os objetos da lista devem ser comparáveis

invocar o método que ordena a lista:Collections.sort (List l)

Um objeto é comparável se, e somente se, implementa ainterface Comparable

Tal interface requer a implementação de um único método:int compare (E o)

Nos slides a seguir, é apresentado um exemplo completo

Ricardo Terra ([email protected]) POO 8 de julho de 2011 491 / 526

Page 497: JAVA - Apostila.pdf

Materiais Complementares – Coleções

Classe Pessoa

public class Pessoa implements Comparable<Pessoa> {private f i n a l S t r i ng nome;private i n t idade ;

public Pessoa ( S t r i ng nome, i n t idade ) {super ( ) ;t h i s .nome = nome;t h i s . idade = idade ;

}

public i n t getIdade ( ) {return t h i s . idade ;

}

public void setIdade ( i n t idade ) {t h i s . idade = idade ;

}

public S t r i ng getNome( ) {return t h i s .nome;

}

@Overridepublic S t r i ng toS t r ing ( ) {

return t h i s .nome + " tem " + t h i s . idade + " anos " ;}

/∗ continua ∗/

Ricardo Terra ([email protected]) POO 8 de julho de 2011 492 / 526

Page 498: JAVA - Apostila.pdf

Materiais Complementares – Coleções

Classe Pessoa

@Overridepublic boolean equals ( Object o ) {

i f ( o != n u l l && o instanceof Pessoa ) {Pessoa p = ( Pessoa ) o ;return p.nome. equals ( t h i s .nome ) && p. idade == t h i s . idade ;

}return fa lse ;

}

@Overridepublic i n t hashCode ( ) {

f i n a l i n t prime = 31;i n t r e s u l t = 1 ;r e s u l t = prime ∗ r e s u l t + idade ;r e s u l t = prime ∗ r e s u l t + ( (nome == n u l l ) ? 0 : nome.hashCode ( ) ) ;return r e s u l t ;

}

@Overridepublic i n t compareTo( Pessoa p ) {

i f ( t h i s . idade > p. idade ) {return 1;

} else i f ( t h i s . idade < p. idade ) {return −1;

}return 0;

}}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 493 / 526

Page 499: JAVA - Apostila.pdf

Materiais Complementares – Coleções

Exemplo Completo

L i s t <Pessoa> pessoas = new Ar rayL i s t <Pessoa > ( ) ;

pessoas .add( new Pessoa ( " Ricardo " , 21 ) ) ;pessoas .add( new Pessoa ( " Cesar " , 38 ) ) ;pessoas .add( new Pessoa ( " V i r g i l i o " , 31 ) ) ;

Col lect ions . so r t ( pessoas ) ;

f o r ( Pessoa p : pessoas ) {System . out . p r i n t l n ( p ) ;

}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 494 / 526

Page 500: JAVA - Apostila.pdf

Materiais Complementares – Coleções

DicaO método compareTo pode ser bem simples

Normalmente é!

Suponha que as pessoas fossem ordenadas pelo nome

Basta retornar o retorno do método compareTo da classeString

Isso porque a classe String já implementa Comparable!

Observe

@Overridepublic i n t compareTo( Pessoa p ) {

return t h i s .nome. compareTo( p.nome ) ;}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 495 / 526

Page 501: JAVA - Apostila.pdf

Materiais Complementares – Coleções

Observação Importante!

Para uso correto de coleções, as classes dos objetoscontidos nela devem:

ou não sobrescreverem os métodos equals nem hashCode

ou sobrescreverem os métodos equals e hashCoderegra: dois objetos iguais devem ter o mesmo código hash

Ricardo Terra ([email protected]) POO 8 de julho de 2011 496 / 526

Page 502: JAVA - Apostila.pdf

Conteúdo

1 Introdução

2 UML

3 Java

4 POO

5 Padrões de Projeto

6 Tópicos Relevantes

7 Materiais Complementares

8 ExtrasImportando Projeto Existente no EclipseAdicionando Biblioteca em ProjetoBiblioteca TerraUtil

Ricardo Terra ([email protected]) POO 8 de julho de 2011 497 / 526

Page 503: JAVA - Apostila.pdf

Extras

Importando Projeto Existente no Eclipse

Ricardo Terra ([email protected]) POO 8 de julho de 2011 498 / 526

Page 504: JAVA - Apostila.pdf

Extras – Importando Projeto Existente no Eclipse

Em algumas situações um projeto foi iniciado em umamáquina e será continuado em uma outra

Muitos alunos têm sérios problemas em fazer isso

Os slides a seguir demonstram como importar um projeto jáexistente no Eclipse

Ricardo Terra ([email protected]) POO 8 de julho de 2011 499 / 526

Page 505: JAVA - Apostila.pdf

Extras – Importando Projeto Existente no Eclipse

Em que diretório está armazenado o meu projeto?Inicialmente, você deve armazenar toda a pasta em que oprojeto está contido

Para descobrir em que pasta está seu projeto, basta clicarcom o botão direito sobre o projeto e clicar em Properties

Ricardo Terra ([email protected]) POO 8 de julho de 2011 500 / 526

Page 506: JAVA - Apostila.pdf

Extras – Importando Projeto Existente no Eclipse

Por exemplo, o projeto Teste está na pasta /Developer/workspace/Teste

Ricardo Terra ([email protected]) POO 8 de julho de 2011 501 / 526

Page 507: JAVA - Apostila.pdf

Extras – Importando Projeto Existente no Eclipse

Vamos supor que copiou o projeto Teste para uma outramáquina e que ele agora esteja no diretório /Doc/Teste

Ricardo Terra ([email protected]) POO 8 de julho de 2011 502 / 526

Page 508: JAVA - Apostila.pdf

Extras – Importando Projeto Existente no Eclipse

Vá em File→ Import

Ricardo Terra ([email protected]) POO 8 de julho de 2011 503 / 526

Page 509: JAVA - Apostila.pdf

Extras – Importando Projeto Existente no Eclipse

Selecione General→ Existing Projects Into Workspace e clique em Next

Ricardo Terra ([email protected]) POO 8 de julho de 2011 504 / 526

Page 510: JAVA - Apostila.pdf

Extras – Importando Projeto Existente no Eclipse

No campo Select root directory coloque o diretório em que o projeto está contidoNo exemplo será: /Doc, veja que ele aparece no campo Projects e clique em Finish

Ricardo Terra ([email protected]) POO 8 de julho de 2011 505 / 526

Page 511: JAVA - Apostila.pdf

Extras – Importando Projeto Existente no Eclipse

Observe que agora o projeto aparece em sua lista de projetos

Ricardo Terra ([email protected]) POO 8 de julho de 2011 506 / 526

Page 512: JAVA - Apostila.pdf

Extras – Importando Projeto Existente no Eclipse

Pronto!

Ricardo Terra ([email protected]) POO 8 de julho de 2011 507 / 526

Page 513: JAVA - Apostila.pdf

Extras

Adicionando Biblioteca em Projeto

Ricardo Terra ([email protected]) POO 8 de julho de 2011 508 / 526

Page 514: JAVA - Apostila.pdf

Extras – Adicionando Biblioteca em Projeto

Em algumas situações faz-se necessária a utilização declasses já existentes que são disponibilizadas em umabiblioteca

Essas bibliotecas são geralmente um arquivo JAR que deveser importado no seu projeto do Eclipse

Os slides a seguir demonstram como importar umabiblioteca externa no Eclipse de dois modos:

A biblioteca foi copiada para o diretório do projeto

A biblioteca não foi copiada para o diretório do projeto

Ricardo Terra ([email protected]) POO 8 de julho de 2011 509 / 526

Page 515: JAVA - Apostila.pdf

Extras – Adicionando Biblioteca em Projeto

A biblioteca foi copiada para o diretório do projeto

Ricardo Terra ([email protected]) POO 8 de julho de 2011 510 / 526

Page 516: JAVA - Apostila.pdf

Extras – Adicionando Biblioteca em Projeto

Clique com o botão direito na biblioteca, vá em Build Path e depois em Add toBuild Path

Ricardo Terra ([email protected]) POO 8 de julho de 2011 511 / 526

Page 517: JAVA - Apostila.pdf

Extras – Adicionando Biblioteca em Projeto

Observe que a biblioteca aparecerá em Referenced Libraries

Ricardo Terra ([email protected]) POO 8 de julho de 2011 512 / 526

Page 518: JAVA - Apostila.pdf

Extras – Adicionando Biblioteca em Projeto

A biblioteca não foi copiada para o diretório do projeto

Ricardo Terra ([email protected]) POO 8 de julho de 2011 513 / 526

Page 519: JAVA - Apostila.pdf

Extras – Adicionando Biblioteca em Projeto

Clique com o botão direito no projeto, vá em Build Path e depois em Add ExternalArchives...

Ricardo Terra ([email protected]) POO 8 de julho de 2011 514 / 526

Page 520: JAVA - Apostila.pdf

Extras – Adicionando Biblioteca em Projeto

Selecione a biblioteca (extensão JAR) desejada onde ela estiver

Ricardo Terra ([email protected]) POO 8 de julho de 2011 515 / 526

Page 521: JAVA - Apostila.pdf

Extras – Adicionando Biblioteca em Projeto

Observe que a biblioteca aparecerá em Referenced Libraries

Ricardo Terra ([email protected]) POO 8 de julho de 2011 516 / 526

Page 522: JAVA - Apostila.pdf

Extras – Adicionando Biblioteca em Projeto

Pronto!

Ricardo Terra ([email protected]) POO 8 de julho de 2011 517 / 526

Page 523: JAVA - Apostila.pdf

Extras

Biblioteca TerraUtil

Ricardo Terra ([email protected]) POO 8 de julho de 2011 518 / 526

Page 524: JAVA - Apostila.pdf

Extras – Biblioteca TerraUtil

TerraUtil é uma biblioteca criada com o intuito de:facilitar a leitura de tipos primitivos (char, int, double etc) ede strings a partir do teclado

facilitar a conversão de string para data e vice-versa

É um arquivo JAR com apenas duas classes:com.terra.util.Teclado

com.terra.util.Conversor

Para ser utilizada deve ser adicionada como biblioteca doprojeto (veja p. 508)

Ricardo Terra ([email protected]) POO 8 de julho de 2011 519 / 526

Page 525: JAVA - Apostila.pdf

Extras – Biblioteca TerraUtil

Métodos da classe Teclado

1 public s t a t i c char lerChar ( S t r i ng rotu lo )

3 public s t a t i c byte lerByte ( S t r i ng rotu lo )

5 public s t a t i c shor t le rSho r t ( S t r i ng rotu lo )

7 public s t a t i c i n t le r In teger ( S t r i ng rotu lo )

9 public s t a t i c long lerLong ( S t r i ng rotu lo )

11 public s t a t i c f l o a t l e r F l o a t ( S t r i ng rotu lo )

13 public s t a t i c double lerDouble ( S t r i ng rotu lo )

15 public s t a t i c S t r i ng l e r S t r i n g ( S t r i ng rotu lo )

Ricardo Terra ([email protected]) POO 8 de julho de 2011 520 / 526

Page 526: JAVA - Apostila.pdf

Extras – Biblioteca TerraUtil

Implementação da classe Teclado

Só para se ter uma ideia de como é a implementação dosmétodos da classe Teclado, segue o código fonte dométodo lerString que é o mais simples

1 public class Teclado {. . .

3 public s t a t i c S t r i ng l e r S t r i n g ( S t r i ng rotu lo ) {System . out . p r i n t ( rotu lo + " : " ) ;

5 Scanner s = new Scanner ( System . in ) ;return s . nextLine ( ) ;

7 }. . .

9 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 521 / 526

Page 527: JAVA - Apostila.pdf

Extras – Biblioteca TerraUtil

Exemplo de Uso

1 public s t a t i c void main( S t r i ng [ ] args ) {char ch = Teclado . lerChar ( " D ig i te uma le t ra " ) ;

3 i n t i = Teclado . le r In teger ( " D ig i te uma idade " ) ;double d = Teclado . lerDouble ( " D ig i te um preco " ) ;

5 S t r i ng s = Teclado . l e r S t r i n g ( " D ig i te um nome" ) ;

7 System . out . p r i n t f ( " Digitados : %c %d %.2 f %s " , ch , i , d, s ) ;}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 522 / 526

Page 528: JAVA - Apostila.pdf

Extras – Biblioteca TerraUtil

Métodos da classe Conversor

/∗ Converte um objeto Date em um s t r i n g no formato desejado∗/2 public s t a t i c S t r i ng dateToStr ing (Date data , S t r i ng pattern )

4 /∗ Converte um s t r i n g em um formato especif ico em um tipo Date∗/public s t a t i c Date str ingToDate ( S t r i ng strDate , S t r i ng pattern )

Ricardo Terra ([email protected]) POO 8 de julho de 2011 523 / 526

Page 529: JAVA - Apostila.pdf

Extras – Biblioteca TerraUtil

Exemplo de Uso

1 public s t a t i c void main( S t r i ng [ ] args ) {Date d = new Date ( ) ;

3 /∗ Imprime a data atual no formato informado ∗/System . out . p r i n t l n ( "Data Atual : "

5 + Conversor . dateToStr ing ( d, "dd/MM/yyyy HH:mm: s s " ) ) ;

7 /∗∗ Converte o s t r i n g "05/07/2019" para data e depois imprime a data

9 ∗ criada no formato informado∗/

11 d = Conversor . str ingToDate ( " 05/07/2019 " , "dd/MM/yyyy " ) ;i f ( d != n u l l ) {

13 System . out . p r i n t l n ( Conversor . dateToStr ing ( d,"dd ’de’ MMMM ’de’ yyyy " ) ) ;

15 }}

Ricardo Terra ([email protected]) POO 8 de julho de 2011 524 / 526

Page 530: JAVA - Apostila.pdf

Extras – Biblioteca TerraUtil

Implementação da classe Conversor

1 public class Conversor {

3 public s t a t i c S t r i ng dateToStr ing (Date data , S t r i ng pattern ) {i f ( pattern == n u l l ) {

5 pattern = "dd/MM/yyyy " ;}

7 DateFormat dateFormat = new SimpleDateFormat ( pattern ) ;return dateFormat . format (data ) ;

9 }

11 public s t a t i c Date str ingToDate ( S t r i ng strDate , S t r i ng pattern ) {i f ( pattern == n u l l ) {

13 pattern = "dd/MM/yyyy " ;}

15 DateFormat dateFormat = new SimpleDateFormat ( pattern ) ;dateFormat . setLenient ( fa l se ) ;

17 t r y {return dateFormat . parse ( strDate ) ;

19 } catch ( ParseException e) {return n u l l ;

21 }

23 }

Ricardo Terra ([email protected]) POO 8 de julho de 2011 525 / 526

Page 531: JAVA - Apostila.pdf

Referências

Harvey M. Deitel and Paul J. Deitel.Java: Como Programar.Pearson, 8 edition, 2010.

Martin Fowler.UML Essencial.Bookman, 3 edition, 2004.

Cay S. Horstmann and Gary Cornell.Core Java: Volume 1 - Fundamentos.Pearson, 8 edition, 2010.

Ricardo Terra ([email protected]) POO 8 de julho de 2011 526 / 526