java - 为什么在超上下文中调用私有(private)方法?

标签 java inheritance

使用这段代码:

public abstract class A {
    private String runNow() {
        return "High";
    }

    public abstract String cos();

    static class B extends A {
        public String runNow() {
            return "Low";
        }

        public String cos() {
            return "cos from B";
        }
    }

    public static void main(String args[]) {
        A[] a = new B[] {new B(), new C()};
        for (A aa : a) {
            System.out.println(aa.runNow() + " " + aa.cos());
        }
    }
}

class C extends A.B {
    public String runNow() {
        return "Out";
    }

    public String cos() {
        return "cos from C";
    }
}

为什么 A 类的 runNow 方法被调用,而不是子类?

最佳答案

简短的回答是“因为 runNow()private”。

当您编译此调用 aa.runNow() 时,编译器会发现 class A 具有私有(private)的 runNow 方法,并且您的代码正在调用这个私有(private)方法。由于无法覆盖私有(private)方法,因此编译器将调用路由到 ArunNow() 方法 - 它知道存在于此上下文中的唯一方法。

BC 也以相同的名称引入它们的方法这一事实对编译器来说无关紧要,因为这些方法是子类中的新方法。编译器无法在不破坏 class A 的封装的情况下考虑它们的覆盖,这将 runNow 指定为私有(private)方法。

关于java - 为什么在超上下文中调用私有(private)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31368479/

相关文章:

java - com.example.RedisApplication 中方法存储库的参数 0 需要找不到类型的 bean

oop - Lua类继承问题

python - 尽管我的类和属性似乎设置正确,但在 Python : Why AttributeError, 中练习继承?

c++:使用 header 但并非没有时对vtable的 undefined reference

java - 服务器错误,状态代码 : 400, 错误代码 : 100005, 消息:您已超出组织的内存限制

java - 使用 BufferedReader 从文件中读取行

java - for循环计算Java中的音节

java - 删除 Eclipse 中的默认包

python - Unittest + Selenium - __init__() 采用 1 个位置参数,但给出了 2 个

python - 模型继承和RSS Feed框架