2017-04-21 3 views
0

le code ci-dessous Tenir compte:Comment pouvons-nous appeler des méthodes substituées dans une classe anonyme java?

abstract class AbstractClass { 
    abstract m1(); 
} 

public class Test { 
    public static void main(String [] args) { 
    AbstractClass obj = new AbstractClass() { 
     @Override void m1() { 
     System.out.print("Instance of abstract class !"); 
     } 
    }; 
    obj.m1(); 
    } 
} 

Maintenant, voici ce que je ne comprenais pas sur ce code.
J'ai lu que la classe anonyme crée la classe avec un nom inconnu qui étend la classe dont la référence est fournie (ici, elle est abstraite AbstractClass).

Aussi je me souviens que nous ne pouvons pas implémenter la méthode de la classe enfant si l'objet a la référence de la classe parente.

voir bloc de code ci-dessous

Parent obj = new Child(); 
obj.methodOfParent(); 
obj.methodOfChild(); //this gives error 

Maintenant, voici mon point si Anonyme Classe étend sa classe parent dont la référence est fournie, alors comment peut-on appeler des méthodes outrepassée de la classe mère de Anonyme Classe ?

+2

Cela n'est pas très clair - demandez-vous pourquoi il est possible de faire 'obj.m1()'? –

+0

Oui, @Oliver Charlesworth –

+0

Ceci est une question incroyablement peu claire. Mais une chose qui devrait être soulignée est que 'Parent obj = new Child(); obj.methodOfParent(); 'appellera le paramètre methodOfParent de votre classe Child (qu'il hérite du parent ou remplace et fournit une nouvelle implémentation). –

Répondre

2

Il existe une différence entre l'appel d'une méthode substituée de parent et l'appel d'une méthode de child. Si une méthode est déclarée dans la classe T, vous pouvez l'appeler sur une variable statiquement typée T, quel que soit l'endroit où la méthode est réellement implémentée.

Dans votre exemple, si obj.methodOfParent() se trouve être une substitution de la méthode de Child, la méthode Child sera exécutée, même si le type statique s » est de objParent.

Même mécanisme est en cours avec les classes anonymes: la raison pour laquelle vous êtes autorisé à appeler obj.m1() est que m1() a été déclaré dans la classe parente.

1

Je suppose que vous manquez juste un point. Permettez-moi de vous montrer par exemple:

class Parent { 
    public void methodOfParent() {} 
    public void methodOfParentToBeOverriden() {} 
} 
class Child extends Parent { 
    @Override public void methodOfParentToBeOverriden() {} 
    public void methodOfChild() {} 
} 

Parent obj = new Child(); 
obj.methodOfParent(); //this is OK 
obj.methodOfParentToBeOverriden(); // this is OK too 
obj.methodOfChild(); //this gives error 
((Child)obj).methodOfChild(); //this is OK too here. 

S'il vous plaît noter que lorsque vous appelez obj.methodOfParentToBeOverriden() il sera appelé la mise en œuvre de la classe des enfants. Indépendance avez-vous jeté cet objet au type Parent ou non.