小编Yur*_*val的帖子

为什么method()和super.method()引用匿名子类中的不同内容?

我正在解决一些练习,以更好地理解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)

java inheritance inner-classes

15
推荐指数
2
解决办法
284
查看次数

标签 统计

inheritance ×1

inner-classes ×1

java ×1