Você está na página 1de 21

Herança

Linguagem de Programação Orientada a Objetos


Agenda
⚫ Herança
⚫ Conversão de tipos
Herança
⚫ Mecanismo que distingue de fato OO dos outros
paradigmas de programação

⚫ Caso prático
⚫ Suponha que você tenha uma classe Aluno
⚫ Um novo requisito surge para criação da classe AlunoPos
⚫ A diferença entre AlunoPos e Aluno é que o primeiro irá
retornar suas notas em forma de conceito
Solução 1
⚫ Adicionar as informações na classe Aluno

⚫ Qual o problema?

⚫ A informação não é necessária para todo aluno


⚫ Logo, para saber se tal informação é necessária ou não,
precisaríamos usar uma flag (boolean)
⚫ Para cada método escrito na classe seria necessário
validar a flag adicionada
⚫ Com a adição de mais tipos de alunos, o problema piora
consideravelmente
Solução 1 - Inapropriada
⚫ Adicionar as informações na classe Aluno

⚫ Qual o problema?

⚫ A informação não é necessária para todo aluno


⚫ Logo, para saber se tal informação é necessária ou não,
precisaríamos usar uma flag (boolean)
⚫ Para cada método escrito na classe seria necessário
validar a flag adicionada
⚫ Com a adição de mais tipos de alunos, o problema piora
consideravelmente
Solução 2
⚫ Clonar a classe Aluno e criar a classe AlunoPos

⚫ O mesmo código estaria replicado em vários lugares

⚫ Manutenção do código fica muito difícil


Solução 2 - Inapropriada
⚫ Clonar a classe Aluno e criar a classe AlunoPos

⚫ O mesmo código estaria replicado em vários lugares

⚫ Manutenção do código fica muito difícil


Solução Apropriada - Herança
⚫ A classe AlunoPos irá herdar as características da
classe Aluno

⚫ public class AlunoPos extends Aluno { ... }

⚫ Só será necessário adicionar os dois novos atributos e


os quatro métodos de acesso

⚫ Aluno é uma superclasse e AlunoPos uma subclasse


Herança
⚫ O mecanismo de herança permite reutilizar o código
de classes existentes
⚫ Apenas novos atributos ou métodos precisam ser
definidos
⚫ Herança introduz os conceitos de:
⚫ Superclasse e Subclasse
⚫ Reuso de Código:
⚫ Tudo que a superclasse tem, a subclasse também tem
⚫ A definição de AlunoPos(subclasse) vai fazer uso da definição
de Aluno(superclasse).
⚫ Herança é um relacionamento entre classes, mas não
entre objetos distintos
Herança
⚫ Extensibilidade:
⚫ algumas operações da superclasse podem ser redefinidas na
subclasse
⚫ Comportamento:
⚫ objetos da subclasse comportam-se como os objetos da superclasse
⚫ O crédito em Poupanca deve funcionar tal como o credito em
Conta
⚫ Princípio da Substituição:
⚫ objetos da subclasse podem ser usados no lugar de objetos da
superclasse
⚫ Onde Conta é aceita, Poupança também será
Herança
⚫ Estrutura herdada:
⚫ Atributos, métodos
⚫ Tipo: o filho “é” o pai
⚫ Construtores:
⚫ não são herdados -> precisam ser implementados
na subclasse.
⚫ construtores da subclasse “sempre” utilizam algum
construtor da superclasse.
Hierarquia de Classes
Herança em Java
⚫ O reuso da definição da superclasse é feito com
extends:

public class AlunoPos extends Aluno{

//atributos especificos de AlunoPos


//construtores
//metodos especificos de AlunoPos

}
Construtores e subclasses
public class AlunoPos extends Aluno {
public AlunoPos(String nome,
int matricula,
double media) {
super(nome, matricula, media);
}
}

super chama o construtor da superclasse

se super não for chamado, o se não existir um


compilador acrescenta uma construtor default na
chamada ao construtor default: superclasse, haverá um
super() erro de compilação
Herança e a classe Object
⚫ Toda classe que você define tem uma superclasse
⚫ Se não for usado "extends", a classe estende
automaticamente a classe "Object" de Java.
⚫ A classe Object é a única classe de Java que não herda de
nenhuma outra classe: é a superclasse de todas as classes de
Java.
Classe AlunoPos
public class AlunoPos extends Aluno {

public Poupanca(String nome, int matricula,


double media) {

super(nome, matricula, media);


}

public char getConceito() {


if(this.media > 9) {
return ‘a’;
} else if(this.media > 7) {
return ‘b’;
} else {
return ‘c’;
}
}
}//nada mais precisa ser implementado
Vantagens da Herança
⚫ Redução da redundância no código
⚫ Subclasses passam a ser muito mais sucintas
⚫ Código já validado pode ser reutilizado
⚫ Uma nova classe pode ser derivada de uma superclasse
mesmo que não se possua o código-fonte dessa
⚫ O ser humano já categoriza informações dessa maneira
Cast
⚫ Conversão dinâmica de tipos
⚫ Tipos primitivos
⚫ Conversão implítica – promoção aritmética
⚫ Conversão explícita – perda de precisão
⚫ Tipos referenciados
⚫ Segue a seguinte regra: do tipo mais geral para o tipo mais
específico o cast deve ser explícito
Cast
⚫ Variáveis do tipo Aluno podem apontar para uma
AlunoPos?
⚫ Como fazer para acessar métodos específicos de AlunoPos?

//Os métodos específicos de AlunoPos


//devem ser invocados com Cast getConceito só
Aluno a;
está disponível na
a = new AlunoPos(“Jose”, 498, 8.7);
System.out.println( classe AlunoPos.
((AlunoPos) a).getConceito(); Por isso o cast para
); AlunoPos é
...
cast essencial.
Cast
⚫ Um cast compila quando:
⚫ O tipo da variável de origem e o tipo do cast estão na mesma
hierarquia
⚫ O tipo do cast é igual ou sub-tipo do tipo da variável de
destino
⚫ Um cast roda quando:
⚫ Compila
⚫ O tipo do objeto para o qual a variável de origem aponta é
igual ou sub-tipo do tipo do cast
instanceof
⚫ O operador instanceof verifica a classe de um
objeto (retorna true ou false)
⚫ Recomenda-se o uso de instanceof antes de um
cast para evitar erros em tempo de execução
⚫ Dica: instanceof corresponde à pergunta é do tipo?

Aluno a = procurar("498");
if (a instanceof AlunoPos)
System.out.print(((AlunoPos) a).getConceito());
else
System.out.print(a.getNota());
...

Você também pode gostar