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