java程序从哪里开始执行?我听人说它来自main方法。我认为执行是从静态块开始的。我说的对吗?
程序输出:
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行之前运行。
这是一个java程序的启动方法:
public static void main(String[] args){
...
}
静态块在类初始化时执行。对于包含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
方法。 它可能有不可预测的影响。
如果一个类包含静态块和主方法()jvm将首先执行静态块,然后执行主方法。但是如果你没有在类中提到静态块,并且类只包含主方法,那么jvm只从主方法开始执行。