java中静态方法覆盖的奇怪情况

时间:2012-04-24 11:49:57

标签: java override

随处写的静态方法无法覆盖,但是当我尝试减少访问说明符时,从公共到保护它会产生错误。例如

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类中被覆盖?为什么我们说它隐藏/阴影而不是覆盖?

2 个答案:

答案 0 :(得分:8)

它遵循一些相同的规则作为覆盖,但这并不意味着它 覆盖。在这种情况下,它是section 8.4.8.3 of the JLS中的规则,“覆盖和隐藏的要求”:

  

覆盖或隐藏方法的访问修饰符(第6.6节)必须至少提供与重写或隐藏方法一样多的访问权限,如下所示:[...]

它仍然没有覆盖,因为该方法不会以多态方式调用 - 您无法编写一个有时最终调用StaticOverrideFunda.foo有时最后调用B.foo;目标完全在编译时确定。

值得回顾8.4.8节的其余部分,其中定义覆盖为实例方法中出现的内容。

答案 1 :(得分:-1)

您自己在问题中发布了答案,覆盖意味着在子类中使用相同方法的不同代码。由于无法覆盖静态方法,因此无法通过修改访问说明符来使用可见性。