2011-04-19 3 views
5

Je ne suis pas sûr si mon titre de la question décrit ma situation correctement, donc mes excuses si ce n'est pas le cas! Quoi qu'il en soit, disons que je l'extrait de code de code suivant (visibilité comme indiqué):Une méthode d'une classe interne peut-elle accéder à une méthode de classe parente?

public class ChildClass extends ParentClass { 
    // more code 
    private void myMethod() { 
     MyClass mine = new MyClass() { 
     public void anotherMethod() { 
      // insert code to access a method in ParentClass 
     } 
     }; 
    } 
} 

Est-il possible de code dans anotherMethod() pour accéder à une méthode protégée trouve dans ParentClass? Si cela est le cas, comment cela peut-il être fait?

J'ai essayé quelque chose comme ...

(ParentClass.this).parentMethod(); 

... mais évidemment cela ne fonctionne pas en raison de problèmes de portée.

+2

ne peut vous simplement appeler 'parentMethod()' au lieu de '(ParentClass.this) .parentMethod();' – Nishan

+0

'une méthode protégée trouve dans ParentClass' peut être +1 dans l'enfant, à cause de l'héritage –

Répondre

8

Cette compile bien:

class MyClass { 
} 

class ParentClass { 
    protected void parentMethod() { 
    } 
} 

class ChildClass extends ParentClass { 
    private void myMethod() { 
     MyClass mine = new MyClass() { 
      public void anotherMethod() { 
       parentMethod(); // this works 
      } 
     }; 
    } 
} 
+0

+1: Cela ne fonctionnera que si la classe parent est dans le même paquet que l'appelant. c'est-à-dire parce que 'protected 'permet l'accès aux enfants et le conditionnement des classes locales. –

+0

@Peter: Hmm, êtes-vous sûr? J'ai juste essayé de mettre les 3 classes dans 3 paquets différents. Je pense que cela fonctionne parce que le 'MyClass' dans' myMethod() 'est en fait une classe interne qui a accès aux méthodes' protected' de sa classe externe 'ChildClass', et donc la' ParentClass' qu'elle étend. – WhiteFang34

+0

@ WhiteFang34, vous avez raison. Je n'ai pas compilé correctement mon code de test. –

6

Une classe interne non statique peut accéder à toutes les méthodes de la classe englobante comme si elle était ses propres méthodes:

public class Test { 
    public int getOne() { 
     return 1; 
    } 

    public class Inner { 
     public int getEnclosingOne() { 
      return getOne(); // this works... 
     } 
    } 
} 

Une classe interne statique ne peut pas, en tant que classe interne statique n'est pas lié à un instance de la classe parent. Cela ne peut appeler que des méthodes statiques sur la classe englobante. En ce qui concerne les méthodes de prise en compte de l'héritage, une méthode dans une classe interne non statique peut utiliser toutes les méthodes de la classe (externe) englobante. La partie intéressante est Test2.super.getOne() qui obtient en effet getOne() de Test2.super, qui est un Test. C'est exactement comme si Test2 accédait à la méthode, à savoir en utilisant super avec le préfixe Test2 pour indiquer que vous accédiez à l'espace de noms de la classe externe.

public class Test2 extends Test { 

    public int getInnerOuterParentOne() { 
     Inner2 inner2 = new Inner2(); 
     return inner2.getOuterParentOne(); 
    } 
    public int getInnerOuterOne() { 
     Inner2 inner2 = new Inner2(); 
     return inner2.getOuterOne(); 
    } 

    public int getOne() { 
     return 2; 
    } 

    public class Inner2 { 
     public int getOuterOne() { 
      return getOne(); 
     } 
     public int getOuterParentOne() { 
      return Test2.super.getOne(); 
     } 
    } 

    public static void main(String[] args) { 
     Test2 test2 = new Test2(); 
     System.out.println(test2.getInnerOuterOne()); // 2 
     System.out.println(test2.getInnerOuterParentOne()); // 1 
    } 
} 
1

Il n'y a pas moyen d'accéder à « méthode de la classe parent » en Java, irrelatively à la visibilité (sauf pour super.parentMethod() dans la sous-classe de parentMethod()).

C'est, si ChildClassparentMethod() l'emporte, il n'y a pas moyen d'appeler ParentClass.parentMethod() (sans passer par ChildClass.parentMethod()) d'autres méthodes de ChildClass.

Toutefois, si ChildClass ne remplace pas parentMethod(), cette méthode est héritée par ChildClass, de sorte que vous pouvez y accéder en tant que méthode de » ChildClass, à savoir simplement parentMethod().

Questions connexes