不允许覆盖和降低继承方法的可见性,但关键是你不能覆盖静态方法:
如果子类定义的静态方法与超类中的静态方法具有相同的签名,则子类中的方法隐藏超类中的方法。
那么为什么第二个隐藏确定而第一个隐藏没有?
public class Base {
public static void foo(){
System.out.println("Base");
}
}
hide1:
public class Sub extends Base {
static void foo(){ //cannot reduce visibility error!
System.out.println("Sub");
}
}
hide2:
public class Sub extends Base {
public static void foo(){ //OK
System.out.println("Sub");
}
}
答案 0 :(得分:1)
原因是,您可能希望将子类的实例作为消费者的超类类型。这个消费者试图运行他用来运行的(公共)方法,因为它是公开的,但是你把它隐藏起来并保护它。为了防止这种情况,引入了此规则。 (问题是可见性,而不是静态!)。 虽然我不得不承认,这种推理并不完全适用于静态方法,只是当消费者希望直接拥有子类(作为子类)时,就像他用来运行超类一样。
答案 1 :(得分:1)
可以隐藏子类中的static
超类方法:
public class Base {
public static void foo(){
System.out.println("Base");
}
}
public class Sub extends Base {
static void foo(){ //cannot reduce visibility error!
System.out.println("Sub");
}
}
public class Sub1 extends Base {
public static void foo(){ //OK
System.out.println("Sub1");
}
}
public class Main {
public static void main(String[] args)
{
Base.foo();
Sub1.foo();
}
}
输出:
基
Sub1的
在Sub
您尝试降低可见性(从public
转到no modifier
)。在Sub1
中,您不是降低可见性(从public
到public
)。这就是为什么它在Sub1
而不是Sub
进行编译的原因。这是关于方法的可见性。它与覆盖/隐藏无关。 (隐藏在这种情况下,因为它是static
方法)。
如果您尝试在Sub.foo()
方法中运行main
而不更改任何内容,则会出现此异常:
线程中的异常" main" java.lang.Error:未解决的编译问题: 无法从Base
降低继承方法的可见性
Here是一个类似的问题和答案。