Je devrais mentionner que j'avais compris le problème de programmation spécifique après avoir pensé à poser cette question, donc c'est moins un problème de programmation et plus une question sur les raisons derrière le problème.Comment les classes internes accèdent-elles exactement aux éléments d'une classe externe?
J'avais testé les limites de Java lors de l'utilisation de modificateurs d'accès, et j'ai commencé à appliquer ces tests aux concepts d'héritage de base.
Voici le code:
package test.Inheritance;
public class SuperClass {
private static int x = 0;
protected static int y = 1;
public static void main(String[] args){
SupplementalClass2 child = new SupplementalClass2();
NestedClass local = new NestedClass();
InnerClass test;
child.setObject(child.new InnerClass(){
@Override public void display(){System.out.println("Hey!");}
});
test = child.getObject();
System.out.println(test.equals(child.receiveObject));
SuperClass.NestedClass.display();
SuperClass.NestedClass2.display();
test.display();
child.display();
local.message();
}
public static class NestedClass {
public static void display()
{
System.out.println("x before first static context change: " + x);
x = 25;
System.out.println("x after first static context change: " + x);
}
public void message()
{
System.out.print("Nested Class Field Access Test: " + "before(" + y + ") | ");
y = 20;
System.out.println("after(" + y + ")");
}
}
public static class NestedClass2 {
public static void display()
{
System.out.println("x before second static context change: " + x);
x = 30;
System.out.println("x after second static context change: " + x);
}
}
public class InnerClass {
public void display(){}
}
}
abstract class SupplementalClass extends SuperClass {
protected String test = "Parent Class String";
protected InnerClass receiveObject;
}
interface SupplementalInterface {
public static final int test = 3;
public abstract void display();
}
class SupplementalClass2 extends SupplementalClass implements SupplementalInterface {
public void display()
{
System.out.println("Supplemental Interface Field Access Test: " + SupplementalInterface.test);
System.out.println("Supplemental Parent Field Access Test: " + super.test);
}
public void setObject(InnerClass in){
receiveObject = in;
}
public InnerClass getObject()
{
return receiveObject;
}
}
Ceci est la version fixe: InnerClass
est donnée une méthode display()
pour remplacer la méthode SupplementalClass2
. Avant, InnerClass
était vide et j'ai essayé de définir la méthode d'affichage dans l'instance de classe anonyme, au lieu de la classe elle-même, car je pensais que la classe interne hériterait de la méthode d'affichage abstraite implémentée par SupplementalInterface
.
Donc la question que j'ai est de savoir comment les classes imbriquées et internes accèdent aux données dans leurs détenteurs si ce n'est par l'héritage?
@JB Nizet Wow. Cette réponse était très difficile à comprendre. Je n'ai utilisé aucun des exécutables de Java autres que 'java' et' javac' – i0h3
Je l'ai testé et de ce que vous dites, il semble que le compilateur crée des méthodes d'accès pour envoyer les références de champs privés à la classe intérieure. Il s'agit donc essentiellement de créer des méthodes get que la classe interne appelle automatiquement lorsqu'une requête d'accès à un champ privé est trouvée. – i0h3
Oui. Le compilateur transforme l'accès au champ en un appel à la méthode de pont synthétique qui renvoie le champ. –