У меня есть следующий класс java:
class Outer
{
private Integer a;
private Long b;
class Inner
{
public void foo()
{
System.out.println("a and b are " + a + " " + b);
}
}
}
когда я запускаю javap на Outer и Outer $Inner, я получаю следующее:
C:\test>javap Outer
Compiled from "Outer.java"
class Outer extends java.lang.Object{
Outer();
static java.lang.Integer access$000(Outer);
static java.lang.Long access$100(Outer);
}
C:\test>javap Outer$Inner
Compiled from "Outer.java"
class Outer$Inner extends java.lang.Object{
final Outer this$0;
Outer$Inner(Outer);
public void foo();
}
У меня есть два вопроса:
1) почему компилятор java генерирует статические методы, которые принимают параметр "Outer" во внешнем классе для доступа к его частным переменным? почему бы не методы экземпляров, которые внутренний класс может легко вызвать через этот член $0?
2) почему этот $0 во внутреннем классе сделал окончательным? что произойдет, если это не окончательно?
Спасибо и приветствую.