有一个代码:
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”),则会得到:
测试2
我了解为什么在此示例中获得了Test2。但是不明白为什么在类Test2中不存在main()时为什么得到Test1的原因。
而且静态方法不会继承。
静态方法是继承的。看一下jls-8.4.8继承,覆盖和隐藏
从它的直接超类和直接的超接口所有C类继承
abstract
和non-abstract
超类的方法和超接口是public
,protected
,或者与声明default
在相同封装为C访问,并且既不覆盖(§8.4.8.1),也不隐藏(8.4节。 8.2)在类中声明。
没有关于不继承静态方法的信息,这就是为什么您可以运行通过类main
声明的原因(它是继承的)。Test1
Test2
如果一个类声明了一个
static
方法m
,则该声明m
被认为隐藏了任何方法m
',在m
该类m
的超类和超接口中,该方法的签名是'签名的子签名(第8.4.2节)。在课堂上编码。
因此,当您main
在Test2
类中创建新方法时,您隐藏了(未覆盖)Test1.main
方法,这就是为什么您将其视为输出的原因
Test2
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句