不允许重写和降低继承方法的可见性,但重点是无论如何你都不能重写静态方法:
If a subclass defines a static method with the same signature as a static method in the superclass, then the method in the subclass hides the one in the superclass.
那么为什么第二个隐藏可以,而第一个则不行?
public class Base {
public static void foo(){
System.out.println("Base");
}
}
隐藏1:
public class Sub extends Base {
static void foo(){ //cannot reduce visibility error!
System.out.println("Sub");
}
}
隐藏2:
public class Sub extends Base {
public static void foo(){ //OK
System.out.println("Sub");
}
}
最佳答案
原因是,您可能希望将子类的实例作为父类(super class)的类型提供给使用者。该消费者尝试运行他用来运行的(公共(public))方法,因为它是公共(public)的,但您通过保护它来隐藏它。为了防止这种情况发生,引入了这条规则。 (问题是可见性,而不是静态!)。 尽管我不得不承认,这种推理并不完全适用于静态方法,只是当消费者想要直接拥有一个子类(作为子类),就像他用来运行父类(super class)一样。
关于java - 为什么我不能降低继承的静态方法的可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35136020/