为什么在找不到主要方法时不生成异常或错误?
why Exception or Error not generated when no main method found?
好的,为了知识,我尝试了以下情况(假设 Class A 和 B 在同一个包中)
ClassA
public class ClassA {
public static void main(String[] args) {
System.out.println("A");
}
}
ClassB
public class ClassB extends ClassA {
public static void main(String[] args) {
System.out.println("B");
}
}
在 ClassB
上面执行它会在 classB
中进行以下更改后现在产生 B
的输出
ClassB
public class ClassB extends ClassA {
//blank body
}
如果我在 terminal
中编译并 运行 它给我输出 A
这完全令人惊讶,因为它应该给出 NoSuchMethodError
因为没有主要方法是他们所以请解释奇怪的行为?
注意:许多答案包含Override
字,请使用hiding
,因为我们无法覆盖java.[=20=中的静态方法]
在第一种情况下,你隐藏了 main
方法,因为你在子类中定义了一个新方法,在第二种情况下你没有,你将固有 A
的主要。
参见The Java™ Tutorials - Overriding and Hiding:
If a subclass defines a static
method with the same signature as a
static
method in the superclass, then the method in the subclass hides the one in the superclass.
public static void main(String[] args)
只是您在第二种情况下从 A
继承的方法。
在 Java sub类 中继承其基础 类 的所有方法,包括其静态方法。
在子类中使用与超类中方法的匹配名称和参数定义实例方法是重写。对静态方法做同样的事情隐藏超类的方法。
虽然隐藏并不意味着该方法消失:这两种方法仍然可以使用适当的语法调用。在您的第一个示例中,一切都很清楚:A
和 B
都有自己的 main
;调用 A.main()
打印 A
,而调用 B.main()
打印 B
.
在您的第二个示例中,也允许调用 B.main()
。由于 main
继承自 A
,结果是打印 A
.
好的,为了知识,我尝试了以下情况(假设 Class A 和 B 在同一个包中)
ClassA
public class ClassA {
public static void main(String[] args) {
System.out.println("A");
}
}
ClassB
public class ClassB extends ClassA {
public static void main(String[] args) {
System.out.println("B");
}
}
在 ClassB
上面执行它会在 classB
B
的输出
ClassB
public class ClassB extends ClassA {
//blank body
}
如果我在 terminal
中编译并 运行 它给我输出 A
这完全令人惊讶,因为它应该给出 NoSuchMethodError
因为没有主要方法是他们所以请解释奇怪的行为?
注意:许多答案包含Override
字,请使用hiding
,因为我们无法覆盖java.[=20=中的静态方法]
在第一种情况下,你隐藏了 main
方法,因为你在子类中定义了一个新方法,在第二种情况下你没有,你将固有 A
的主要。
参见The Java™ Tutorials - Overriding and Hiding:
If a subclass defines a
static
method with the same signature as astatic
method in the superclass, then the method in the subclass hides the one in the superclass.
public static void main(String[] args)
只是您在第二种情况下从 A
继承的方法。
在 Java sub类 中继承其基础 类 的所有方法,包括其静态方法。
在子类中使用与超类中方法的匹配名称和参数定义实例方法是重写。对静态方法做同样的事情隐藏超类的方法。
虽然隐藏并不意味着该方法消失:这两种方法仍然可以使用适当的语法调用。在您的第一个示例中,一切都很清楚:A
和 B
都有自己的 main
;调用 A.main()
打印 A
,而调用 B.main()
打印 B
.
在您的第二个示例中,也允许调用 B.main()
。由于 main
继承自 A
,结果是打印 A
.