Java 从父类调用main()方法
有一个代码:Java 从父类调用main()方法,java,main,Java,Main,有一个代码: class Test1{ public static void main(String[] args){ System.out.println("Test1"); } } class Test2 extends Test1{ } 当我尝试执行JavaTest1时,我当然会得到以下结果: 测试1 但是,当我尝试执行JavaTest2时,我仍然得到: 测试1 为什么??类Test2中不存在main()方法。静态方法不会被继承。如果我将mai
class Test1{
public static void main(String[] args){
System.out.println("Test1");
}
}
class Test2 extends Test1{
}
当我尝试执行JavaTest1
时,我当然会得到以下结果:
测试1
但是,当我尝试执行JavaTest2
时,我仍然得到:
测试1
为什么??类Test2中不存在main()方法。静态方法不会被继承。如果我将main()添加到Test2中(使用字符串“Test2”而不是“Test1”),我将得到:
测试2
我理解为什么在这个示例中使用Test2。但我不明白,如果类Test2中不存在main(),为什么要得到Test1。静态方法实际上是继承的。这就是这里发生的事情。例:这很好用:
class Base {
public static void saySomething() {
System.out.println("Hi!");
}
}
class Extended extends Base {
public static void main(String[] args) {
saySomething();
}
}
静态方法不会被继承
静态方法是继承的。看看
类C从其直接超类和直接超接口继承超类和超接口的所有抽象
和非抽象
方法,这些方法是公共
,受保护
,或在与C相同的包中以默认
访问权限声明的,并且既不被重写(§8.4.8.1)也不被类别中的声明隐藏(§8.4.8.2)
没有关于不继承静态方法的信息,这就是为什么可以通过Test2
类运行Test1
中声明的main
(它是继承的)
也来自 如果一个类声明了一个
静态方法m
,那么声明m
被称为隐藏任何方法m
,其中m
的签名是m
签名的子签名(§8.4.2),在类的超类和超接口中,否则类中的代码可以访问这些超类和超接口
因此,当您在Test2
类中创建新的main
方法时,您隐藏了(未重写)Test1.main
方法,这就是您将其视为输出的原因
Test2
和静态方法不会继承。
谁告诉你的?静态方法不能被重写(它们不是多态的),但它们可以被继承和隐藏,就像您在示例中清楚看到的那样。@KlemensMorbe现在这是一个谎言。当classloader在类中找不到main()方法时,是否在父类中搜索main()方法?我前面的评论有错误:静态方法被隐藏,没有阴影,谢谢。然而,现在它并不重要。我试图理解为什么在父类中调用了方法而不是错误。为什么您希望出现错误?JVM在Test2的继承树中寻找了一个主方法,并找到了一个。在撰写评论时,我不理解这一点非常感谢。如果我理解正确,在创建类对象时,Test2从Test1继承静态方法main()。若并没有显式地创建它,那个么将调用继承的方法。