动态调度和访问级别的方法

时间:2014-07-06 08:57:14

标签: java oop inheritance dynamic-dispatch

考虑以下课程:

public class A {
    public void foo() {
        System.out.println("A.foo()");
    }

    public void bar() {
        System.out.println("A.bar()");
        foo();
    }
}

public class B extends A {
    public void foo() {
        System.out.println("B.foo()");
    }

    public static void main(String[]
    args) {
        A a = new B();
        a.bar();
    }
}

此代码的输出为A.bar(),然后是B.foo()。我注意到,如果我将方法foo()的访问级别从public更改为private,则输出为A.bar(),然后是A.foo()

为什么?

1 个答案:

答案 0 :(得分:2)

如果A.foo()是私有的,那么子类不能覆盖它 - 任何其他类基本上都不应该知道私有成员的存在。您无法覆盖无法“看到”的成员。

来自section 8.4.8.1 of the JLS

  

在类C中声明或继承的实例方法m C ,覆盖C在类{{}中声明的另一个方法m A 1}},如果满足以下所有条件:

     
      
  • ...

  •   
  • 以下其中一项是正确的:

         
        
    • m A 是公开的。
    •   
    • m A 受到保护。
    •   
    • m 使用与A相同的包中的包访问声明,并且C声明m C 或m C
    • 的直接超类的成员   
    • m 使用包访问声明,并且m C 覆盖某个超类C的m A
    •   
    • m 使用包访问声明A ,并且m C 覆盖C的方法m'(m'与m C不同和m A ),这样m'覆盖某个超类C的m A
    •   
  •