Hap*_*tal 13 java static program-entry-point
我听到有人说"如果main不是静态的,那么JVM可以创建一个包含main的类的对象,并通过对象调用main.
但问题是JVM如何知道在重载构造函数的情况下调用哪个构造函数,或者即使有只有一个参数化的构造函数,然后才能通过."
这是正确的理由吗?
因为如何在不进入主函数的情况下创建类的对象?
请就此发表意见.如果这不是正确的理由,那么正确的原因是什么?
ben*_*ado 18
这只是一个惯例.Java语言设计者可以很容易地决定你必须指定一个要实例化的类,使其构造函数成为主要方法.但是调用静态方法同样有效,并且不需要首先实例化类.
此外,如果类具有超类,则可以通过更改超类来更改程序启动的行为(因为必须在子类之前调用超类构造函数),这可能是无意的.静态方法没有这个问题.
主要方法是静态的,因为它使事情变得更简单,但如果他们想让它变得更复杂,他们就可以拥有.
"这个理由是对的吗?"
它在某种程度上,虽然从来没有像那样具体解释过.
我们可以让约定也调用构造函数String...args ,这意味着你至少需要一个对象来运行,但(可能)设计者认为不需要它.
例如,有这样的东西没有技术障碍:
class Hello {
public void main(String...args){
System.out.println("Hello, world");
}
}
Run Code Online (Sandbox Code Playgroud)
事实上,如果你没有指定一个,那么Java会为你创建一个无参数的构造函数,如果类包含一个main方法,那么包含一个var args构造函数也很容易,并且在底层创建以下代码:
class Hello {
// created by the compiler
public Hello(){}
public Hello( String ... args ) {
this();
main( args );
}
// end of code created by the compiler
public void main( String ... args ) {
System.out.println("Hello, world!");
}
}
Run Code Online (Sandbox Code Playgroud)
但是这会产生不需要的代码,以及在这种情况下不会做任何事情的额外分配对象; 两个构造函数(而不是一个)等.最后它看起来就像是太多的魔法.
取决于语言设计师.在这种情况下,他们可能认为不这样做会更简单,只是验证调用的类是否具有被调用的方法的特殊签名public static void main( String [] args )
顺便说一句,你可以Hello! world在没有main方法的情况下使用Java 编写程序,但它会抛出java.lang.NoSuchMethodError: main
public class WithoutMain {
static {
System.out.println("Look ma, no main!!");
System.exit(0);
}
}
$ java WithoutMain
Look ma, no main!!
Run Code Online (Sandbox Code Playgroud)
我知道它不是另类,但是,有趣的不是吗?
| 归档时间: |
|
| 查看次数: |
4377 次 |
| 最近记录: |