3

到处都写着不能覆盖静态方法,但是当我尝试将访问说明符从 public 减少到 protected 时,它会出错。例如

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

4

2 回答 2

8

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

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

它仍然没有被覆盖,因为该方法不会被多态地调用——你不能编写一个有时会最终调用StaticOverrideFunda.foo有时最终会调用的调用B.foo;目标完全在编译时确定。

值得回顾第 8.4.8 节的其余部分,它将覆盖定义为发生在实例方法上的事情。

于 2012-04-24T11:52:57.170 回答
-1

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

于 2012-04-24T11:54:43.703 回答