我正在解决一些练习,以更好地理解java中的内部类是如何工作的.我发现了一个非常有趣的运动.练习的条件printName()是以最小的变化打印"sout"而不是"main".有它的代码:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
我们有一个有趣的情况 - 这两个类有-A和有-A连接.这意味着匿名内部类扩展了外部类,并且内部类的对象也引用了外部类的对象.如果您运行上面的代码,将打印"main".子进程无法getName()通过继承来调用父进程.但是作为内部类的子类使用对父(外部类)的引用来访问该方法.
解决这一任务的最简单方法是访问修饰符改变getName()从private其他任何事情.因此,孩子能够getName()通过继承使用,并且由于后期绑定"sout"将被打印.
解决此任务的另一种方法是使用super.getName().
private void sout() {
new Solution("sout") { …Run Code Online (Sandbox Code Playgroud)