Duvida subscrição de método

1 resposta
Rulio

e ae pessoal blz ?

Olha só… Sabemos que o tipo de referência define qual método sobrecarregado chamar, certo ?
Também sabemos que o tipo de Objeto define qual método subscrito chamar, certo ?
Mas… Como essa verificação é feita em tempo de execução ?
Pelo que entendi nos meus testes, quando se tem métodos sobrescritos( everridden )você usa um tipo da superclasse como referência e extancia uma objeto do tipo da subclasse, a java em tempo de execução verifica se a classe Pai possui o método chamado e se existir ele procura a sua sobreposição na classe filha, é isso mesmo ?

Dado o exemplo abaixo:
sabemos que não vai compilar

class Base {

private  void aMethod(int base){
	System.out.println("Base");
}

}

class Over extends Base{

public static void main(String[] args){
	Base o = new Over();
	int iBase = 0;
[b]	[color=red]o.aMethod(iBase);[/color][/b]

}

public void aMethod(int iOver){
	System.out.println("Over");
}

}

Não temos aqui uma subscrição de método, tendo em vista que o método do pai é privado, então logo não será herdado…
Mas ai é que vem a duvida… Como essa verificação é feita em tempo de execução ???
Pude perceber que ele verifica primeiro se existe o método na classe Pai, se existir ele vai procurar uma correspondência na classe filha…Mas como ele não consegue enxergar o método na classe Pai, acaba dando um erro de compilação pq não pode fazer a verificação, é isso ?

Esta é uma boa duvida para os aspirantes a SCJP.

Abraços,
Rulio Vangellis.

1 Resposta

J

É o contrário, a procura é feita primeiro no objeto referenciado. Se o método for encontrado, ou seja, caso ele tenha sido sobrescrito nessa classe o método é executado…

class A{ public void metodo(){ System.out.println("Olá método super"); } } class B extends A{ public void metodo(){//esse método será executado, pois a procura é feita "debaixo pra cima". System.out.println("Olá método sub"); } } class Teste{ public static void main(String [] args){ A a = new B(); a.metodo(); } }
… caso contrário serão feitas buscas em suas superclasses até que seja encontrado o método.

class A{ public void metodo(){//esse método será executado, pois ele não foi encontrado em nenhuma das subclasses na cadeia de herança, portanto todas herdaram e não modificaram o método. System.out.println("Olá método super"); } } class B extends A{ } class C extends B{ } class Teste{ public static void main(String [] args){ A a = new C(); a.metodo(); } }

Criado 30 de março de 2008
Ultima resposta 30 de mar. de 2008
Respostas 1
Participantes 2