为什么 method() 和 super.method() 在匿名子类中引用不同的东西?
我正在解决一些练习,以更好地了解java中的内部类是如何工作的。我发现了一个非常有趣的练习。练习的条件是使打印“sout”而不是“主要”,并且更改最少。有它的代码:printName()
public class Solution {
private String name;
Solution(String name) {
this.name = name;
}
private String getName() {
return name;
}
private void sout() {
new Solution("sout") {
void printName() {
System.out.println(getName());
// the line above is an equivalent to:
// System.out.println(Solution.this.getName);
}
}.printName();
}
public static void main(String[] args) {
new Solution("main").sout();
}
}
我们有一个有趣的情况 - 这两个类有is-A和有-A连接。这意味着匿名内部类扩展了外部类,并且内部类的对象也具有对外部类的对象的引用。如果运行上面的代码,将打印“main”。子级不能通过继承调用父项。但是子类是内部类使用对父类(外部类)的引用来访问该方法。getName()
解决此任务的最简单方法是将 的访问修饰符更改为其他任何内容。所以孩子能够通过继承使用,并且由于后期装订“sout”将被打印出来。getName()
private
getName()
解决此任务的另一种方法是使用 。super.getName()
private void sout() {
new Solution("sout") {
void printName() {
System.out.println(super.getName());
}
}.printName();
}
我无法理解它是如何工作的。有人可以帮助我理解这个问题吗?
感谢您的尝试)