3 Mar
O que acontece quando uma classe sua implementa duas interfaces que tem um método com o mesmo nome? Compila!
interface A {
void x();
}
interface B {
void x();
}
class C implements A, B {
public void x() {
}
}
E quando sua classe herda um método que tem o mesmo nome do método de uma interface que ela implementa? Também compila!
class A {
void x(){
}
}
interface B {
void x();
}
class C extends A implements B {
public void x() {
}
}
Notem que A não precisa implementar B.
E quando você faz herança múltipla de interfaces? Mais uma que compila.
interface A {
void x();
}
interface B {
void x();
}
interface C extends A,B {
}
Essas aqui eu só acreditei na hora em que o compilador simplesmente não reclamou. Se um dia antes de eu fazer esses testes me perguntassem o que acontecia, eu falaria sem medo nenhum que não compilava. Mas compila.
Posts Relacionados:
Assine nosso RSS feed!
6 Responses for "INC - Colisão de Nomes de Métodos"
Quando eu dou essa aula no FJ-19 explico assim:
“Quando implementamos uma interface, falamos não de herança de codigo mas heranca de responsabilidade: minha classe se compromete a ter o tal metodo.
Quando duas interfaces pedem a mesma coisa, dá erro? Preciso fazer duas vezes?
Quando sua cama ficava desarrumada quando era criança e sua mãe manda voce arrumar; aí vem seu pai e também manda arrumar. Duas pessoas te deram a mesma responsabilidade, mas voce arruma duas vezes? Nao, arruma ma vez só e vc ja esta acertado com os dois.”
Ah tenta fazer 2 interfaces com mesmo nome de metodo, mas retornos diferentes. E implementar as duas na mesma classe… aí dá pau :)
Verdade, porque daí a classe teria dois métodos com a mesma assinatura mas valores de retorno diferentes (o que é inválido). Vou testar pra ver se com o retorno covariante do Java 5 isso também daria problema.
Valeu pela visita!
E o que acontece se uma classe fizer herança de duas classes que contém um método de mesmo nome? Por exemplo:
class A {
public void x() { System.out.println(”A”); }
}
class B {
public void x() { System.out.println(”B”); }
}
class C extends A, B {
}
O que acontece? Compila? Se compilar, chama o x de qual superclasse?
Oi Luiz,
Esse é exatamente um dos problemas da herança múltipla, onde você não herda só responsabilidade, mas também comportamento!
Não dá para saber intuitivamente de quem você herda a operação. Precisa de alguma definição explícita, ou alguma regra semântica da linguagem.
O Sérgio explicou muito bem.
Mas é preciso lembrar sempre que “interface” é um classe que tem métodos abstratos - não implementados.
Portanto, se você herdar e/ou implementar dois métodos abstratos iguais (assinaturas iguais) você não precisa codificar duas vezes.
Se as assinaturas são diferentes, os métodos não são iguais.
Com relação a herança multipla, fiquei na dúvida… Como o Fábio falou é um problema! Pode até compilar mas de quem herda?!
Será que segue alguma ordem de declaração?! class C extends A, B {}
Gostei do post, deu até vontade de voltar a estudar Java!
Olá Luiz,
Esse é um dos motivos pelos quais Java não permite herança múltipla (vai dar erro de compilação). Em C , onde é permitido, vai depender do compilador que você usa (terrível!) porque isso não está (ou estava) bem especificado.
Leave a reply