我找不到像我这样的问题,所以我希望它不是重复的。
再次是关于覆盖和隐藏。我认为——但我可能错了——我都理解。
以下代码按预期运行,两种方法都已隐藏。method1因为它是私有方法,私有方法不能被覆盖,只能隐藏,method2因为它是静态的,静态方法不能被覆盖,它们只能被隐藏。
public class Child extends Parent {
public void method1(){System.out.println("child");}
public static void method2(){ System.out.println("static child");}
}
class Parent{
private void method1(){ System.out.println("parent");}
public static void method2(){ System.out.println("static parent");}
public static void main(String[] args){
Parent p = new Child();
p.method1(); //prints out "parent"
p.method2(); //prints out "static parent"
}
}
如果我阅读规格,它会说:
http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.3.3
可以将方法声明为 final 以防止子类覆盖或隐藏它。
如果我将父类中的 method1 更改为“final”
private final void method1(){ System.out.println("parent");}
一切正常。编辑开始:我预计会出现编译器错误,说最终方法无法隐藏,但这并没有发生。:编辑结束
问题 1:这是否意味着只能隐藏静态方法?在我正在阅读的书中(OCA 学习指南,Jeanne Boyarsky 和 Scott Selikoff 第 252 页),他们清楚地说隐藏了一种私有方法。
然后我将 Parent 类中的 method2 更改为
public final static void method2(){ System.out.println("static parent");}
现在编译器确实抱怨了,错误说“Child cannot override method2()”这很令人困惑,因为我以为我试图隐藏一个方法。
问题2:不应该是“孩子不能隐藏method2()”吗?
编辑开始:我很清楚这里没有覆盖,但正如提到的规范指出的那样:修饰符 final 防止方法被覆盖或隐藏,这就是我把它放在标题中的原因。:编辑结束