p3-capÍtulo 4 – encapsulamento ,heranÇa e polimorfismo
TRANSCRIPT
Capítulo anterior ( III )
1) Campos estáticos em Classes
2) Métodos estáticos em Classes
3) Métodos get e set
4) Exercícios Práticos
CAPÍTULO IV – ENCAPSULAMENTO, HERANÇA E POLIMORFISMO
1) Encapsulamento
2) Herança
3) Polimorfismo
4) Exercícios Práticos
Encapsulamento
17 de abril de 2023 Programação Orientada por Objectos 3
Como já foi visto no capítulo 1, que
encapsulamento é a capacidade de
ocultar dados dentro de classes, permitindo
que somente operações especializadas ou
dedicadas manipulem estes dados ocultos.
Estrutura geral
17 de abril de 2023 Programação Orientada por Objectos 4
Métodos públicos
Métodos privados
Atributos públicos
Atributos privados
O encapsulamento leva a observar um objecto como uma caixa preta
Encapsulamento em Java
17 de abril de 2023 Programação Orientada por Objectos 5
O Encapsulamento numa classe é feita pelo uso de palavras
reservadas que estão associadas aos atributos e métodos da
classe.
Estes são designados por modificadores de visibilidade.
Modificadores de visibilidade são:
◦ public - permite acesso a partir de qualquer classe
◦ private - permite acesso apenas na própria classe
◦ protected - permite acesso apenas na própria classe e nas
subclasses (associado a herança!)
◦ nada
Nota: Um atributo ou método sem modificador de acesso é acessível a qualquer classe do mesmo package(pacote).
Uso dos modificadores nos Atributos
17 de abril de 2023 Programação Orientada por Objectos 6
Consequências de tornar um atributo privado
◦ Tentar aceder a um atributo privado (i.e. fora da classe) resulta
em um erro de compilação!
◦ Mas como torná-lo acessível apenas para consulta
(leitura)?
Isto é possível definindo-se um método que retorna o
atributo (na própria classe onde o atributo se encontra)
Consequências de tornar um atributo publico
◦ É possível, mas viola o encapsulamento, é aceitável no caso
dos atributos constantes (i.e. Com o modificador final)!
Modificadores de visibilidade
17 de abril de 2023 Programação Orientada por Objectos 7
public private
Atributos
Métodos
Violaencapsulamento
Reforçaencapsulamento
Proporciona Serviçosaos clientes
Suporta outrosmetodos na
classe
Herança
17 de abril de 2023 Programação Orientada por Objectos 8
Mecanismo simples e poderoso do
paradigma OO que permite que uma
nova classe seja descrita a partir de
uma classe já existente.
Herança é um mecanismo que permite
a uma classe herdar todo o
comportamento e os atributos de outra
classe.
Conceitos importantes
17 de abril de 2023 Programação Orientada por Objectos 9
Classe mãe: superclasse, classe base;
Classe filha/filho: subclasse, classe derivada;
Classe filha (mais específica) herda atributos e
métodos da classe mãe (generalizada);
Classe filha possui atributos e métodos próprios.
17 de abril de 2023 Programação Orientada por Objectos 10
Vantagens da herança
◦ Modificação de uma classe (inserção de novos
métodos e variáveis) sem mudanças na classe
original.
◦ Reutilização do código.
◦ Alteração do comportamento de uma classe.
17 de abril de 2023 Programação Orientada por Objectos 11
A partilha de recursos leva as ferramentas
melhores e produtos mais lucrativos
◦ não é necessário reinventar a roda a cada
nova aplicação.
É possível modificar uma classe para criar uma
nova classe com uma personalidade ligeiramente
diferente.
◦ diversos objectos que executam acções
diferentes, mesmo possuindo a mesma origem.
Mecanismo de Herança
17 de abril de 2023 Programação Orientada por Objectos 12
Entre uma classe e a sua superclasse, é estabelecida uma relação de especialização que
é automaticamente implementada através de um mecanismo de herança.
Este mecanismo automático de herança estabelece as seguintes propriedades entre uma
subclasse B e a sua superclasse A:
1. B herda de A todas as variáveis e métodos de instância (os atributos da classe B,
declarados como private em A , só podem ter acesso pelos métodos public de A, e não
directamente)
2. B pode definir novas variáveis e novos métodos próprios.
3. B pode redefinir variáveis e métodos herdados.
Importante:
A herança não se aplica a variáveis e métodos de classe!
.
Classe A
Classe B
Exemplo
17 de abril de 2023 Programação Orientada por Objectos 13
Pessoanomesexocomerdormir
EstudanteanoEscolar
matricularestudar
Trabalhadorcategoriafunçãotrabalharpicar cartão
superclasse(mais genérica)
subclasse(mais específica)
subclasse(mais específica)
generalização
especialização
2 Atributos2 Operações
3 Atributos4 Operações
4 Atributos4 Operações
Hierarquia de Classes
17 de abril de 2023 Programação Orientada por Objectos 14
Animal pesomover()
Avemover()
voar()
Mamífero comer()
Réptilmover()
nadar()
Object
peso é uma variável de instância que está presente em todos os objectos criadas para as classes Animal, Mamífero, Ave e Réptil.
Ave pardal = new Ave();pardal.setPeso(700);
Mamifero boi = new Mamifero();boi.setPeso(30000);boi.mover();boi.voar(); //Erro! não existe
Definir a Subclasse
17 de abril de 2023 Programação Orientada por Objectos 15
Forma geral:
◦ class <nome-da-classe> extends SuperClass
é permitido apenas uma superclasse
não há herança múltipla em Java
cada classe possui exactamente uma superclasse
excepção: java.lang.Object
caso não exista a cláusula extends, então, assume-
se que a superclasse é Object.
Classe Object
17 de abril de 2023 Programação Orientada por Objectos 16
A classe Object é uma classe que serve de
superclasse para todas as classes existentes em
Java.
Ao criar uma classe, se não for especificada
nenhuma superclasse após a palavra extends,
então a classe Object será assumida
automaticamente como superclasse.
17 de abril de 2023 Programação Orientada por Objectos 17
A classe Object define o método equals,
que serve para testar se dois objectos contém a
mesma informação (diferente do operador ==).
Como todas as classes são subclasses de
Object, eles herdam o método equals.
Construtores de Subclasses
17 de abril de 2023 Programação Orientada por Objectos 18
class Animal { double velocidade;
Animal() { velocidade = 0.0; }
void mover(double vel) { velocidade = vel; }}
class Ave extends Animal { int altura; Ave() { super(); // velocidade = 0.0 altura = 0; }
void mover (double vel) { if(altura >0) velocidade = vel; }
void voar (int alt) { altura = alt; }}
Polimorfismo
É o princípio pelo qual duas ou mais classes
derivadas de uma mesma superclasse podem
invocar métodos que têm a mesma identificação
(assinatura) mas comportamentos distintos.
A decisão sobre qual o método que deve
ser selecionado, de acordo com o tipo da classe
derivada, é tomada em tempo de execução,
através do mecanismo de late binding*.
17 de abril de 2023 Programação Orientada por Objectos 19
* Também conhecido pelos termos: dynamic binding ou run-time binding.
Onde a definição do método que será efectivamente invocado só ocorre durante a
execução do programa
No caso de polimorfismo, é necessário que os
métodos tenham exactamente a mesma identificação, sendo
utilizado o mecanismo de overriding *. Esse mecanismo de
redefinição não deve ser confundido com o mecanismo de
sobrecarga de métodos.
Importante:
- O mecanismo de late binding(ligação tardia) e o overriding
(Redefinição de métodos) constituem a chave para a
utilização do Polimorfismo.
17 de abril de 2023 Programação Orientada por Objectos 20
* Ocorre quando um método cuja assinatura já tenha sido especificada, recebe uma nova
definição (ou seja, um novo corpo) em uma classe derivada.
Exemplo:Considere uma classe Veículo com duas classes derivadas, Automóvel
e Bicicleta:
17 de abril de 2023 Programação Orientada por Objectos 21
import java.util.*;
class Veiculo {
public Veiculo() {
System.out.print("Veiculo ");
}
public void manutencao() {
System.out.println("Veiculo.manutencao ");
}
public void limpeza() {
System.out.println("Veiculo.limpeza ");
}
}
17 de abril de 2023 Programação Orientada por Objectos 22
import java.util.*;
class Automovel extends Veiculo {
public Automovel () {
System.out.print(" Automovel ");
}
public void manutencao() {
System.out.println(" Automovel.manutencao ");
}
public void limpeza() {
System.out.println(" Automovel.limpeza ");
}
}
17 de abril de 2023 Programação Orientada por Objectos 23
import java.util.*;
class Bicicleta extends Veiculo {
public Bicicleta () {
System.out.print(" Bicicleta ");
}
public void manutencao() {
System.out.println(" Bicicleta.manutencao ");
}
public void limpeza() {
System.out.println(" Bicicleta.limpeza ");
}
}
17 de abril de 2023 Programação Orientada por Objectos 24
public class Oficina {
Random r = new Random();
public Veiculo proximo() { Veiculo v;
int num= r.nextInt();
System.out.println("Valor = "+num);
if (num== 0) v = new Automovel();
else v = new Bicicleta();
return v;
}
17 de abril de 2023 Programação Orientada por Objectos 25
public void manter(Veiculo v) {
v.manutencao();
v.limpeza();
}
public static void main(String[] args) {
Oficina ofic = new Oficina();
Veiculo v;
for (int i=0; i<4; ++i) {
v = ofic .proximo();
ofic.manter(v); }
} }
Resultado Aleatório
17 de abril de 2023 Programação Orientada por Objectos 26
Valor = 1193310524
Veiculo Automovel Automovel.manutencao
Automovel.limpeza
Valor = 1087258313
Veiculo Bicicleta Bicicleta.manutencao
Bicicleta.limpeza
Valor = 1857219931
Veiculo Bicicleta Bicicleta.manutencao
Bicicleta.limpeza
Valor = 938060274
Veiculo Automovel Automovel.manutencao
Automovel.limpeza
Exercício Prático1. Criar uma estrutura hierárquica que contenha as
seguintes classes:
Veiculo (classe abstracta), Bicicleta e Automóvel.
Os métodos da classe Veiculo são todos abstractos e
possuem a seguinte assinatura:
listarVerificacoes()
ajustar()
limpar()
Estes métodos são implementados nas subclasses
Automóvel e Bicicleta. Acrescentar na classe Automóvel o
método mudarOleo()17 de abril de 2023 Programação Orientada por Objectos 27
2. Crie uma classe em Java para representar Empregados com
as propriedades mat, nome, funcao, salario e data_adm.
Todas as propriedades devem estar encapsuladas. Nenhum
objecto desta classe poderá ser criado sem matrícula. A
matrícula será fornecida sequencialmente a cada empregado
criado a partir de zero. Deverão constar também métodos de
acesso para cada uma das propriedades definidas.
Crie um método para aumentar salário a partir de um
valor percentual recebido e um método chamado toString
que retorne uma String com todas as propriedades
existentes na classe com seus respectivos valores.
17 de abril de 2023 Programação Orientada por Objectos 28
3. Faça um programa em Java para estender a classe
Empregado para Gerente. A classe Gerente deverá conter
as propriedades secretária (do tipo Empregado) e Automóvel
(String), com seus respectivos métodos de acesso. Criar
também um método para aumentar o salário do Gerente
onde o percentual incidirá sobre o salário + 0,5 * cada ano na
empresa. Criar um construtor para a classe Gerente que
acrescente as novas propriedades recebidas como
parâmetro. Ainda deverá permanecer o construtor default.
Criar também um método toString para que esta classe que
retorne uma String com todos os dados.
17 de abril de 2023 Programação Orientada por Objectos 29
4. Faça uma classe ManipulaEmpregado que tenha os
seguintes métodos:
criarEmpregados que cria um vetor com 6 Empregados,
sendo 3 deles Gerentes, com seus respectivos atributos a
partir de dados fornecidos por usuários;
listarEmpregados que liste os Empregados no array com
seus dados;
aumentarEmpregados que receba um valor percentual e
aumente o salário de todos os empregados;
localizarEmpregado que receba um empregado como
argumento e localize-o pela matricula retornando o nome
caso encontre ou a string “Empregado não localizado” caso
contrário.17 de abril de 2023 Programação Orientada por Objectos 30
5. Faça um programa que exiba um menu com as
seguintes opções:
1 – Criar Vetor de Empregados
2 – Aumentar Empregados
3 – Listar Empregados
4 – Localizar Empregado
5 - Sair
17 de abril de 2023 Programação Orientada por Objectos 31
Próximo capítulo
Java e UML
17 de abril de 2023 Programação Orientada por Objectos 32