Você está na página 1de 8

Algoritmos e Programação II - FACIN/PUCRS 8/9/2012

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

• Todo objeto da subclasse também é um objeto da


superclasse, mas NÃO o contrário
subclasse direta de A
• A idéia na herança é “ampliar” a funcionalidade de uma superclasse direta de C
classe
• Subclasse contém tudo que a superclasse tem, além de novos atributos e
métodos

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

Herança Herança - nome: String


- cpf: int
• Subclasse herda atributos e métodos da superclasse + Funcionário (n:String, c:int)
• São tratados como membros da subclasse, isto é, como se tivessem sido + getNome ( ): String
declarados dentro da subclasse. + getCpf( ): int Não se repete a
• Nem todos os atributos e métodos da superclasse são obrigatoriamente declaração de atributos
acessíveis na subclasse, pois isto dependerá dos modificadores de acesso. e métodos herdados!
• Modificador private não permite acesso direto dentro da subclasse.

• Logo, um objeto possui seus próprios atributos e métodos,


mais os atributos e métodos da superclasse ! Motorista Engenheiro

- numCarteira: int - numCrea: int


-dataExpiração: String
+ Engenheiro (n:String, c:int, nc:int)
+ Motorista (n:String, c:int, + getNumCrea ( ): int
cm:int, d:String)
+ getNumCarteira ( ): int
+ getDataExpiração( ): String

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

public class Ponto extends Object { ... }

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

Modificadores de Acesso Modificadores de Acesso


Modificador Acesso permitido… Classe1 SubClasse1
Classe2
sem modificador de todas as classes no mesmo pacote int a;
public int b;
protected int c;
public de qualquer classe em qualquer pacote private int e;

Pacote1
private somente dentro da própria classe

Classe2 Classe1 SubClasse1


protected de todas as classes no mesmo pacote int a;
public int b;
e a partir de qualquer subclasse em
protected int c;
qualquer pacote private int e;

Pacote3 Pacote1 Pacote2

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

Modificadores de Acesso Modificadores de Acesso


• Recomendações
• Métodos que fazem a interface externa de uma classe devem ser
• Métodos na subclasse: declarados como public (sendo portanto herdados pelas
• Podem se referir diretamente a atributos public ou subclasses)
protected pelo nome. • Atributos devem ser private.
• Utiliza-se o atributo protected quando classes são definidas
• ATENÇÃO: dentro de um pacote e se deseja dar ao usuário do pacote
(desenvolvedor de classes em outro pacote) acesso apenas às
• Para derivar uma classe de fora do pacote contendo
subclasses
a superclasse, a superclasse deve ser declarada
como public. • Classes, em geral, são declaradas como public

Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 33 Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 34

Modificadores de Acesso Modificadores de Acesso


• Exceções: • Notação UML:
• private: -
• Atributos de uma classe definidos como final possuem valor
• protected: #
fixo e podem ser usados fora da classe. Assim sendo, recomenda-
• public: +
se que sejam declarados como public.
• Observações:
• Métodos que devem ser usados somente dentro da própria classe, • atributo de classe é sublinhado
devem ser especificados como private. • método de classe é sublinhado
Conta
+ numero: int
# saldo: float
- senha: String
- saldoInicial: float = 0.0
+ depositar (valor: float)
+ verificaSenha (senha: String): boolean
- geraNovoNumero(): int

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)

public class Conta {


+ verificaSenha (senha: String): boolean
- geraNovoNumero(): int SOBRESCRITA DE
public int numero; // Atributo de instância público
protected float saldo; // Atributo de instância protegido
private String senha; // Atributo de instância privado
MÉTODOS
private static float saldoInicial = 0.0; // Atributo de classe privado

public void depositar(float valor); // Método de instância

public boolean verificaSenha(String senha) { // Método de instância


}

private static int geraNumeroNovo() { // Método de classe


}
}

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

Sobrescrita de Métodos Sobrescrita de Métodos


• Uma subclasse pode sobrescrever (override) métodos da • Cuidado:
superclasse. • O nome do método, número e tipo dos parâmetros do
• Sobrescrita permite completar ou modificar um comportamento
método da subclasse devem ser o mesmo do método
herdado.
da superclasse.
• Quando um método é referenciado em uma subclasse, a versão
escrita para a subclasse é utilizada, ao invés do método na • O modificador de acesso do método da subclasse pode
superclasse. relaxar o acesso, mas não o contrário.
• É possível acessar o método original da superclasse: • Ex.: um método protected na superclasse pode ser tornado
super.nomeDoMetodo() public na subclasse mas não private.
• Uma subclasse não pode sobrescrever um método de
classe da superclasse.

Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 39 Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 40

Classe Object Sobrescrita de Método


• Já vimos que em Java, todas as classes herdam • A classe Funcionario pode sobrescrever o método
diretamente ou indiretamente da classe Object. toString()de Object:
• Alguns métodos herdados de Object: Método herdado de
Object
• String toString(): retorna uma representação de string public String toString()
do objeto
• Usualmente utilizado para realizar a depuração de programas
{
• Também é chamado implicitamente quando um objeto é utilizado em return getClass().getName()
um contexto que uma string era esperada Retorna o nome da
• Implementação original retorna o nome da classe e o código hash do
+ "[nome=" + nome + "," classe do objeto
objeto + "CPF=" + cpf + "]";
• boolean equals(Object outro): testa se o objeto }
possui o mesmo estado que outro objeto
func
• Estes métodos devem ser sobrescritos se forem
utilizados em uma subclasse! nome : “João” Funcionario[nome=Joao,CPF=20338765210]
cpf : 20338765210

Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 41 Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 42

Sobrescrita de Método Sobrescrita de Método


• A classe Motorista pode sobrescrever o método
• A classe Funcionario pode sobrescrever o método
toString() de Funcionario:
equals() de Object:
Utiliza a implementação
herdada da superclasse
public String toString() { public boolean equals(Object obj) {
return super.toString() if(obj == null) return false;
+ "[numeroCarteira=" + numCarteira + ", " if(getClass() != obj.getClass()) return false;
Funcionario outro = (Funcionario) obj;
+ "dataExpiração" + dataExpiracao +"]";
if((nome.equals(outro.nome)) && (cpf == outro.cpf))
} return true;
Motorista
else
nome : “José”
return false;
cpf : 28765210635
numCarteira : 00446677379 }
dataExpiracao: “18/02/2004”

Motorista[nome=José,CPF= 28765210635][numeroCarteira= 00446677379, dataExpiração: 18/02/2004]

7
Algoritmos e Programação II - FACIN/PUCRS 8/9/2012

Algoritmos e Programação II Professores de Alpro II - FACIN/PUCRS 43

Sobrescrita de Método
• A classe Engenheiro pode sobrescrever o método
equals()de Funcionario:

public boolean equals(Object obj) {


if(!super.equals(obj)) return false;
Engenheiro outro = (Engenheiro) obj;
if(numCrea == outro.numCrea)
return true;
else
return false;
}

Você também pode gostar