Java继承的一般问题

时间:2016-04-07 12:54:51

标签: java inheritance

假设我们已经给出了两个类:

package inheritance1;

public class Foo1 {

    protected void sayWhoYouAre() {
        System.out.println("I am Foo1");
    }
}

package inheritance2;

import inheritance1.Foo1;

public class Foo2 extends Foo1 {

    public Foo2() {
        // why does this not work?
        // new Foo1().sayWhoYouAre();
        // ---> Error: "The method sayWhoYouAre() from the type Foo1 is not
        // visible"
    }

    @Override
    protected void sayWhoYouAre() {
        System.out.println("I am Foo2");
    }

    public static void main(String[] args) {
        // why does this not work?
        // new Foo1().sayWhoYouAre();
        // ---> Error: "The method sayWhoYouAre() from the type Foo1 is not
        // visible"
    }
}

为什么sayWhoYourAre() - 方法在类定义中可见,所以我可以覆盖它(@Override),但当我尝试通过new Foo1().sayWhoYouAre()调用它时编译器说,这个方法不可见?

感谢您的帮助! :)

1 个答案:

答案 0 :(得分:0)

protected表示该方法在以下位置可见:

  • 与其定义的类相同的包
  • 扩展定义的类的任何类。 这包括您可以在Foo2
  • 中覆盖它的原因

然而,main方法是静态的,因此不属于类的对象范围,这意味着它不在继承层次结构中。因此,sayWhoYouAre上的Foo1不可见。

另请参阅JLS