这是匿名类的简单java程序,其中类被重新定义(而不是接口)为匿名类。
class Anonymous {
int i = 10;
void main() {
System.out.println("Anonymous Main " + i);
}
void setI(int i) {
System.out.println("under set");
this.i = i;
}
void main2() {
setI(30);
System.out.println("Main 2's " + i);
}
}
public class AnonymousClass {
public static void main(String[] args) {
Anonymous a = new Anonymous() {
int i = 20;
@Override
void setI(int i) {
System.out.println("Over set");
this.i = i;
}
@Override
public void main() {
setI(0);
System.out.println("Redefined Anonymous Main " + i);
}
};
a.main();
a.main2();
}
}
输出:-
Over set
Redefined Anonymous Main 0
Over set
Main 2's 10
我有几个问题:
在
main2
中,为什么它可以访问具有i
值的10
?
为什么对象
a
有两个i
的副本?
如果有,那么调用
setI
时为什么没有两份setI
?
为什么
main2
可以访问重新定义的setI
而不是i
?
Java 到底在做什么?
我认为你应该开始从阅读JLS的这一部分开始。那么我希望一切对你来说都更加透明。您应该了解的是,父级中的
i
和子级中的 i
根本不一样。
所以,关于你的问题:
i
。只有子级知道它隐藏了父级字段。因此,您的父母打印它是
i
(与孩子的
i
不同),但
setI
被覆盖,因此
setI
设置孩子的
i
的值。
本例中并不是隐藏,它是真正的多态性。
main2()
的对象调用
setI
。因此它会调用
setI
的重写版本。再次强调 - 当
i
内部修改
main2
时,它与子级中的
i
不同,并且父级中的
main2()
无法访问子级中的
i
。