Escolar Documentos
Profissional Documentos
Cultura Documentos
Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 1 Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 2
ALGORITMOS E
PROGRAMAÇÃO II
Herança
Modificadores de Acesso HERANÇA
Sobrescrita de Métodos
Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 3 Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 4
Herança Herança
• Ao modelar um conjunto de classes, podemos • Característica importante da programação
encontrar classes semelhantes na estrutura e no orientada a objetos:
comportamento. • Permitir a criação de novas classes com base em uma
• Solução 1: modelar as classes de forma independente
classe já existente, proporcionando reuso de software.
(duplicação de código) • Esta classe pode ser tanto uma classe própria como
• Solução 2: extrair características estruturais e
uma classe padrão do Java, ou ainda uma classe
comportamentais que sejam comuns e colocá-las em construída por outra pessoa.
classes mais gerais a partir das quais são definidas
classes mais específicas
(herança)
Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 5 Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 6
Herança Herança
• Para implementação utiliza-se a palavra extends.
• Herança é uma relação de Superclasse
- numero: int
generalização/especialização entre classes. • Exemplo: ...
• A idéia central de herança é que novas classes são public class Subclasse extends Superclasse { + Superclasse (n: int)
criadas a partir de classes já existentes. } + set (n: int)
+ get ( ): int
• Superclasse: classe já existente ...
• Notação UML
• Subclasse: classe criada a partir da superclasse Generalização
• Absorve atributos e comportamentos além de adicionar os seus próprios Subclasse
• Pode sobrescrever métodos da superclasse - dado: String
...
+ Subclasse(n: int , d: String)
+ set (d: String)
+ get ( ): String
...
1
Algoritmos e Programação II - FACIN/PUCRS 8/9/2012
Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 7 Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 8
Herança Herança
• Subclasses herdam de:
• Superclasse direta - subclasse herda explicitamente
superclasse direta de B
• Superclasse indireta - subclasse herda de dois ou mais níveis superiores superclasse indireta de C
na hierarquia de classes
subclasse direta de B
subclasse indireta de A
Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 9 Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 10
Herança Herança
• Herança cria uma estrutura hierárquica (árvore) • Herança cria uma estrutura hierárquica (árvore)
• Exemplo
• Exemplo: • Um Quadrado é uma FormaBidimensional
• Hierarquia de classes para formas geométricas • Quadrado é um tipo específico de FormaBidimensional
• FormaBidimensional é a superclasse
• Uma forma geométrica pode ser especializada em dois tipos: • Quadrado é a subclassse
bidimensional e tridimensional. • Uma FormaBidimensional é uma Forma
• FormaBidimensional é um tipo específico de Forma
• Forma é a superclasse
• FormaBidimensional é a subclasse
especialização generalização
Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 11 Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 12
Funcionário
2
Algoritmos e Programação II - FACIN/PUCRS 8/9/2012
Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 13 Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 14
Herança Herança
public class Funcionario{...}
public class Motorista extends Funcionario{...}
• Ao definir atributos da subclasse:
public class Engenheiro extends Funcionario{...} • Atributos da superclasse são herdados
• Todos os atributos da superclasse são herdados
Funcionario func;
func = new Funcionario (“João”, 20338765210); automaticamente
System.out.println(func.getNome()); func • Ex.: atributos nome e codigo de Funcionario
nome : “João” • Podemos definir novos atributos
cpf : 20338765210
Motorista mot; • Evitar criar atributos com o mesmo nome de atributos
mot = new Motorista(“José”,28765210635,00446677379,“18/02/2014”);
System.out.println(mot.getNome());
herdados
mot
System.out.println(mot.getDataExpiracao()); • Ex.: atributos numCarteira e dataExpiracao de Motorista
nome : “José”
cpf : 28765210635
numCarteira : 00446677379
dataExpiracao: “18/02/2014”
Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 15 Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 16
Herança Herança
• Ao definir métodos da subclasse: • Métodos da subclasse que foram herdados da
superclasse, continuam podendo acessar TODOS os
• Métodos da superclasse são herdados
membros da superclasse
• Os métodos são herdados automaticamente
• Ex.: métodos getNome() e getCodigo() de Funcionario
• Métodos construtores não são herdados, mas podem ser
• Podemos definir novos métodos chamados para inicializar os atributos herdados
• Ex.: métodos getNumCarteira() e getDataExpiracao() (membros da superclasse), quando necessário
de Motorista • Utiliza-se super()
• Se for chamado dessa forma, deve ser o primeiro comando do
• Podemos sobrescrever métodos da superclasse construtor da subclasse
• Novo método da subclasse é definido com o mesmo
nome e parâmetros que o método da superclasse.
Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 17 Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 18
Herança Herança
• Exemplo: public class Motorista extends Funcionario {
public class Funcionario { private int numCarteira;
private String nome; private String dataExpiracao;
private int cpf; public int getNumCarteira() {
public Funcionario(String n, int c) { return numCarteira;
nome = n; }
cpf = c; public String getDataExpiracao() {
return dataExpiracao;
}
}
public String getNome() {
public Motorista(String n, int c, int nc, String d) {
return nome;
nome = n;
} Não podem ser acessados
cpf = c;
public int getCpf() { numCarteira = nc; diretamente, pois são private!
return cpf; dataExpiracao = d;
} }
} }
3
Algoritmos e Programação II - FACIN/PUCRS 8/9/2012
Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 19 Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 20
Herança Herança
• Subclasse tem acesso a todos os métodos públicos da public class Engenheiro extends Funcionario {
superclasse private int numCrea;
• Podemos utilizar o construtor da superclasse para inicializar public Engenheiro(String n, int c, int nc) {
os atributos herdados super(n,c);
• Utiliza-se super() como primeiro comando do construtor da numCrea = nc;
subclasse }
• Utilização obrigatória public int getNumCrea() {
return numCrea;
public Motorista(String n, int c, int nc, String d) { }
super(n, c); }
numCarteira = nc; Construtor da superclasse
dataExpiracao = d; inicializa os atributos herdados
} (utilização obrigatória)!
Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 21 Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 22
Herança Herança
• Hierarquia de Classes: • Hierarquia de Classes:
• Em Java, todas as classes herdam diretamente ou indiretamente • Toda classe criada sem explicitar uma superclasse, herda
da classe Object implicitamente da superclasse Object
• Object é o topo da hierarquia de classes em Java
public class Ponto { ... }
é equivalente a
Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 23 Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 24
Herança Herança
• Exemplo
• Estudo de caso
• Problema pode ser resolvido através da seguinte modelagem de
• Os professores de uma universidade dividem-se em 2 categorias
classes:
• professores em dedicação exclusiva (DE)
• professores horistas ProfHorista
• Professores em dedicação exclusiva possuem um salário fixo para 40 - nome: String
ProfDE
horas de atividade semanais - matricula: String
• Professores horistas recebem um valor estipulado por hora - nome: String - idade: int
- matricula: String - totalHoras: int
• O cadastro de professores desta universidade armazena o nome, idade,
- idade: int - salarioHora: float
matrícula e informação de salário
- salario: float
• Problema pode ser resolvido através de uma modelagem de classes + ProfHorista (n: String,
como segue: + ProfDE (n: String, m: String, m: String, i: int, t: int, s: float)
i: int, s: float) + getNome ( ) : String
+ getNome ( ) : String + getMatricula ( ) : String
+ getMatricula ( ) : String + getIdade ( ) : int
+ getIdade ( ) : int + getHoras ( ) : int
+ getSalario ( ) : float + getSalario ( ) : float
4
Algoritmos e Programação II - FACIN/PUCRS 8/9/2012
Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 25 Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 26
Professor
Herança Herança - nome: String
- matricula: String
- idade: int
• Analisando a solução apresentada...
• As classes têm alguns atributos e métodos iguais.
+ Professor (n: String, m: String,
i: int)
• O que acontece se precisarmos alterar a representação de algum + getNome ( ) : String
atributo, como por exemplo, o número de matrícula para inteiros ao invés + getMatricula ( ) : String
de uma string ? + getIdade ( ) : int
• Será necessário alterar os construtores e os métodos getMatricula() nas + getSalario ( ) : float
duas classes, o que é ruim para a programação
• Motivo: código redundante
ProfDE ProfHorista
• Como resolver ? Herança!
- salario: float - totalHoras: int
- salarioHora: float
+ ProfDE (n: String, m: String,
i: int, s: float) + ProfHorista (n: String,
+ getSalario ( ) : float m: String, i: int, t: int, s: float)
+ getHoras ( ) : int
+ getSalario ( ) : float
Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 27 Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 28
Modificadores de Acesso
• As classes são agrupadas em conjuntos
chamados packages (pacotes), sendo que cada
um é guardado em um diretório diferente.
• Exemplo: o pacote java.util está armazenado no
MODIFICADORES DE diretório java/util.
• Para usar um pacote:
ACESSO import java.util.*;
Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 29 Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 30
Pacote1
private somente dentro da própria classe
5
Algoritmos e Programação II - FACIN/PUCRS 8/9/2012
Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 31 Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 32
Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 33 Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 34
Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 35 Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 36
Modificadores de Acesso
Conta
+ numero: int
# saldo: float
- senha: String
- saldoInicial: float = 0.0
+ depositar (valor: float)
6
Algoritmos e Programação II - FACIN/PUCRS 8/9/2012
Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 37 Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 38
Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 39 Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 40
Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 41 Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 42
7
Algoritmos e Programação II - FACIN/PUCRS 8/9/2012
Sobrescrita de Método
• A classe Engenheiro pode sobrescrever o método
equals()de Funcionario: