java程序的执行从哪里开始?我听到人们说它来自主要方法。我认为执行从静态块开始。我对吗??
6 回答
该程序的输出:
public class XXX {
static YYY dependend = new YYY();
static {
System.out.println("3");
}
public static void main(String[] args) {
System.out.println("4");
}
}
class YYY {
static {
System.out.println("1");
}
YYY(){
System.out.println("2");
}
}
当然是
1
2
3
4
所以:你的程序的入口点是main
. 但是在此之前执行了代码。并且这个“在 main 之前执行”代码不需要在同一个类中。并且也不需要此代码在静态初始化程序中(参见“2”)。
main 方法是程序的入口点。如果包含“main”方法的类有需要初始化的静态成员或静态代码块,这将在“main”方法之前执行。
看这个示例代码:
public class Test {
private static Object obj = new Object();
public static void main(String[] args) {
System.out.println("test");
}
}
如果您在对象初始化行中放置一个断点,您将看到它在 println 行之前运行。
初始化类时执行静态块。对于包含main
方法的类,它将在调用此方法之前,因为必须在使用它的任何方法之前初始化类。对于其他类,如果不需要初始化该类,它可以稍后或永远不会。
Java 应用程序通常由 main 方法初始化:
public static void main(String... args){
System.out.println("Executing my application...");
}
静态块将在 JVM 加载类时执行。如果没有 main 方法,您将无法启动应用程序,否则 JVM 将出现错误消息。
理论上可以使用静态块(示例)执行您的代码。但这是初始化应用程序的不好方法,因为该doSomethingElse
方法可能被其他脚本调用,该脚本不想创建 gui(或您在初始化方法中执行的任何操作)。例如:
class Test2 extends Object{
public static void doSomething(){
System.out.println("Calling Test's doSomethingElse method.");
Test.doSomethingElse();
}
}
Test2 的 doSomething 方法只想调用doSomethingElse
,但创建 GUI 的方法也被调用,因为该类Test
是由 JVM 加载的。当 JVM 加载一个类时——并且该类有一个静态块——静态块将首先被调用。Test 的静态块现在调用该executingClass
方法并且将创建 GUI(但 Test2 只想调用doSomethingElse
.
最后,您不应该使用静态块来初始化您的应用程序:
- 静态块应该只用于创建该类需要的东西。
main
也需要方法。- 它可能会产生不可预知的影响。
这是一个java程序的启动方法:
public static void main(String[] args){
...
}
如果一个类包含静态块和main方法() jvm会先执行静态块然后再执行main方法。但是如果你没有提到类中的静态块并且类只包含 main 方法,那么 jvm 只从 main 方法开始执行。