Maison > Questions et réponses > le corps du texte
PHP中文网2017-04-17 17:52:33
public class UnSafeSequence {
public class TestMath{
private TestMath(){
System.out.println("父类实例化");
}
}
public class TestMath1 extends TestMath{
public TestMath1(){
System.out.println("子类实例化");
}
}
/**
* @param args
*/
public static void main(String[] args) {
System.out.println(new UnSafeSequence().new TestMath1());
}
}
Description des modificateurs privés dans la spécification du langage Java 6, définition des classes de niveau supérieur et des classes internes
6.6.1
si le membre ou le constructeur est déclaré privé, alors l'accès est autorisé si et seulement s'il se produit dans le corps de la classe de niveau supérieur (§7.6) qui renferme la déclaration du membre ou constructeur.
Si un membre ou un constructeur d'une classe est déclaré privé, alors seule la classe de niveau supérieur qui déclare le membre ou le constructeur a accès (bien sûr, la classe qui déclare le membre et le constructeur est également accessible)8.
Une classe de niveau supérieur est une classe qui n'est pas une classe imbriquée.
Une classe imbriquée est toute classe dont la déclaration se produit dans le corps d'une autre classe ou interface qui n'est pas une classe imbriquée.
La classe de niveau supérieur n'est pas une classe imbriquée (classe interne). Une classe imbriquée (classe interne) est une classe déclarée dans d'autres classes ou interfaces
Au vu de la description ci-dessus, la classe externe peut accéder à la classe interne TestMath dont le constructeur est marqué comme privé.
TestMath1 est également une classe interne, qui hérite d'une autre classe interne TestMath Parce qu'une classe interne dépend de l'objet instance de classe externe pour exister, elle sera implicitement associée à une instance de classe externe
donc
public class TestMath1 extends TestMath{
public TestMath1(){
System.out.println("子类实例化");
}
}
peut s'écrire
public class TestMath1 extends UnSafeSequence.TestMath{
public TestMath1(){
UnSafeSequence.this.super();
System.out.println("子类实例化");
}
}
Cela peut expliquer pourquoi une sous-classe d'une classe interne peut accéder au constructeur privé de sa classe parent
怪我咯2017-04-17 17:52:33
De manière générale, les sous-classes ne peuvent pas appeler le constructeur privé de la classe parent.
Les deux classes que vous avez ici sont toutes deux des classes internes membres de la même classe. La classe interne peut accéder librement aux variables membres de la classe externe, même si elles sont privées. Par conséquent, une classe interne membre peut accéder à une autre classe interne membre (car elle peut être considérée comme une variable membre), et la classe interne membre accessible n'est absolument pas protégée contre la classe interne membre qui y accède.
大家讲道理2017-04-17 17:52:33
Les classes internes peuvent intrinsèquement accéder aux méthodes et champs privés de n'importe quelle classe externe. TestMath1 hérite de TestMath lui-même en tant que classe interne de UnSafeSequence, de sorte que TestMath1 peut accéder à toutes les méthodes et champs privés définis dans UnSafeSequence, y compris les méthodes et champs privés de TestMath. . champ.
Si vous définissez TestMath séparément en dehors de UnSafeSequence, alors TestMath1 ne peut pas accéder aux méthodes et champs privés dans TestMath.