Un exemple astucieux ! Mais c'est en fait une explication quelque peu ennuyeuse - il n'y a pas de problème de visibilité, vous n'avez simplement aucun moyen de vous référer à t1
directement de T3
parce que super.super
n'est pas autorisé .
T2
ne peut pas accéder à ses propres t1
directement puisqu'il est privé (et les classes enfants n'héritent pas des champs privés de leurs parents), mais le champ super
est effectivement une instance de T1
et comme c'est dans la même classe T2
peut faire référence aux champs privés de super
. Il n'y a juste aucun mécanisme pour T3
pour aborder les champs privés de sa classe grand-parentale T1
directement.
Les deux compilent très bien à l'intérieur T3
qui démontre qu'une T3
peut accéder à l'interface de son grand-parent private
champs :
System.out.println(((T1)this).t1);
System.out.println(new T1().t1);
A l'inverse, cela ne compile pas dans les deux cas T2
o T3
:
System.out.println(t1);
Si super.super
étaient autorisées, vous pourriez le faire à partir de T3
:
System.out.println(super.super.t1);
si je définissais 3 classes, A
, B
, C
, A
ayant un champ protégé t1
y B
hériterait de A
y C
de B
, C
pourrait faire référence à A
s t1
en invoquant super.t1
parce qu'il est visible ici. logiquement, la même chose ne devrait-elle pas s'appliquer à l'héritage des classes internes, même si les champs sont privés, parce que ces membres privés devraient être visibles du fait de leur appartenance à la même classe ?
(Je vais m'en tenir à ce que dit l'OP. T1
, T2
y T3
noms de classe pour simplifier)
Si t1
étaient protected
il n'y aurait aucun problème - T3
pourrait faire référence à la t1
directement comme n'importe quelle sous-classe. Le problème se pose avec private
parce qu'une classe n'a pas sensibilisation de ses classes parentes private
et ne peuvent donc pas les référencer directement, même s'ils sont visibles en pratique. C'est pourquoi vous devez utiliser super.t1
de T2
pour pouvoir faire référence au domaine en question.
Même si, dans la mesure où un T3
est concerné, il n'a pas t1
le champ auquel il a accès T1
s private
en étant dans la même classe extérieure. Puisque c'est le cas, tout ce que vous avez à faire est de caster this
à un T1
et vous avez un moyen de faire référence au champ privé. Le site super.t1
appeler T2
est (en substance) un casting this
en un T1
Nous pouvons nous référer à ses champs.