Buscar

JAVA - Apostila

Prévia do material em texto

Programação Orientada a Objetos com Java
Ricardo Terra
rterrabh@gmail.com
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 1 / 527
CV
Nome: Ricardo Terra
Email: rterrabh@gmail.com
www: ricardoterra.com.br
Twitter: rterrabh
Lattes: lattes.cnpq.br/ 0162081093970868
Ph.D. (UFMG/UWaterloo) (a ser concluído em Julho/2013),
M.Sc. (PUC Minas)
Background
Acadêmico: UFSJ (desde 2013), FUMEC (3 anos), UNIPAC (1 ano), FAMINAS (3 anos)
Profissional: DBA Eng. (1 ano), Synos (2 anos) e Stefanini (1 ano)
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 2 / 527
1. Introdução – Conteúdo
1 Introdução 3
Visão Geral de POO 4
2 UML 22
3 Java 60
4 POO 183
5 Padrões de Projeto 356
6 Tópicos Relevantes 386
7 Materiais Complementares 417
8 Extras 498
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 3 / 527
Introdução
Visão Geral de POO
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 4 / 527
Introdução – Visão Geral de POO
Origem da POO
Simula
Foi a primeira linguagem de programação a introduzir os
conceitos subjacentes a programação orientada a objetos
(objetos, classes, subclasses, métodos virtuais, coletor de lixo
etc)
Mas, não foi amplamente desenvolvida
Smalltalk
Linguagem puramente orientada a objetos
Atualmente
C++
Object Pascal
Java
Python
Eiffel
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 5 / 527
Introdução – Visão Geral de POO
Linguagem para criação de modelos
UML
Padrão OMG (Object Management Group)
Mais utilizada nos dias de hoje
Utilizaremos bastante o Diagrama de Classe, um dos seus 14
diagramas, em nossa disciplina
Booch
OOSE (Object-Oriented Software Engineering)
OMT (Object Modeling Technique)
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 6 / 527
Introdução – Visão Geral de POO
Paradigma de Programação
Definição
Conjunto de regras e/ou hipóteses que governam a
definição de um modelo
Aplicação na computação/informática
Auxiliar na condução do processo de busca da solução
(modelo conceitual) de um problema
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 7 / 527
Introdução – Visão Geral de POO
Exemplos de paradigma de programação
Procedural (imperativo)
É um paradigma de programação que descreve a
computação como ações (instruções) que mudam o estado
(variáveis) de um programa. Muito parecido com o
comportamento imperativo das linguagens naturais que
expressam ordens, programas imperativos são uma
sequência de comandos para o computador executar
Orientado a objetos
É um paradigma de programação que utiliza “objetos” e a
interação entre eles para projetar aplicações e programas
de computador. Suas técnicas de programação podem
incluir características como encapsulamento, polimorfismo e
herança. Esse paradigma não era comumente usado no
desenvolvimento de aplicações de grande porte até início
de 1990. Atualmente, várias linguagens modernas suportam
POO
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 8 / 527
Introdução – Visão Geral de POO
Objeto
“Objeto é uma coisa, uma entidade, alguma coisa que
você levanta ou chuta, qualquer coisa que você possa
imaginar que tenha sua própria identidade.” (Mike
O’Docherty, 2005)
Possuem características (atributos)
Possuem comportamentos (métodos)
Assume responsabilidades no domínio do problema
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 9 / 527
Introdução – Visão Geral de POO
Classe
“Uma classe encapsula características comuns a grupos de
objetos.” (Mike O’Docherty, 2005)
Pode ser pensada de várias formas:
Um conjunto de especificações que caracterizam como
seus membros devem ser
Um molde que produz objetos com a mesma forma
...
Enfim
Desenvolvedores utilizam classes para descrever elementos
de programação que alguns tipos de objetos terão
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 10 / 527
Introdução – Visão Geral de POO
Classe
Atributos
Representam as informações (características) que os objetos
da classe terão
Por exemplo, uma pessoa tem um nome, idade, peso etc
Métodos
Representam as ações (comportamentos) que os objetos da
classe realizarão
Por exemplo, uma pessoa respira, come, bebe etc
Encapsulamento
Classe é a menor unidade modular de POO, isto é, não existe
nada menor que uma classe
Assim, classe é definida como um grupo de atributos,
métodos e outros membros que são tratado como uma
única unidade modular
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 11 / 527
Introdução – Visão Geral de POO
Herança
Basicamente, é a habilidade de definir novas classes
baseadas em classes existentes
Suponha:
Um animal
Animal morre
Um mamífero é um animal
Mamífero morre
Mamífero mama (novo)
Um leão é um mamífero
Leão morre
Leão mama
Leão ruge (novo)
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 12 / 527
Introdução – Visão Geral de POO
Herança requer o entendimento dos conceitos de
superclasse e subclasses
Superclasses são as classes mais genéricas em sua hierarquia
Subclasses são as classes mais específicas em sua hierarquia
Com base no exemplo anterior:
Animal
superclasse de Mamífero e Leão
Mamífero
superclasse de Leão
subclasse de Animal
Leão
subclasse de Animal e Mamífero
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 13 / 527
Introdução – Visão Geral de POO
Sobreposição
Você sobrepõe uma operação quando deseja que uma
operação herdada seja realizada diferentemente pela
subclasse
Por exemplo, uma cobra se alimenta de ratos, mas um tipo
especí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
@Override
void alimentar (Rato comida) { /* come mesmo vivo */ }
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 14 / 527
Introdução – Visão Geral de POO
Sobrecarga
Você sobrecarrega uma operação quando deseja que a
mesma operação também seja realizada por entradas
diferentes
Por exemplo, uma cobra se alimenta de ratos, mas um tipo
específico de cobra (subclasse) se alimenta também de
ratazanas
Assim, é necessário sobrecarregar o método alimentar:
Classe Cobra
void alimentar (Rato comida) { /* mata e come */ }
Classe Cascavel
@Override
void alimentar (Rato comida) { /* come mesmo vivo */ }
void alimentar (Ratazana comida) { /* come também */ }
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 15 / 527
Introdução – Visão Geral de POO
Polimorfismo
Habilidade de um objeto poder ser tratado como qualquer
uma 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ífero
Contudo, se for visto como mamífero, só poderá morrer e
mamar
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 16 / 527
Introdução – Visão Geral de POO
Repasso
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 17 / 527
Introdução – Visão Geral de POO
Agenda Telefônica
Atributos
lista de contatos
Operações
inserir contato
alterar contato
excluir contato
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 18 / 527
Introdução – Visão Geral de POO
Contato (para uma agenda telefônica)
Atributos
nome
endereço
telefone
email
Operações
obter/alterar nome
obter/alterar endereço
obter/alterar telefone
obter/alterar email
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 19 / 527
Introdução – Visão Geral de POO
Cavalo (como ele é)
Atributos
peso
altura
cor
raça
...
Operações
andar
comer
puxar carroça
relinchar
...
RicardoTerra (rterrabh@gmail.com) POO 11 de março de 2013 20 / 527
Introdução – Visão Geral de POO
Exercícios: modele as seguintes classes
Conta
Equação (de 2o grau)
Escola
Filme
Telefone
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 21 / 527
2. UML – Conteúdo
1 Introdução 3
2 UML 22
Diagrama de Classe 23
3 Java 60
4 POO 183
5 Padrões de Projeto 356
6 Tópicos Relevantes 386
7 Materiais Complementares 417
8 Extras 498
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 22 / 527
UML
Diagrama de Classe
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 23 / 527
UML – Diagrama de Classe
Classe x Objeto
As classes formam o alicerce do diagrama de classes. Para
trabalhar com diagrama de classes, você precisa ter uma
noção clara da diferença entre classes e objetos
Assim:
Classe é a definição/molde para um recurso. Ela inclui
informações que descrevem os recursos de uma entidade e
como ela pode ser utilizada
Objeto, ao contrário, é uma instância de uma classe.
Pode-se dizer que um objeto é uma entidade identificável de
forma exclusiva de acordo com as regras definidas pela
classe
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 24 / 527
UML – Diagrama de Classe
Importância
“Se alguém chegar perto de você em um beco escuro e
disser: “Psiu, quer ver um diagrama UML?”, esse
provavelmente seria um diagrama de classes. A maioria
dos diagramas UML que vejo são diagramas de classes.”
(FOWLER, 2005)
“O diagrama de classes provavelmente é o diagrama mais
utilizado da UML. Na verdade, o diagrama de classes é a
ferramenta de modelagem principal para descrever a
própria UML.” (PENDER, 2004)
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 25 / 527
UML – Diagrama de Classe
Definição
Um diagrama de classes descreve os tipos de objetos
presentes no sistema e os vários tipos de relacionamento
estáticos existentes entre eles
Os diagramas de classe também mostram os atributos e
operações de uma classe e as restrições que se aplicam à
maneira como os objetos estabelecem dependência
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 26 / 527
UML – Diagrama de Classe
Uma classe é uma descrição de um conjunto de objetos
que partilham os mesmos atributos, operações, relações e
semântica
Por exemplo, na classe Pessoa, é dito que uma pessoa tem
nome, idade, altura etc. Contudo, não diz qual é o nome, a
idade, a altura etc
Se algo tem um nome, uma idade, uma altura etc, esse algo
é um objeto de Pessoa
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 27 / 527
UML – Diagrama de Classe
Uma classe é descrita em seus aspectos estruturais por seus
atributos e em seus aspectos comportamentais por suas
operações
Uma classe é representada como abaixo:
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 28 / 527
UML – Diagrama de Classe
É errado pensar que uma classe deve corresponder a uma
entidade humana, uma coisa física, algo que você vê ou
toca etc
Por exemplo, pode-se representar entidades mais abstratas:
Venda, Saudade, Amor etc
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 29 / 527
UML – Diagrama de Classe
Atributos
São propriedades (características) semelhantes que os
objetos de uma classe possuem
Por exemplo, na classe Pessoa, o nome, a idade, a altura
sã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, que
o meu carro é prata. Como o seu é preto, não pode ser o
mesmo carro
Em outras palavras, o valor do atributo cor diferenciou os
objetos
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 30 / 527
UML – Diagrama de Classe
Atributos e operações permitem que sejam especificados
detalhes de sua visibilidade e de sua multiplicidade
(abordaremos isso a frente)
A sintaxe básica de um atributo é:
[visibilidade] nome : [tipo] { = valor-inicial }
Exemplos:
+ nome : String
- salario : double = 1000.00
# nota : int
∼ cor : double
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 31 / 527
UML – Diagrama de Classe
Operações
São comportamentos (ações) que os objetos de uma
classe possuem
Por exemplo, na classe Pessoa, comer, beber, dormir são
suas operações
Os valores dos atributos diferenciam objetos. Contudo, eles
influenciam nas operações. Por exemplo, na classe Pessoa,
uma pessoa que pesa 100kg certamente vai comer mais
que uma que pesa 45kg
Existem operações que não sofrem influência dos atributos,
mas não é comum
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 32 / 527
UML – Diagrama de Classe
A sintaxe básica de uma operação é:
[visibilidade] nome ( [parâmetros] ) : [retorno]
Exemplos:
- mostrar( ) : void
+ calcularTaxa( valorDolar : double ) : double
# somar( a : int , b: int ) : int
∼ delta( ): double
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 33 / 527
UML – Diagrama de Classe
Atributos e operações estáticos
Um atributo ou operação que não pertence a uma
instância da classe, mas à classe como um todo são
chamados de atributo ou operação estático
Atributos e operações estáticos são compartilhados por
todas as instâncias da classe, não pertencendo a uma
instância específica
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 34 / 527
UML – Diagrama de Classe
Por exemplo, na classe ContaPoupanca, a taxa de
rendimento é comum a todas as contas poupanças
Logo, é um atributo estático
Atributos ou operações estáticos são representados com
um sublinhado. Observe:
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 35 / 527
UML – Diagrama de Classe
Visibilidade
É possível especificar como os atributos e operações serão
vistos 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 e
também as subclasses visualizam
(∼) PACOTE: Todas as classes do mesmo pacote visualizam
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 36 / 527
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 o
veículo
Somente a própria classe pode ativar o ABS
Somente classes do mesmo pacote podem saber o consumo do veículo
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 37 / 527
UML – Diagrama de Classe
Associação
Uma das maneiras de se criar um atributo é através de uma
associação
Associação é uma linha cheia entre duas classes
Logo veremos navegabilidade
Por exemplo, uma NotaFiscal possui pelo menos um
objeto do tipo ItemNotaFiscal e um ItemNotaFiscal
está vinculado a uma única NotaFiscal
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 38 / 527
UML – Diagrama de Classe
Observe que não é necessário (nem correto) explicitar que
NotaFiscal possui uma coleção de ItemNotaFiscal
A própria associação diz isso
Código Java correspondente
public class NotaFiscal {
private Collection<ItemNotaFiscal> itensNotaFiscal;
...
}
public class ItemNotaFiscal {
...
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 39 / 527
UML – Diagrama de Classe
Navegabilidade
É possível definir a navegabilidade de uma associação
No exemplo anterior, a navegabilidade é só ocorre de
NotaFiscal para ItemNotaFiscal
Isto é, o ItemNotaFiscal não sabe a NotaFiscal em que
se encontra
Nos próximos slides veremos como a navegabilidade mudao projeto
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 40 / 527
UML – Diagrama de Classe
Original: Somente a NotaFiscal conhece ItemNotaFiscal
Código Java correspondente
public class NotaFiscal {
private Collection<ItemNotaFiscal> itensNotaFiscal;
...
}
public class ItemNotaFiscal {
...
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 41 / 527
UML – Diagrama de Classe
Somente o ItemNotaFiscal conhece a NotaFiscal
Código Java correspondente
public class NotaFiscal {
...
}
public class ItemNotaFiscal {
private NotaFiscal notaFiscal;
...
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 42 / 527
UML – Diagrama de Classe
Ambas as classes se conhecem (Associação Bidirecional)
Código Java correspondente
public class NotaFiscal {
private Collection<ItemNotaFiscal> itensNotaFiscal;
...
}
public class ItemNotaFiscal {
private NotaFiscal notaFiscal;
...
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 43 / 527
UML – Diagrama de Classe
Composição
Tipo especial de associação em que se deseja indicar uma
ideia de todo e parte
A parte não vive sem o todo
É representado por um losango preenchido ao lado da
entidade que representa o todo
No exemplo abaixo, seria impossível existir um
ItemNotaFiscal sem estar vinculado a uma NotaFiscal
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 44 / 527
UML – Diagrama de Classe
Agregação
Tipo especial de associação em que se deseja indicar uma
associação mais forte
Contudo, a entidade agregada tem vida sozinha
É representado por um losango vazio ao lado da entidade
que representa o todo
No exemplo abaixo, um Motor está agregado a um Carro,
mas é possível existir um motor sem estar em um carro
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 45 / 527
UML – Diagrama de Classe
Multiplicidade
A multiplicidade em uma associação indica o número de
objetos que um objeto da classe pode ter de uma outra
classe
Multiplicidades são números simples ou intervalos de
números
Tabela : Multiplicidade mais comuns
0..1 Uma instância opcional
1 Exatamente uma instância
0..* Zero ou mais instâncias
1..* Pelo menos uma instância
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 46 / 527
UML – Diagrama de Classe
Casamento Tradicional
Poliginia
Poliandria
???
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 47 / 527
UML – Diagrama de Classe
Classes Associativas
Algumas associações de muitos para muitos exige a
necessidade da criação de uma classe associativa entre as
duas classes associadas
No exemplo abaixo existe a classe Paciente com seus
atributos e a classe Exame com seus atributos. Do
relacionamento entre Paciente e Exame, tem-se a data da
realização e o diagnóstico
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 48 / 527
UML – Diagrama de Classe
Generalização
Trata-se da ação de uma classe herdar toda a estrutura de
uma outra classe
Uma subclasse sempre herda de sua superclasse:
Atributos
Operações
Relacionamentos
Uma subclasse pode:
Adicionar atributos e operações
Adicionar relacionamentos
Sobrepor (override) operações herdadas
Sobrecarregar (overload) operações herdadas
A herança é completa, isto é, não tem como uma classe
herdar somente certos atributos ou operações
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 49 / 527
UML – Diagrama de Classe
ContaCorrente e ContaPoupanca herdam Conta
Isto é, são subclasses imediatas de Conta
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 50 / 527
UML – Diagrama de Classe
Classe Abstrata
Se for um bom observador, percebeu que a classe Conta
no ú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 para
provêr a capacidade polimórfica
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 51 / 527
UML – Diagrama de Classe
Pacotes
Os pacotes em um diagrama de classes são altamente
utilizados, pois, na implementação do sistema, a
organização das classes são sempre feitas utilizando
pacotes
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 52 / 527
UML – Diagrama de Classe
Notas e comentários
Como em qualquer diagrama UML, podem ser inseridos
notas e comentários
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 53 / 527
UML – Diagrama de Classe
Cuidado
Diagrama de Classes não é um modelo ER
O maior perigo com os diagramas de classes é que você
pode focar exclusivamente na estrutura e ignorar o
comportamento
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 54 / 527
UML – Diagrama de Classe
Exercício de Fixação 01
A gráfica ABC trabalha com diversos autores que escrevem os
livros que ela publica. Alguns autores escreveram apenas um
livro, enquanto outros já escreveram vários. Além disso, alguns
livros foram escritos por vários autores, porém um livro deve
possuir pelo menos um autor. A gráfica ABC trabalha também
com diversas impressoras, porém um livro só pode ser impresso
em uma única impressora.
Deve ser possível buscar os livros de um autor, saber qual foi a
impressora em que o livro foi impresso, saber a quantidade de
páginas que uma impressora já imprimiu e a quantidade de
páginas que ela imprimiu de um determinado livro, entre outros.
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 55 / 527
UML – Diagrama de Classe
Exercício de Fixação 01 – Solução
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 56 / 527
UML – Diagrama de Classe
Exercício de Fixação 02
Um veículo tem chassi, modelo, peso, ano de fabricação. Um
veí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ão
decola, voa e pousa.
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 57 / 527
UML – Diagrama de Classe
Exercício de Fixação 03
Um imóvel possui um endereço, área (em m2) e um proprietário. O
imóvel pode ser uma casa ou um apartamento. Caso seja casa,
possuirá também o número do registro do lote e, caso seja
apartamento, possuirá o número do andar e um flag indicando se
possui ou não elevador. Um proprietário possui cpf, nome e telefone.
Pelo menos, as seguintes operações devem existir:
Alterar a área de um imóvel
Alterar o proprietário de um imóvel
Alterar o flag se possui ou não elevador do apartamento
Recuperar a quantidade de imóveis de um proprietário
Alterar o telefone de um proprietário
PS: Atenção com os parâmetros e com o tipo de retorno das operações
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 58 / 527
UML – Diagrama de Classe
Exercício de Fixação 04
Uma pessoa possui cpf e nome. Um professor é uma pessoa que também possui uma
titulação e a IES (Instituição de Ensino Superior) vinculada. Um aluno também é uma
pessoa e possui a informação de qual período se encontra e qual o seu curso (um curso
possui um registro do MEC, um nome e sua área de concentração). Uma palestra
possui um nome e um assunto e pode ser ministrada por diversos professores. Para cada
professor 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óvel
Alterar o nome de uma pessoa
Alterar a titulação de um professor
Alterar a IES de um professor
Alterar o período em curso de um aluno
Alterar o curso de um aluno
Alterar o registro do MEC de um curso
Alterar o nome de uma palestra
Alterar a data de um evento
Alterar a localização de um evento
Alterar o telefone de uma localizaçãoRicardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 59 / 527
3. Java – Conteúdo
1 Introdução 3
2 UML 22
3 Java 60
Introdução 61
Tipos Básicos 85
Operadores 98
Comandos condicionais 116
Comandos de repetição 135
Arranjos 154
Métodos 169
4 POO 183
5 Padrões de Projeto 356
6 Tópicos Relevantes 386
7 Materiais Complementares 417
8 Extras 498
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 60 / 527
Java
Introdução
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 61 / 527
Java – Introdução
Logo Mascote – Duke
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 62 / 527
Java – Introdução
Objetivos
Apaixonar-se por Java
Diferenciar:
Programação Estruturada (Pascal, C...)
Programação Orientada a Objetos (Java, C++...)
Pré-requisitos
Lógica de Programação
Linguagem C
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 63 / 527
Java – Introdução
Edições Java
Java SE – Java Standard Edition (Versão Atual: 6)
www.oracle.com/technetwork/java/javase
Java EE – Java Enterprise Edition
www.oracle.com/technetwork/java/javaee
Java ME – Java Micro Edition
www.oracle.com/technetwork/java/javame
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 64 / 527
Java – Introdução
Tipos de Aplicações
Applets
Aplicação que normalmente utiliza o navegador do cliente
para prover a interface do usuário
Processamento realizado no servidor
Applications
Dispensa explicação
Servlets
Execução em servidores web
Exemplos: JSP, JSF, Struts etc
Midlets
Execução em pequenos dispositivos
Portlets
Execução em portais
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 65 / 527
Java – Introdução
Falácias sobre Java
Java é 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 para
aplicações sérias em uma plataforma específica
Leia artigo “Análise Comparativa do Código Gerado por
Compiladores Java e C++” publicado no SBLP 2010
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 66 / 527
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 ponteiros
Gerência automática de memória (não existe mais malloc,
free etc)
Eficiente
JIT Compiler, otimizações dinâmicas etc
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 67 / 527
Java – Introdução
Java SE – Componentes – Entendimento Visual
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 68 / 527
Java – Introdução
Java SE – Componentes
API – Application Programming Interface
Biblioteca com diversas classe e funções úteis para ser
utilizada no desenvolvimento de aplicações
JVM – Java Virtual Machine
Máquina virtual em que a aplicação Java é executada
Contém implementação de toda API Java
JRE – Java Runtime Environment
Ambiente de execução de aplicativos Java
Contém a JVM
JDK – Java Development Kit
Ambiente de desenvolvimento de aplicativos Java
(compilação, depuração etc)
Contém o JRE
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 69 / 527
Java – Introdução
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 70 / 527
Java – Introdução
Funcionamento
Compilador
Entrada: código fonte
Saída: bytecodes
Bytecodes
Código intermediário a ser interpretado pela JVM
Independente de plataforma
JVM
Class Loader: carrega o bytecode para a memória
Bytecode Verifier: confere a consistência do bytecode
Interpreter: interpreta os bytecodes para código de máquina
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 71 / 527
Java – Introdução
Java SE – Funcionamento – Entendimento Visual
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 72 / 527
Java – Introdução
Hello Terra – Código
1 public class HelloTerra {
3 public static void main( String[] args ) {
System.out.println( "Hello Terra!" );
5 }
7 }
Hello Terra – Explicação Superficial
Case-sensitive
Todo o programa sensível a caixa: A 6= a
Método main
Ponto de entrada de uma aplicação Java
System.out.println (sop)
Impressão em tela
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 73 / 527
Java – Introdução
Compilação e Execução
Compilar: javac HelloTerra.java
Executar: java HelloTerra
No entanto, o Eclipse faz tudo para você sem que perceba =)
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 74 / 527
Java – Introdução
Java e outras linguagens
Linguagem realmente orientada por objetos
Menos que Eiffel
Sintaxe muito baseada na sintaxe de C
if, switch, while, do..while, for ...
Tipos de dados básicos similares ao da linguagem C
Remoção de várias características perigosas de C
Ponteiros
Aritmética de ponteiros
Gerenciamento automático de memória (não existe mais
malloc, free etc)
API bem completa
Web, GUI (Graphical User Interface), Networking etc
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 75 / 527
Java – Introdução
Classes
Uma vez que vimos Diagrama de Classes, o entendimento
fica fácil
Define um TAD (Tipo Abstrato de Dados)
Contém:
atributos (propriedades)
métodos (comportamento)
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 76 / 527
Java – Introdução
Classe Pessoa – Exemplo Simples
1 public class Pessoa {
private String nome;
3
public String getNome() {
5 return this.nome;
}
7
public void setNome( String nome ) {
9 this.nome = nome;
}
11
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 77 / 527
Java – Introdução
Estrutura de um Arquivo Java
Pacote
onde o arquivo se encontra
Imports
do que o arquivo necessita
Classe Pública
Apenas uma por arquivo
Deve ter o mesmo nome do arquivo
Classes Não Públicas
Conceito Avançado (não veremos)
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 78 / 527
Java – Introdução
Estrutura de uma Classe Java
Atributos
propriedades
estáticos depois dinâmicos
Construtores
como seus objetos são criados
ordenados pela quantidade de
parâmetros
Métodos
comportamentos
estáticos depois dinâmicos
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 79 / 527
Java – Introdução
Classe Pessoa – Exemplo Mais Completo
package pojo;
2
import java.util.Date;
4
public class Pessoa {
6 public final static String ESPECIE = "Homo Sapiens";
private String nome;
8 private Date dataNascimento;
10 public Pessoa() { }
12 public Pessoa(String nome, Date dataNascimento) {
this.nome = nome;
14 this.dataNascimento = dataNascimento;
}
16
public String getNome() {
18 return this.nome;
}
20 public void setNome( String nome ) {
this.nome = nome;
22 }
public Date getDataNascimento() {
24 return this.dataNascimento;
}
26 public void setDataNascimento( Date dataNascimento ) {
this.dataNascimento = dataNascimento;
28 }
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 80 / 527
Java – Introdução
Comentários
Algumas vezes se deseja explicar um código, explicitar uma
informação em linguagem natural
Eles não deixam o programa mais lento e seu uso é
altamente recomendável
Três tipos:
Comentário para bloco de linha (semelhante a C)
/*
blablabla
*/
Comentário até final de linha (semelhante a C)
// blablabla
Comentário JavaDoc (gera manual do sistema)
/*
@author Ricardo Terra
*/
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 81 / 527
Java – Introdução
Classe Matematica – Exemplo Comentário
1/**
* Classe com atributos e operacoes matematicas
3 * @author Ricardo Terra
*/
5 public class Matematica {
/**
7 * Atributo PI com apenas 6 casas decimais
*/
9 public static final double PI = 3.141569; // Constante PI
11 /**
* Metodo que calcula a area de uma circunferencia
13 * @param raio Raio da circunferencia
* @return Area da Circunferencia
15 */
public static double areaCircunferencia( double raio ) {
17 /*
* A funcao pow da classe Math eleva a uma potencia,
19 * no caso ao quadrado
*/
21 return PI * Math.pow( raio, 2 );
}
23
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 82 / 527
Java – Introdução
Classe Matematica – JavaDoc gerado
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 83 / 527
Java – Introdução
Padrões BluePrints
Nomes de classes
CamelCase com primeira letra em caixa alta
Ex: Animal, AnimalSelvagem, GuardaChuva ...
Nome de identificadores, atributos ou métodos
CamelCase com primeira letra em caixa baixa
Ex: nome, nomeCompleto, comer(), comerMuito() ...
Nome de pacotes
Sempre em caixa baixa
Ex: com.terra.pojo, com.terra.dataaccessobject ...
Evitem caracteres especiais:
_, -, ç, ã, á, ê, é ...
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 84 / 527
Java
Tipos Básicos
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 85 / 527
Java – Tipos Básicos
Identificadores
Atribuição como em C
int valor;
double saldo = 324.20;
Declaração de uma variável pode ocorrer em qualquer
local, evidentemente, antes do uso
Diferentemente de C, Pascal, Object Pascal ...
Regras de identificador
Primeiro caracter deve ser letra, _ ou $
São case-sensitive
Logicamente, identificadores deve ser diferente das
palavras reservadas da linguagem
6= de for, while, int ...
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 86 / 527
Java – Tipos Básicos
Tipos Primitivos
boolean (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 classes
Por exemplo, String, Date são classes
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 87 / 527
Java – Tipos Básicos
Exemplo – Observando Limites
public static void main( String[] args ) {
2 System.out.printf( "boolean: %b e %b\n", Boolean.TRUE, Boolean.FALSE );
4 System.out.printf( "char: %d e %d\n", (int)Character.MIN_VALUE,(int)Character.MAX_VALUE );
6 System.out.printf( "byte: %d e %d\n", Byte.MIN_VALUE, Byte.MAX_VALUE );
System.out.printf( "short: %d e %d\n", Short.MIN_VALUE, Short.MAX_VALUE );
8 System.out.printf( "int: %d e %d\n", Integer.MIN_VALUE, Integer.MAX_VALUE );
System.out.printf( "long: %d e %d\n", Long.MIN_VALUE, Long.MAX_VALUE );
10
System.out.printf( "float: %g e %g\n", Float.MIN_VALUE, Float.MAX_VALUE );
12 System.out.printf( "double: %g e %g\n", Double.MIN_VALUE, Double.MAX_VALUE );
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 88 / 527
Java – Tipos Básicos
Tipo char
Representa um caractere UNICODE
http://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 static void main( String[] args ) {
char ch = ’a’;
3 System.out.println( ch ); /* a */
5 ch = ’\u0040’;
System.out.println( ch ); /* @ */
7
ch = 98;
9 System.out.println( ch ); /* b */
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 89 / 527
Java – Tipos Básicos
Exemplo – Imprimindo Tabela Ascii
public static void main( String[] args ) {
2 for ( char ch = 0; ch < 255; ch++ ) {
System.out.printf( "%d: %c\n", (int) ch, ch );
4 }
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 90 / 527
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 octal
Ex: 011 equivale a 9
Quando se insere 0x antes do número indica base
hexadecimal
Ex: 0x18 equivale a 24
Atribuir valores fora do limite requer cast, contudo não ativa
exceção (nomenclatura de Java para erro)
Ex: byte b = (byte) 128 atribui -128 a b
Divisão por 0 ativa exceção (ArithmeticException)
Ex: int i = 2/0 ativa exceção em tempo de execução
(não em compilação)
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 91 / 527
Java – Tipos Básicos
Exemplo – Atribuição
1 public static void main( String[] args ) {
int i1 = 17;
3 int i2 = 021;
int i3 = 0x11;
5
System.out.printf( "%d %d %d", i1, i2, i3 );
7 }
Pergunta-se
Qual a saída?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 92 / 527
Java – Tipos Básicos
Tipos de Ponto Flutuante – float e double
float→ precisão simples
Número deverá conter o pós-fixo f ou F
Ex: float f = 9.02f ou float f = 9.02F
double→ precisão dupla
Atribuição normal: double d = 9.02
Se desejar, número pode conter o pós-fixo g ou G
Ex: double d = 9.02g ou double d = 9.02G
Pode-se utilizar notação exponecial
Ex: double d = 3.02e2 ou double d = 2.56E-3
Não gera exceção em caso de divisão por 0
1/0 gera ∞
-1/0 gera −∞
0/0 gera NaN
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 93 / 527
Java – Tipos Básicos
Exemplo – Atribuição
1 public static void main( String[] args ) {
float f = 3.01f;
3 double d1 = -3.01;
double d2 = 3.564e+2;
5
System.out.printf("%g %g %g\n", f, d1, d2);
7
double d3 = 1.0/0;
9 double d4 = 0.0/0;
System.out.printf("%g %g\n", d3, d4);
11 }
Pergunta-se
Qual a saída?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 94 / 527
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 de
variáveis, o valor é promovido para a de maior
complexidade
Exceto, em operações entre variáveis inteiras inferiores ao
int em que todos os valores são promovidos para int
automaticamente
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 95 / 527
Java – Tipos Básicos
Exemplo
1 public static void main( String[] args ) {
byte b = (byte) 264; /* Conversao Forcada */
3 System.out.println( b );
5 short s = (short) 3.5; /* Conversao Forcada */
System.out.println( s );
7
int i = b + s; /* b e s se promovem para operar */
9 System.out.println( i );
11 float f = 3; /* Promocao Implicita */
System.out.println( f );
13
double d = 3 / 2; /* Promocao Implicita do Resultado */
15 System.out.println( d );
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 96 / 527
Java – Tipos Básicos
Constantes caractere de barra invertida
Para a maioria dos caracteres, as aspas simples funcionam
bem, porém para enter, tab, esc seria bem complicado
representá-los, uma vez que são teclas de ação. Por isto,
Java definiu as constantes especiais de barra invertida
Constantes especiais mais utilizadas
\n Nova Linha
\r Retorno de Carro (CR)
\t Tabulação horizontal
\’ Aspas Simples
\" Aspas Duplas
\\ Barra Invertida
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 97 / 527
Java
Operadores
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 98 / 527
Java – Operadores
Quatro classes de operadores:
Aritméticos
Relacionais
Lógicos
Bit a bit
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 99 / 527
Java – Operadores
Tabela de Prioridades
RicardoTerra (rterrabh@gmail.com) POO 11 de março de 2013 100 / 527
Java – Operadores
Operadores Artiméticos
+
-
∗
/
% (corresponde ao mod do Pascal)
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 101 / 527
Java – Operadores
Prioridades e Associatividades normais
Parê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 inteira
Ex: 4 % 2 = 0 e 5 % 2 = 1
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 102 / 527
Java – Operadores
Operadores Aritméticos em Atribuições Compostas
Em geral, os operadores aritméticos possuem um operador
de atribuição correspondente:
Exemplo:
A = A + 2 ↔ A += 2
Outros:
-=
*=
/=
%=
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 103 / 527
Java – Operadores
Exemplo de operadores de atribuição compostos
public static void main( String[] args ) {
2 int valor = 10;
4 valor += 10;
System.out.printf("%d", valor); /* valor: 20 */
6
valor -= 10;
8 System.out.printf("%d", valor); /* valor: 10 */
10 valor *= 5;
System.out.printf("%d", valor); /* valor: 50 */
12
valor /= 10;
14 System.out.printf("%d", valor); /* valor: 5 */
16 valor %= 3;
System.out.printf("%d", valor); /* valor: 2 */
18 }
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 104 / 527
Java – Operadores
Operadores Aritméticos de incremento e decremento
++ (incrementa 1)
-- (decrementa 1)
Exemplos:
A = A + 1 ↔ A += 1 ↔ A++ ↔ ++A
A = A - 1 ↔ A -= 1 ↔ A-- ↔ --A
Posicionamento (vale para ++ e para --)
++ após a variável:
pós-incremento (retorna e incrementa)
++ antes da variável:
pré-incremento (incrementa e retorna)
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 105 / 527
Java – Operadores
Exemplos
1 int i = 0;
System.out.printf("%d", i++);
System.out.printf("%d", i);
System.out.printf("%d", --i);
2 int i = 0;
System.out.printf("%d", ++i);
System.out.printf("%d", i);
System.out.printf("%d", i--);
System.out.printf("%d", i);
Pergunta-se
Qual a saída de cada printf?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 106 / 527
Java – Operadores
Entendeu mesmo?
1 public static void main( String[] args ) {
int i = 0;
3 System.out.printf( "%d", i++ );
System.out.printf( "%d", i-- );
5 System.out.printf( "%d", --i );
System.out.printf( "%d", i );
7
i = 6;
9 System.out.printf( "%g", ++i / 2.0 );
}
Pergunta-se
Qual a saída de cada printf?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 107 / 527
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 curto
circuito que fazem com que a expressão só seja analisada
até que seja possível determinar o resultado
São eles: && (and) e || (or)
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 108 / 527
Java – Operadores
Operadores Lógicos de Curto Circuito
Ao encontrarem um valor que determine seu resultado, não
testam 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 booleano
a() & b()→ executa os dois métodos para obter o
resultado
a() | b()→ executa os dois métodos para obter o
resultado
a() && b()→ se o método a retornar false, o resultado
será false e o método b nem será executado
a() || b()→ se o método a retornar true, o resultado
será true e o método b nem será executado
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 109 / 527
Java – Operadores
Entendeu mesmo?
private static boolean a() { return false; }
2
private static boolean b() { return true; }
4
private static boolean c() { return false; }
6
private static boolean d() { return true; }
8
public static void main( String[] args ) {
10 System.out.printf( "%d", a() & b() & c() & d() );
System.out.printf( "%d", a() && b() && c() && d() );
12 System.out.printf( "%d", a() || b() || c() || d() );
}
Pergunta-se
Quais métodos serão executados e qual o retorno dos printf’s
das linhas 10, 11 e 12?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 110 / 527
Java – Operadores
Tiro no pé!
1 public static void main( String[] args ) {
int a = 0;
3 if ( a != 0 & 2 / a > 5 ) {
System.out.println( "OK" );
5 } else {
System.out.println( "NOK" );
7 }
}
Pergunta-se
O programa acima apresenta um erro fatal. Como evitá-lo?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 111 / 527
Java – Operadores
Operadores bit a bit:
& (and)
Ex: 3 & 1 ↔ 0011 & 0001 ↔ 0001 ↔ 1
| (or)
Ex: 3 | 1 ↔ 0011 | 0001 ↔ 0011 ↔ 3
ˆ (xor)
Ex: 3 ˆ 1 ↔ 0011 ˆ 0001 ↔ 0010 ↔ 2
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 112 / 527
Java – Operadores
Operadores bit a bit:
~ (complemento de um)
Ex: 3 ↔ ˜0011 ↔ 1100 ↔ 12
<< (deslocamento à esquerda)
Ex: 4 << 1 ↔ 0100 << 1 ↔ 1000 ↔ 8
>> (deslocamento à direita)
Ex: 4 >> 1 ↔ 0100 >> 1 ↔ 0010 ↔ 2
>>> (deslocamento à direita com sinal)
Ex: -127 >>> 1 ↔ 2147483584
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 113 / 527
Java – Operadores
Desafio
public static void main( String[] args ) {
2 int x = 10, y = -2;
4 System.out.println( (-2 * -1) << 3 );
6 System.out.println( ++x - --y + ((x >> 3) << 2) );
8 System.out.println( (x % 5) << ((4 % 2) + 4) );
}
Pergunta-se
Qual a saída de cada printf?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 114 / 527
Java – Operadores
Exercícios
10 & 13 ?
10 | 13 ?
10 ˆ 13 ?
0 ?
8 » 1 ?
2 « 2 ?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 115 / 527
Java
Comandos condicionais
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 116 / 527
Java – Comandos condicionais
Comandos condicionais (if, switch e operador ternário)
Comando condicionais são aqueles que dependendo de
uma condição executam um bloco, caso a condição não
seja atendida, o bloco não será executado
Java provê suporte a três comandos condicionais:
if
switch
operador ternário (? :)
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 117 / 527
Java – Comandos condicionais
Comandos condicionais - if
Sintaxe do comando if
if ( condicao ) {
comando1;
comando2;
comando3;
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 118 / 527
Java – Comandos condicionais
Observações:
Os parênteses que envolvem a condição são
OBRIGATÓ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 for
verdadeira
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 119 / 527
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ços
independente do número de comandos
Melhor indentação do código
if ( true ) comando;
equivale a:
if ( true ) {
comando;
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 120 / 527
Java – Comandos condicionais
Comandos condicionais - if
Como faço o conhecido:
se verdade então . . . senão . . .
if ( condicao ) {
comando1;
comando2;
comando3;
} else {
comando4;
comando5;
comando6;
}
Pergunta-se
Quais comandos serão executados se a condição for
verdadeira? E se for falsa?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 121 / 527
Java– Comandos condicionais
Comandos condicionais - if
1 int a = Teclado.lerInteger( "Digite a" );
int b = Teclado.lerInteger( "Digite b" );
3
if ( a >= b ) {
5 System.out.printf( "%d e maior ou igual a %d!", a, b );
} else {
7 System.out.printf( "%d e menor que %d!", a, b );
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 122 / 527
Java – Comandos condicionais
Comandos condicionais - if
Comando if podem ser aninhados
1 int nota = Teclado.lerInteger( "Digite uma nota de 0 a 100" );
3 if ( nota >= 90 ) {
System.out.println( "Nota A" );
5 } else if ( nota >= 80 ) {
System.out.println( "Nota B" );
7 } else if ( nota >= 70 ) {
System.out.println( "Nota C" );
9 } else {
System.out.println( "Reprovado" );
11 }
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 123 / 527
Java – Comandos condicionais
Exemplo if
char op = Teclado.lerChar( "Digite um operador (+-/*)" );
2
if ( op == ’+’ || op == ’-’ ) {
4 System.out.println( "Op. Baixa Prioridade.\n" );
} else if ( op == ’/’ || op == ’*’ ) {
6 System.out.println( "Op. Alta Prioridade.\n" );
} else {
8 System.out.println( "Caractere Invalido!\n" );
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 124 / 527
Java – Comandos condicionais
Comandos condicionais - switch
Na instrução switch, uma variável de tipo primitivo char ou
int é comparada com cada valor em questão. Se um
valor coincidente é achado, a instrução (ou instruções)
depois do teste é executada
Sintaxe:
switch( variavel ){
case 1: comandoA; break;
case 2: comandoB; break;
case 3: comandoC; break;
default: comandoPadrao;
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 125 / 527
Java – Comandos condicionais
Comandos condicionais - switch
Se 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, é executado
tudo em seguida
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 126 / 527
Java – Comandos condicionais
Comandos condicionais - switch
char letra = ’B’;
2
switch ( letra ) {
4 case ’A’: System.out.println( "Entrou em A" ); break;
case ’B’: System.out.println( "Entrou em B" );
6 case ’C’: System.out.println( "Entrou em C" ); break;
case ’D’: System.out.println( "Entrou em D" ); break;
8 default: System.out.println( "Entrou em Default" );
}
Pergunta-se
Qual a saída?
E se o valor de letra fosse ’C’? E se fosse ’a’?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 127 / 527
Java – Comandos condicionais
Comandos condicionais - switch
char letra = ’B’;
2
switch ( letra ) {
4 default: System.out.println( "Entrou em Default");
case ’A’: System.out.println( "Entrou em A" ); break;
6 case ’B’: System.out.println( "Entrou em B" ); break;
case ’C’: System.out.println( "Entrou em C" ); break;
8 case ’D’: System.out.println( "Entrou em D" ); break;
}
Pergunta-se
Qual a saída?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 128 / 527
Java – Comandos condicionais
Comandos condicionais - switch
char letra = ’b’;
2
switch ( letra ) {
4 case ’A’: System.out.println( "Entrou em A" ); break;
case ’B’: System.out.println( "Entrou em B" ); break;
6 default: System.out.println( "Entrou em Default");
case ’C’: System.out.println( "Entrou em C" ); break;
8 case ’D’: System.out.println( "Entrou em D" ); break;
}
Pergunta-se
Qual a saída?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 129 / 527
Java – Comandos condicionais
Exemplo switch
char op = Teclado.lerChar( "Digite um operador (+-/*)" );
2
switch (op){
4 case ’+’:
case ’-’: System.out.println( "Op. Baixa Prioridade.\n" ); break;
6 case ’*’:
case ’/’: System.out.println( "Op. Alta Prioridade.\n" ); break;
8 default: System.out.println( "Caractere Invalido!\n" );
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 130 / 527
Java – Comandos condicionais
Comandos condicionais - Operador Ternário
Existem situações cujo uso do if não é “elegante”
Por exemplo, suponha que a função max retorne o maior
número dentre os dois passados via parâmetros formais
private static int max( int a, int b ) {
2 if ( a > b ) {
return a;
4 } else {
return b;
6 }
}
8
public static void main( String[] args ) {
10 System.out.printf( "%d", max( 3, 7 ) );
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 131 / 527
Java – Comandos condicionais
Comandos condicionais - Operador Ternário
O operador ternário é uma expressão, significando que ele
devolve um valor
O operador ternário é muito útil para condicionais (curtas e
simples) e tem o seguinte formato:
variável = <condição> ? seTrue : seFalse;
A condição pode estar envolvida entre parênteses para
facilitar a leitura, contudo não é obrigatório
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 132 / 527
Java – Comandos condicionais
Exemplos:
int a = 2;
int b = 3;
int c = ( a > b ) ? a : b;
Indica que se a for maior que b, c recebe o valor de a, caso
contrário, c recebe o valor de b, isto é, c recebe o maior
valor (a ou b)
Pergunta-se
Qual o valor das variáveis abaixo:
int peso = ( 2 != 2 ) ? 80 : 63;
char letra = ( 1 == 1 ) ? ’R’ : ’T’;
String result = ( max( a, b ) > 10 ) ? "a ou b > 10" : "a e b < 10";
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 133 / 527
Java – Comandos condicionais
Comandos condicionais - Operador Ternário
Não necessariamente o retorno do operador ternário deve
ser atribuído a uma variável
Por exemplo, seu retorno pode ser o retorno de uma função
como faz a função max com operador ternário:
private static int max( int a, int b ) {
return (a > b) ? a : b;
}
Ou mesmo o retorno pode servir como parâmetro de
chamada de uma função:
System.out.println( (a > b) ? "a maior!" : "b maior!" );
System.out.printf( "%d", (a > b) ? a : b );
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 134 / 527
Java
Comandos de repetição
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 135 / 527
Java – Comandos de repetição
Comandos repetição (while, do...while e for)
Comandos de repetição são utilizados para repetir um
bloco de código
Java provê suporte a três comandos de repetição:
while (enquanto)
do...while (faça...enquanto)
for (para)
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 136 / 527
Java – Comandos de repetição
Comandos repetição - while
O comando while é utilizado para repetir um bloco de
acordo com uma condição
É considerado um loop de pré-teste
Isto é, testa a condição antes de executar o bloco
Sintaxe:
while ( condicao ) {
comando1;
comando2;
comandoN;
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 137 / 527
Java – Comandos de repetição
Comandos repetição - while
int i = 0;
while ( i < 10 ) {
System.out.printf( "%d", ++i );
}
Pergunta-se
Qual a saída?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 138 / 527
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 se
verifica a condição
Geralmente, é utilizado quando se deseja testar a
condição somente a partir da segunda iteração
Por exemplo, uma leitura da opção de um menu. Pede para
digitar uma primeira vez. Somente se não digitar uma opção
válida que pede para digitar novamente
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 139 / 527
Java – Comandos de repetição
Sintaxe:
do {
comando1;
comando2;
comandoN;
} while ( condicao );
Observe o ponto-e-vírgula após os parênteses dacondição. Não o esqueça!
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 140 / 527
Java – Comandos de repetição
Comandos repetição - do...while
1 int i = 0;
3 do {
System.out.printf( "%d", ++i );
5 } while ( 1 != 1 );
Pergunta-se
Qual a saída?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 141 / 527
Java – Comandos de repetição
Exemplo
int i;
2
do {
4 i = Teclado.lerInteger( "Digite um numero entre 0 e 10: " );
} while ( i < 0 || i > 10 );
6
System.out.printf( "Numero digitado: %d\n", i );
Pergunta-se
Qual a saída?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 142 / 527
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. Se
verdadeira, o bloco é executado. Se falsa, é finalizado
Operação : executado sempre ao término de cada iteração
Sintaxe
for ( inicializacao ; condicao ; operacao ) {
comando1;
comando2;
...
comandoN;
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 143 / 527
Java – Comandos de repetição
Exemplo
for ( int i = 0; i < 10; i++ ) {
2 System.out.printf( "%d", i );
}
Pergunta-se
Qual a saída?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 144 / 527
Java – Comandos de repetição
Sintaxe
No laço for, a inicialização, condição e operação são
todas opcionais
Exemplo
int i = 0;
2
for ( ; ; ) { /* Sem condicao, admite-se sempre verdade */
4 System.out.printf( "%d", ++i );
}
Pergunta-se
Qual a saída?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 145 / 527
Java – Comandos de repetição
Comandos de repetição - for
Podemos ter um for dentro de outro, e outro dentro de
outro, e outro dentro de outro...
for ( int i = 0; i <= 2; i++ ) {
2 for ( int j = 0; j < 2; j++ ) {
System.out.printf( "%d %d", i, j );
4 }
}
Pergunta-se
Qual a saída?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 146 / 527
Java – Comandos de repetição
Comandos de repetição - for
Um comando for pode ter várias inicializações, uma
condição complexa e várias operações
Exemplo
for ( int i = 1, d = 2 * i; i <= 10 || d == 22; i++, d = i * 2 ) {
2 System.out.printf( "%d - %d\n", i, d );
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 147 / 527
Java – Comandos de repetição
Comando break
Inserido dentro de um bloco de repetição (pode também
ser while ou do...while)
Caso seja executado, o bloco de repetição é finalizado
Exemplo
int i = 0;
2
for ( ; i < 10; i++ ) {
4 if ( i == 3 ) {
break;
6 }
System.out.printf( "%d", i );
8 }
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 148 / 527
Java – Comandos de repetição
Comando continue
Inserido dentro de um bloco de repetição
Caso seja executado, a iteração atual do bloco de
repetição é interrompida e parte para a próxima iteração
Exemplo
1 for ( int i = 0; i < 10; i++ ) {
if ( i == 3 || i == 5 ) {
3 continue;
}
5 System.out.printf( "%d", i );
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 149 / 527
Java – Comandos de repetição
Comando de repetição - for
Logicamente, pode-se utilizar break e continue
conjuntamente
Exemplo
1 for ( int i = 0; i < 3; i++ ) {
if ( i == 1 ) {
3 continue;
}
5 for ( int j = 0; j < 2; j++ ) {
System.out.printf( "%d %d\n", i, j );
7 break;
}
9 }
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 150 / 527
Java – Comandos de repetição
Comando de repetição rotulados
Como Java não possui a instrução goto, ele permite que
rotule um loop com um nome e assim aplique operações
como break e continue sobre um loop específico, isto é,
que não seja o mais interno
Por exemplo, dependendo uma certa condição de um
bloco mais interno, você quer quebrar ou continuar a partir
do bloco mais externo
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 151 / 527
Java – Comandos de repetição
Exemplo
externo:
2 for (int i = 0; i < 3; i++ ) {
for (int j = 0; j < 3; j++ ) {
4 if ( i == 1 && j == 1 ) {
break externo;
6 }
System.out.printf( "%d %d\n", i, j );
8 }
}
Pergunta-se
Qual a saída?
E se fosse simplesmente break?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 152 / 527
Java – Comandos de repetição
Comandos de repetição – foreach
Existe uma sintaxe para o comando for específica para
iteração de arranjos, coleções etc
Esse for é conhecido como foreach e é abordado logo
que falarmos sobre arranjos
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 153 / 527
Java
Arranjos
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 154 / 527
Java – Arranjos
Arranjos - Conceito
Arranjos – também conhecidos como vetor, array etc – são
coleçõ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 de
caracteres ou um arranjo de arranjo de pontos flutuantes
Contudo, não se pode ter um arranjo que contenha inteiros
e pontos flutuantes
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 155 / 527
Java – Arranjos
Arranjos - Declaração
Declaração:
int notas[]; /* Arranjo de inteiros */
char letras[]; /* Arranjo de caracteres */
String nomes[]; /* Arranjo de strings */
A ordem dos colchetes não importa, só não pode ser antes
do tipo:
String nomes[];
String []nomes;
String[] nomes;
[]String nomes; /* ERRADO */
Observe que isso é só a declaração, isto é, não é alocado
espaço algum para os elementos do arranjo
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 156 / 527
Java – Arranjos
Arranjos - Instanciação
Instanciação utilizando o operador new:
int notas[] = new int[5]; /* Alocado 5 inteiros */
char letras[] = new char[10]; /* Alocado 10 caracteres */
String nomes[] = new String[100]; /* Alocado 100 strings */
Ao contrário de linguagens como C, os elementos do
arranjo SÃO inicializados automaticamente como a seguir:
Inteiros Flutuantes Boolean Objetos
Inicializados
com:
0 0.0 false null
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 157 / 527
Java – Arranjos
Arranjos - Instanciação
Pode-se inicializar um arranjo já inserindo valores:
int notas[] = { 1, 2, 3, 4, 5 };
char letras[] = { ’A’, ’B’, ’C’ };
String nomes[] = { "Ricardo", "Virgílio", "Ralph" };
A notação acima é mais simples, contudo pode ser mais
formal:
int notas[] = new int[] { 1, 2, 3, 4, 5 };
char letras[] = new char[] { ’A’, ’B’, ’C’ };
String nomes[] = new String[] { "Ricardo", "Virgílio", "Ralph" };
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 158 / 527
Java – Arranjos
Arranjos - Declaração
Um arranjo de tamanho n, tem suas posições indexadas de
0 a n-1. Exemplo:
int notas[] = {8,7,8,9,3};
notas[3] = 7;
System.out.printf("%d",notas[4]);
Para obter o tamanho de um arranjo, basta utilizar o
atributo lenght. Exemplo:
int tam = notas.length;
Caso se indexe uma posição não válida, uma exceção em
tempo de execução (ArrayIndexOutOfBoundsException)
é ativada e possivelmente o aplicativo será abruptamente
encerrado
Veremos exceções mais a frente
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 159 / 527
Java – Arranjos
Declarando, inicializando e iterando um arranjo de inteiros
1 int notas[] = new int[5];
3 for ( int i = 0; i < notas.length; i++ ) {
notas[i] = Teclado.lerInteger( "Digite notas[" + i + "]" );
5 }
7 for ( int i = 0; i < notas.length; i++ ) {
System.out.printf( "notas[%d] = %d\n", i, notas[i] );
9 }
Ricardo Terra(rterrabh@gmail.com) POO 11 de março de 2013 160 / 527
Java – Arranjos
Declarando, inicializando e iterando um arranjo de strings
String nomes[] = new String[5];
2
for ( int i = 0; i < nomes.length; i++ ) {
4 nomes[i] = Teclado.lerString( "Digite nomes[" + i + "]" );
}
6
for ( int i = 0; i < nomes.length; i++ ) {
8 System.out.printf( "nomes[%d] = %s\n", i, nomes[i] );
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 161 / 527
Java – Arranjos
Arranjos - Acesso aos elementos
Arranjos permite recuperar ou alterar qualquer um de seus
elementos
Os arranjos em Java sempre iniciam-se na posição 0
Isto indica que ele termina em uma posição inferior ao
tamanho (n-1)
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 162 / 527
Java – Arranjos
Exemplo
char letras[] = new char[10];
2
letras[0] = ’A’; /* Atribui a 1a posicao do arranjo */
4 System.out.printf( "%c", letras[0] ); /* Imprime a 1a posicao */
6 letras[1] = ’B’;
letras[2] = ’C’;
8 /* ... */
letras[9] = ’H’;
10 letras[10] = ’I’; /* ERRO */
O erro acima ativa uma exceção do tipo
ArrayIndexOutOfBoundsException. Isso pode alterar o
funcionamento normal do programa ou até mesmo
“derrubá-lo”
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 163 / 527
Java – Arranjos
Arranjos Multidimensionais
Pode-se criar um arranjo de arranjos
O mais comum é o bidimensional que vemos como uma
matriz
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 0
0 1 2
2 3 4
0 6 7
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 164 / 527
Java – Arranjos
Arranjo Bidimensional - Exemplo
Criando uma matriz 3x2, zerando e setando valores
1 int matriz[][] = new int[3][2]; /* Declara uma matriz 3x2 */
3 for ( int i = 0; i < matriz.length; i++ ) {
for ( int j = 0; j < matriz[i].length; j++ ) {
5 matriz[i][j] = 0;
}
7 }
9 matriz[0][0] = 1; /* Atribui o valor 1 ao canto superior esquerdo */
matriz[2][1] = 7; /* Atribui o valor 7 ao canto inferior direito */
matriz
1 0
0 0
0 7
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 165 / 527
Java – Arranjos
Arranjo Bidimensional – Curiosidade
Pode-se criar uma matriz com cada linha de um tamanho
1 int matriz[][]= new int[3][]; /* Cria uma matriz com 3 linhas */
matriz[0]= new int[4]; /* Atribui 4 colunas a linha 0 */
3 matriz[1]= new int[1]; /* Atribui 1 colunas a linha 1 */
matriz[2]= new int[2]; /* Atribui 2 colunas a linha 2 */
matriz
0 0 0 0
0
0 0
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 166 / 527
Java – Arranjos
Exemplo Completo
Leitura de cada elemento de uma matriz 2x3 e posterior
impressão
1 int matriz[][] = new int[2][3];
3 for ( int i = 0; i < matriz.length; i++ ) {
for ( int j = 0; j < matriz[i].length; j++ ) {
5 matriz[i][j] = Teclado.lerInteger(
"Digite matriz[ " + i + "]" + "[" + j + "]" );
7 }
}
9
for ( int i = 0; i < matriz.length; i++ ) {
11 for ( int j = 0; j < matriz[i].length; j++ ) {
System.out.printf( "%d\t", matriz[i][j] );
13 }
System.out.println();
15 }
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 167 / 527
Java – Arranjos
Comandos de repetição – foreach
Para iterar um arranjo ou uma coleção, geralmente
fazemos um for bem conhecido:
String nomes[] = { "Ricardo", "Virgilio", "Ralph" };
for ( int i = 0; i < nomes.length; i++ ) {
String nomeAtual = nomes[i];
System.out.println( nomeAtual );
}
Como esse era um for bem comum, Java provê o foreach
que é um for com sintaxe simplificada:
String nomes[] = { "Ricardo", "Virgilio", "Ralph" };
for ( String nomeAtual : nomes ) {
System.out.println( nomeAtual );
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 168 / 527
Java
Métodos
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 169 / 527
Java – Métodos
Até agora, estamos trabalhando com a linguagem Java
como se fosse uma linguagem estruturada, isto é, sem a
orientação a objetos
Criamos uma classe com o método main e fazemos tudo
dentro desse método
No entanto, mesmo sem termos aprofundado nos conceitos
de POO, seria interessante para a familiarização com a
linguagem que o método main chamasse outros métodos a
fim de deixar o código fonte mais claro e organizado
Convém salientar que essa é só uma visão aplicada de
métodos quando se trabalha com Java como uma
linguagem estruturada
Quando abordarmos os conceitos de POO, vamos
aprofundar bem mais
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 170 / 527
Java – Métodos
Método
Sintaxe:
[visib] [mod] retorno nome ( < param {, param} > ) { corpo }
visib = visibilidade (private, protected ou public)
mod = modificadores (static, final, · · · )
Exemplos
private static void imprimir() { ... }
protected int dobro(int x) { ... }
public double somar(double a, double b) { ... }
private void listar(int notas[]) { ... }
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 171 / 527
Java – Métodos
Diretrizes (por enquanto)
Modificador static
Como o método main é um método estático, todos os
métodos que iremos criar, por enquanto, serão estáticos
Lembrem-se que um membro (atributo ou método) estático
só acessa membros estáticos
Visibilidade private
O método main é público, justamente porque a JVM deve
ter permissão para acessá-lo e iniciar a aplicação
Por enquanto, os métodos que vocês criarem somente serão
visíveis pela própria classe
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 172 / 527
Java – Métodos
Exemplo
1 public class Bhaskara {
3 public static void main( String[] 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 separado
para deixar o código mais legível?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 173 / 527
Java – Métodos
Exemplo
public class Bhaskara {
2
public static void main( String[] args ) {
4 ...
double d = delta( a, b, c );
6 ...
}
8
private static double delta( double a, double b, double c ) {
10 return Math.pow( b, 2 ) - 4 * a * c;
}
12 }
Resumo
Agora, delta é um método privado e estático que pode ser
invocada por qualquer método da classe Bhaskara
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 174 / 527
Java – Métodos
Um programa Java é uma coleção de classes
Classes podem conter diversos métodos
A ordem de declaração não importa (ao contrário da
linguagem C)
Pelo menos uma classe deve possuir o método estático
main
É a partir dele que a aplicação se inicia
Um método pode:
receber parâmetros
declarar variáveis locais
conter instruções executáveis
retornar um valor
ativar exceção
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 175 / 527
Java – Métodos
Exemplo
public class Soma {
2
public static void main( String args[] ) {
4 int a = 2, b = 3, total;
total = soma( a, b );
6 System.out.printf( "Soma: %d", total );
8 }
10 private static int soma( int x, int y ) {
return x + y;
12 }
14 }
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 176 / 527
Java – Métodos
Retorno de métodos
Um método pode retornar valores de qualquer tipo, exceto
outros métodos
Um método que retorna nada, deve ter seu retorno
declarado como void
A expressão que segue o return é o valor retornado
não se deve colocar parênteses
return x+y; e não return (x+y);
O valor de retorno pode ser ignorado
Término de métodos
Ao encontrar a chave de fechamento
Ao ser retornado (return)
Ao ativar uma exceção
Ricardo Terra (rterrabh@gmail.com) POO11 de março de 2013 177 / 527
Java – Métodos
Exemplo
public class ImprimeNome {
2
public static void main( String args[] ) {
4 String nome = "Ricardo";
imprimeRetornandoTamanho( nome );
6 }
8 private static int imprimeRetornandoTamanho( String nome ) {
System.out.println( nome );
10 return nome.length();
}
12
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 178 / 527
Java – Métodos
Exercícios
fatorial
escreveMaior
Recebe n e imprime: n > n-1 > n-2 > · · · > 1 > 0
retornaMenorElemento
retornaMaiorElemento
retornaMedia
Fazer com for e com foreach
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 179 / 527
Java – Métodos
Solução fatorial
1 public class Fatorial {
3 public static void main( String args[] ) {
int n = Teclado.lerInteger( "Digite n" );
5 System.out.printf( "%d! = %d", n, fat( n ) );
}
7
private static long fat( int n ) {
9 long res = 1;
if ( n == 0 || n == 1 ) {
11 return 1;
}
13 for ( int i = 2; i <= n; i++ ) {
res *= i;
15 }
return res;
17 }
19 }
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 180 / 527
Java – Métodos
Solução escreveMaior
public class EscreveMaior {
2
public static void main( String args[] ) {
4 int n = Teclado.lerInteger( "Digite n" );
escreveMaior( n );
6 }
8 private static void escreveMaior( int n ) {
for ( int i = n; i >= 0; i-- ) {
10 System.out.printf( "%d ", i );
System.out.printf( (i > 0) ? "> " : "\n" );
12 }
}
14
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 181 / 527
Java – Métodos
Solução retornaMenor
public class MenorElemento {
2
public static void main( String args[] ) {
4 int v[] = { 2, 4, 5, 1, 3 };
System.out.printf( "Menor el.: %d", retornaMenor( v ) );
6 }
8 private static int retornaMenor( int v[] ) {
int menor = v[0];
10 int tam = v.length;
for ( int i = 1; i < tam; i++ ) {
12 if ( v[i] < menor ) {
menor = v[i];
14 }
}
16 return menor;
}
18
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 182 / 527
4. POO – Conteúdo
1 Introdução 3
2 UML 22
3 Java 60
4 POO 183
Conceitos Iniciais 184
Classe java.lang.Object 213
Herança 229
Modificadores 261
Interface 291
Herança Múltipla? 307
Classe Abstrata x Interface 314
Exceção 317
5 Padrões de Projeto 356
6 Tópicos Relevantes 386
7 Materiais Complementares 417
8 Extras 498Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 183 / 527
POO
Conceitos Iniciais
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 184 / 527
POO – Conceitos Iniciais
Classe
Como já foi abordado, “uma classe encapsula
características comuns a grupos de objetos.” (Mike
O’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 é um
objeto da classe (ou instância da classe)
Em OO, uma classe é a menor unidade modular, isto é, tudo
deve estar inserido em uma classe
Uma classe possui:
Atributos (propriedades)
Construtores (um tipo especial de método para criação de objetos)
Métodos (comportamentos)
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 185 / 527
POO – Conceitos Iniciais
Declaração de uma Classe
public class Conta {
...
}
Padrão BluePrints
Classes sempre devem iniciar com a 1a letra em caixa alta.
Por exemplo:
Conta, Bhaskara ...
Demais palavras em caixa baixa salvo início de novas
palavras. Por exemplo:
GuardaChuva, ContaCorrente ...
Sempre evitem (não usem) caracteres especiais ao
programar:
_, -, ç, ã, á, ê, é ...
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 186 / 527
POO – Conceitos Iniciais
Atributo
Sintaxe:
[visib] [mod] tipo nome { = valor-inicial }
visib = visibilidade (private, protected ou public)
mod = modificadores (static, final, ...)
Exemplos
public String nome;
private double salario = 1000.00;
protected int nota;
double cor;
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 187 / 527
POO – Conceitos Iniciais
Modificadores
final
Torna o atributo imutável
static
Torna o atributo estático, isto é, pertence à classe
Exemplos
/* O cpf nunca será alterado */
private final long cpf;
/*
Taxa de rendimento compartilhada entre todos
os objetos do tipo ContaPoupanca
*/
private static double taxaRendimento;
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 188 / 527
POO – Conceitos Iniciais
Declaração de atributos na classe Conta
public class Conta {
2 private static int autoIncremento = 1;
private final int numero;
4 private double saldo;
private Correntista correntista;
6 ...
}
Padrão BluePrints
Atributos sempre devem iniciar com a 1a letra em caixa
baixa. Por exemplo:
saldo, nome ...
Demais letras em caixa baixa salvo início de novas palavras.
Por exemplo:
nomeCompleto, registroGeral ...
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 189 / 527
POO – Conceitos Iniciais
Método
Sintaxe:
[visib] [mod] retorno nome ( < param {, param} > ) { corpo }
visib = visibilidade (private, protected ou public)
mod = modificadores (static, final, · · · )
Exemplos
private static void imprimir() { ... }
public double somar(double a, double b) { ... }
private void listar(int notas[]) { ... }
Padrão BluePrints
Mesma regra de atributos
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 190 / 527
POO – Conceitos Iniciais
Declaração de métodos na classe Conta
1 public class Conta {
...
3 public int getNumero() {
return this.numero;
5 }
7 public Correntista getCorrentista() {
return this.correntista;
9 }
11 public void setCorrentista( Correntista correntista ) {
this.correntista = correntista;
13 }
15 public double getSaldo() {
return this.saldo;
17 }
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 191 / 527
POO – Conceitos Iniciais
Declaração de métodos na classe Conta
1 public boolean retirar( double valor ) {
if ( valor <= this.saldo ) {
3 this.saldo -= valor;
return true;
5 }
return false;
7 }
9 public void depositar( double valor ) {
this.saldo += valor;
11 }
13 public boolean transferir( Conta contaDestino, double valor ) {
if ( this.retirar( valor ) ) {
15 contaDestino.depositar( valor );
return true;
17 }
return false;
19 }
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 192 / 527
POO – Conceitos Iniciais
Declaração de métodos na classe Conta
public class Conta {
2 ...
public int getNumero() {
4 return this.numero;
}
6
public Correntista getCorrentista() {
8 return this.correntista;
}
10
public void setCorrentista( Correntista correntista ) {
12 this.correntista = correntista;
}
14
public double getSaldo() {
16 return this.saldo;
}
18
public boolean retirar( double valor ) {
20 if ( valor <= this.saldo ) {
this.saldo -= valor;
22 return true;
}
24 return false;
}
26
public void depositar( double valor ) {
28 this.saldo += valor;
}
30
public boolean transferir( Conta contaDestino, double valor ) {
32 if ( this.retirar( valor ) ) {
contaDestino.depositar( valor );
34 return true;
}
36 return false;
}
38 }
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 193 / 527
POO – Conceitos Iniciais
Construtor
Tipo especial de método responsável pela criação de
objetos
Por exemplo, como eu crio uma conta? Como eu crio um
correntista?
Se você não cria um construtor, Java cria um vazio para
você. Esse construtor somente permite que você crie
objetos daquela classe utilizando o operador new
Contudo, se você cria um construtor, Java não mais cria um
vazio para você
Ricardo Terra (rterrabh@gmail.com) POO

Continue navegando