有一个代码:
class Test1{
public static void main(String[] args){
System.out.println("Test1");
}
}
class Test2 extends Test1{
}
当我尝试执行java Test1
时,我当然得到了这个:
测试1
但是,当我尝试执行java Test2
时,我仍然得到:
测试1
为什么呢?在类Test2中不存在main()方法。并且静态方法不会继承。如果我在Test2中添加main()(使用字符串“Test2”而不是“Test1”),我会得到:
的Test2
我理解为什么我在这个例子中得到了Test2。但是如果在Test2类中不存在main(),我不明白为什么我会得到Test1。
答案 0 :(得分:3)
静态方法不会继承。
继承静态方法。看看jls-8.4.8 Inheritance, Overriding, and Hiding
C类继承自其直接超类并直接超级接口超级类的所有
abstract
和non-abstract
方法以及public
,protected
或使用{声明的超接口{1}}在与C相同的包中访问,并且不会被类中的声明覆盖(第8.4.8.1节)或隐藏(第8.4.8.2节)。
没有关于不继承静态方法的信息,这就是为什么你可以通过default
类(它被继承)运行main
中声明的Test1
。
同样来自jls-8.4.8.2 Hiding (by Class Methods)
如果某个类声明了
Test2
方法static
,那么声明m
会被称为隐藏任何方法m
',其中m
的签名是m
'签名的子签名(第8.4.2节),在类的超类和超接口中,否则该类中的代码可以访问。
因此,当您在m
类中创建新的main
方法时,您隐藏(未覆盖)Test2
方法,这就是您看作输出的原因
Test1.main
答案 1 :(得分:2)
静态方法实际上是继承的。这就是这里发生的事情。防爆。这很好用:
class Base {
public static void saySomething() {
System.out.println("Hi!");
}
}
class Extended extends Base {
public static void main(String[] args) {
saySomething();
}
}