O documento discute herança em Java, explicando que variáveis de referência da superclasse podem apontar para objetos da subclasse e que métodos podem ser sobrescritos nas subclasses para fornecer implementações específicas. Também explica como a sobrescrita de métodos suporta polimorfismo por meio de despacho dinâmico.
ALMANANHE DE BRINCADEIRAS - 500 atividades escolares
Herança
1. Linguagem de Programação II
Ciência da Computação
1
Antes de ler este documento assista às vídeos aulas 1, 2 e 3 da Prof.ª M.ª Eng.ª Elaine Cecília Gatto
que estão disponíveis no Syllabus e Youtube. Todos os códigos fonte dos exemplos também estão
disponíveis no Syllabus.
REFERÊNCIAS DA SUPERCLASSE E OBJETOS DA SUBCLASSE
Java é uma linguagem fortemente tipada;
A compatibilidade de tipos é imposta rigorosamente;
Uma variável de referencia de um tipo de classe não pode referenciar um objeto de outro tipo de
classe;
o EXEMPLO: ExemploHerança4;
Ainda que a classe X e a classe Y sejam fisicamente iguais, não é possível atribuir a uma variável
X a referencia a um objeto Y, pois tem tipos diferentes;
Uma variável de referencia de objeto só pode referenciar objetos de seu tipo;
Há uma exceção importante à imposição rigorosa de tipos de Java;
A variável de referencia de uma superclasse pode receber a referencia a um objeto de qualquer
subclasse derivada dessa superclasse;
Uma referencia da superclasse pode referenciar um objeto da classe;
o EXEMPLO: ExemploHerança 5;
Y é derivada de X, então, é permitido que x2 receba uma referencia a um objeto Y;
É o tipo da variável de referencia que determina os membros que podem ser acessados – e não o
tipo do objeto que ela referencia;
Quando uma referência a um objeto da subclasse for atribuida a uma variavel de referencia da
superclasse, você só terá acesso às partes do objeto definidas pela superclasse;
X2 não pode acessar b mesmo quando referencia um objeto y por conta disso;
A superclasse não tem conhecimento do que uma subclasse adiciona a ela;
Um local importante em que referencias de subclasse são atribuidas a variaveis da superclasse é
quando os contrutores são chamados em uma hierarquia de classes;
2. Linguagem de Programação II
Ciência da Computação
2
É comum uma classe definir um construtor que recebe um objeto da classe como parâmetro;
Isso permite que a classe construa uma cópia de um objeto;
As subclasses de uma classe como essa podem se beneficiar desse recurso;
o EXEMPLO: ExemploHerança6;
O ponto-chave é que a classe mãe está esperando um objeto da classe mãe;
No entanto, uma classe filha passa para a classe mãe um objeto classe filha;
Isso funciona porque uma referencia da superclasse pode referenciar um objeto da subclasse;
É perfeitamente aceitável passar para a classe mãe a referencia a um objeto de uma classe
derivada da classe mãe;
Já que o construtor da classe mãe só está inicializando as partes do objeto da subclasse que são
membros da classe mãe, não importa se o objeto contém outros membros adicionados por classes
derivadas.
SOBREPOSIÇÃO DE MÉTODOS
Em uma hierarquia de classes, quando um método de uma subclasse tem o mesmo tipo de retorno
e assinatura de um método de superclasse, diz-se que o método da subclasse SOBREPÕE o
método da superclasse;
Quando um método sobreposto é chamado de dentro de uma subclasse, a referencia é sempre à
versão definida pela subclasse;
A versão do método definida pela superclasse será ocultada;
o EXEMPLO: ExemploHerança7;
Quando o método MOSTRAR() é chamado em um objeto de tipo B, a versão definida dentro de B
é usada;
A versão MOSTRAR () de B sobrepõe a versão declarada de A;
Se quiser acessar a versão de um método sobreposto definida pela superclasse, você pode fazer
isso usando SUPER;
3. Linguagem de Programação II
Ciência da Computação
3
o EXEMPLO: ExemploHerança8;
Nessa versão de B, a versão de MOSTRAR() da superclasse é chamada dentro da versão da
subclasse;
Isso permite que todas as variáveis de instância sejam exibidas;
Super. MOSTRAR() chama a versão de MOSTRAR() da superclasse;
A sobreposição de métodos só ocorre quando as assinaturas dos dois métodos são idênticas;
Se não forem, os dois métodos serão apenas sobrecarregados;
o EXEMPLO: ExemploHerança9;
A versão MOSTRAR() definida por B recebe um parametro tipo string;
Isso torna sua assinatura diferente da existente em A, que não recebe parâmetros
Então, não ocorre sobreposição ou OCULTAÇÃO de nomes.
MÉTODOS SOBREPOSTOS DÃO SUPORTE AO POLIMORFISMO
A sobreposição de métodos forma a base de um dos conceitos mais poderosos em JAVA: o
despacho dinâmico de métodos;
Despacho dinâmico de métodos é o mecanismo pelo qual a chamada a um método sobreposto é
reslvida no tempo de execução e não no tempo de compilação;
O despach dinâmico de memória é importante porque é assim que JAVA implementa o
polimorfismo no tempo de execução;
Uma variável de referência da superclasse pode referenciar um objeto da subclasse;
Java usa esse fato para resolver chamadas a métodos sobrepostos no tempo de execução;
Quando um método sobreposto é chamado por uma referencia da superclasse, JAVA determina a
versão desse método que será executada com base no tipo do objeto sendo referenciado no
momento em que a chamada ocorre;
Essa escolha é feita no tempo de execução;
Quando diferentes tipos de objetos são referenciados, versões distintas de um método sobreposto
são chamadas;
4. Linguagem de Programação II
Ciência da Computação
4
É o tipo do objeto referenciados que determina a versão de um método sobreposto que será
executada, e não o tipo da variável de referencia;
Se uma superclasse tiver um método sobreposto por uma subclasse, quando diferentes tipos de
objetos da subclasse forem referenciados por uma variável de referencia da superclasse, versões
distintas do método serão executadas;
o EXEMPLO: ExemploHerança10;
No exemplo acima são criadas dus subclasses e uma superclasse. A superclasse declara um
método chamado QUEM() e as subclasses o sobrepõem;
No main são declarados objetos e uma referencia;
O programa atribui uma referencia de cada tipo de objeto a supRef e usa essa referencia para
chamar QUEM();
A versão de QUEM() executada é determinada pelo tipo de objeto referenciado no momento da
chamada, e não pelo tipo de classe.
PORQUE SOBREPOR MÉTODOS?
Os métodos sobrepostos permite que JAVA dê suporte ao POLIMORFISMO no tempo de
execução;
O POLIMORFISMO é essencial para a programação orientada a objetos;
O POLIMORFISMO permite que uma classe geral especifique métodos que serão comuns a todos
os seus derivados;
O POLIMORFISMO permite também que as subclasses definam a implementação específica de
alguns desses métodos ou de todos eles;
Os métodos sobrepostos são outra maneira de JAVA implementar o aspecto “UMA INTERFACE,
VÁRIOS MÉTODOS”, do polimorfismo;
As superclasses e subclasses formam uma hierarquia que se move da menor para a maior
especialização;
A superclasse fornece todos os elementos que uma subclasse pode usar diretamente;
A superclasse especifica os métodos que a classe derivada deve implementar por conta própria;
5. Linguagem de Programação II
Ciência da Computação
5
À subclasse é dada a flexibilidade para definir seus próprios métodos, sem deixar de impor a
consistência da INTERFACE;
Uma superclasse pode definir a forma geral dos métodos que serão usados por todas as suas
subclasses;
o EXEMPLO: ExemploHerança11;