8
votes

Une méthode dans une classe interne peut-elle accéder à une méthode de classe mère?

Je ne sais pas si mon titre de question décrit ma situation à peine, alors mes excuses si ce n'est pas le cas! Quoi qu'il en soit, disons que j'ai l'extrait de code suivant (la visibilité est comme indiqué):

(ParentClass.this).parentMethod();


2 commentaires

Vous ne pouvez pas simplement appeler parentmethod () au lieu de (parentclass.this) .parentMethod ();


"Une méthode protégée trouvée dans Parentclass" peut également être trouvée chez l'enfant, à cause de l'héritage


3 Réponses :


8
votes

Une classe intérieure non statique peut accéder à toutes les méthodes de la classe enfermante comme si c'était des méthodes propres: xxx

une classe interne statique ne peut pas, comme une classe interne statique n'est pas lié à une instance de la classe mère. Cela ne peut appeler que des méthodes statiques sur la classe jointe.

comme pour les méthodes lors de la 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 englobante (externe). < / p>

la partie intéressante est test2.super.getone () qui obtient en effet getone () à partir de test2.super , qui est un test < / code>. Ceci est juste comme Test2 accéderait à la méthode, à savoir utiliser Super bien que préfixé avec Test2 pour indiquer que vous accédez à l'espace de noms de la classe extérieure. xxx


0 commentaires

1
votes

Il n'y a aucun moyen d'accéder à "Méthode de classe parent" en Java, de manière de manière de manière de manière de manière à visibilité (sauf pour Super.parentMethod () dans la sous-classe ParentMethod () ).

C'est, si enfantClass remplace parentmethod () , il n'y a aucun moyen d'appeler parentclass.parentmethod () (contourner EnfantClass.parentMethod () ) à partir d'autres méthodes de EnfantClass .

Toutefois, si enfantClass ne remplace pas parentMethod () , cette méthode est héritée par enfantClass , afin que vous puissiez y accéder comme une méthode enfant , c'est-à-dire simplement comme parentmethod () .


0 commentaires

9
votes

Ceci 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
            }
        };
    }
}


6 commentaires

+1: Cela ne fonctionnera que si le parentclass est dans le même package que l'appelant. C'est-à-dire parce que protégé permet d'accéder aux enfants et à emballer des classes locales.


@Peter: Hmm, êtes-vous sûr? Je viens d'essayer de mettre les 3 classes dans 3 paquets différents. Je pense que cela fonctionne car le myClass in myMethod () est en fait une classe interne qui a accès aux méthodes protégées de sa classe extérieure EnfantClass , et donc le parentclass il s'étend.


@ Whitefang34, vous êtes correct. Je n'ai pas compilé mon code de test correctement.


@Peter: Vous m'avez assisté là-bas pendant une minute. J'ai presque répondu avec "bon point" et puis je pensais "attendre une minute ..." et devait y essayer :)


@ Whitefang34, je ne serais correct que si l'enfance n'a pas étendu parentclass.


Merci pour les réponses à tous, j'ai réalisé le problème dans le code d'origine. Vous avez raison, ce code compile tout simplement bien.