java扩展静态方法,无法编译,为什么?

时间:2016-09-18 09:53:02

标签: java

class Base {
    public static void f(){}
}
class Derived extends Base{
    private static void f(){}
}
编译器说,Derived.f()的修饰符必须是公共的,如果它是私有的 “尝试分配较弱的访问权限;是公开的” 我无法理解!为什么编译器不允许我们这样做?

2 个答案:

答案 0 :(得分:1)

这是OOP中的一个基本原则,当你覆盖方法时,你不允许在子类中分配较弱的访问修饰符(这里是private)而不是在超类(这里是public)中

这与Liskov Substitution Principle(LSP)无关,这是面向对象编程中的一个概念,它指出:使用指针或对基类的引用的函数必须能够使用派生类的对象而无需知道它。

所以它可能是:

public class Base {
    private static void f() {
    }
}

class Derived extends Base {
    public static void f() {    // as well as protected, default, private
    }
}

答案 1 :(得分:1)

静态方法不能被覆盖,那些只能被子类隐藏,方法的可访问性与隐藏无关。只能覆盖实例方法,但是根据签名隐藏或覆盖方法。在这两种情况下,签名都应该是相同的。无论是隐藏还是被覆盖,你都不能减少继承方法的可访问性。