Sur*_*ran 3 java static-methods overriding redefinition
我知道这是一个非常讨厌的话题,但我需要澄清一些事情,所以请耐心等待一分钟.
静态方法与任何其他方法一样继承,并遵循相同的关于访问修饰符的继承规则(不继承私有方法等)
静态方法没有被覆盖,它们被重新定义.如果一个子类定义了一个与超类中具有相同签名的静态方法,则称它是遮蔽或隐藏超类的版本而不是覆盖它,因为它们不像实例方法那样是多态的.
重新定义的静态方法似乎仍然遵循一些(如果不是全部)超越规则.
首先,重新定义的静态方法不能比超类的静态方法更多地限制访问.为什么??
其次,返回类型在超类和子类的方法中也必须兼容.例如:
class Test2 {
static void show() {
System.out.println("Test2 static show");
}
}
public class StaticTest extends Test2 {
static StaticTest show() {
System.out.println("StaticTest static show");
return new StaticTest();
}
public static void main(String[] args) {
}
}
Run Code Online (Sandbox Code Playgroud)
在eclipse中它显示了一个错误:
The return type is incompatible with Test2.show()
为什么?
和第三,是否有遵循了重新定义静态方法它们相同压倒一切的,什么是对这些规则的原因,规则的任何其他规则?
Thanx提前!!
隐藏静态方法的要求在Java语言规范的§8.4.8.3中详细说明.总的来说,它与实例方法相同:
m,类中的方法在擦除之后T具有相同的签名是错误,这是另一种可访问的方法.nTm nthrows隐藏,覆盖或实现声明为抛出已检查异常的其他方法的方法的子句有一些限制.(基本上,不能声明隐藏方法抛出未在hidden/overridden/implemented方法中声明的已检查异常.)我认为就是这样,但请参阅JLS以获取更多详细信息.JLS没有解释这些规则的基本原理,但大多数规则似乎都是为了防止多态性问题.您希望子类在使用父类的任何位置都可用.