Я должен упомянуть, что я выяснил конкретную проблему программирования после того, как я подумал задать этот вопрос, так что это меньше проблема программирования и больше вопрос о причинах проблемы.Как именно внутренние классы получают доступ к внешним элементам?
Я тестировал ограничения Java при использовании модификаторов доступа и начал применять эти тесты к основным концепциям наследования.
Вот код:
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;
}
}
Это фиксированная версия: InnerClass
дается способ display()
переопределить метод в SupplementalClass2
.
До, InnerClass
был пуст, и я попытался установить метод отображения в экземпляре анонимного класса, а не сам класс, потому что я полагал, что внутренний класс наследует абстрактный метод отображения, реализованный через SupplementalInterface
.
Итак, вопрос, который у меня есть, заключается в том, как вложенные и внутренние классы получают доступ к данным у своих владельцев, если не через наследование?
@JB Nizet Wow. Этот ответ был очень тяжелым, чтобы склонить голову. Я не использовал ни один из исполняемых файлов для Java, кроме 'java' и' javac' – i0h3
Я тестировал это и из того, что вы говорите, похоже, что компилятор создает методы доступа для отправки частных полей к внутреннему классу. Таким образом, это в основном создает методы получения, которые внутренний класс автоматически вызывает всякий раз, когда запрос на доступ к закрытому полю найден. – i0h3
Да. Компилятор преобразует доступ к полю в вызов метода синтетического моста, который возвращает поле. –