随处写的静态方法无法覆盖,但是当我尝试减少访问说明符时,从公共到保护它会产生错误。例如
public class StaticOverrideFunda {
public static void foo(){
System.out.println("Parent Foo");
}
}
public class B extends StaticOverrideFunda{
protected static void foo(){
System.out.println("Child Foo");
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
B.foo();
}
}
它说
无法降低继承方法的可见性
所以它是在遵循最重要的规则,为什么我们说foo没有在B类中被覆盖?为什么我们说它隐藏/阴影而不是覆盖?
答案 0 :(得分:8)
它遵循一些相同的规则作为覆盖,但这并不意味着它 覆盖。在这种情况下,它是section 8.4.8.3 of the JLS中的规则,“覆盖和隐藏的要求”:
覆盖或隐藏方法的访问修饰符(第6.6节)必须至少提供与重写或隐藏方法一样多的访问权限,如下所示:[...]
它仍然没有覆盖,因为该方法不会以多态方式调用 - 您无法编写一个有时最终调用StaticOverrideFunda.foo
和有时最后调用B.foo
;目标完全在编译时确定。
值得回顾8.4.8节的其余部分,其中定义覆盖为实例方法中出现的内容。
答案 1 :(得分:-1)
您自己在问题中发布了答案,覆盖意味着在子类中使用相同方法的不同代码。由于无法覆盖静态方法,因此无法通过修改访问说明符来使用可见性。