从父类调用main()方法

魔法太强

有一个代码:

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类继承abstractnon-abstract超类的方法和超接口是publicprotected,或者与声明default在相同封装为C访问,并且既不覆盖(§8.4.8.1),也不隐藏(8.4节。 8.2)在类中声明。

没有关于不继承静态方法的信息,这就是为什么您可以运行通过main声明的原因(它是继承的)。Test1Test2


同样来自jls-8.4.8.2隐藏(通过类方法)

如果一个类声明了一个static方法m,则该声明m被认为隐藏了任何方法m',在m该类m的超类和超接口中,该方法的签名是'签名的子签名(第8.4.2节)。在课堂上编码。

因此,当您mainTest2类中创建新方法时,您隐藏了(未覆盖)Test1.main方法,这就是为什么您将其视为输出的原因

Test2

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章