【发布时间】:2019-12-26 09:30:20
【问题描述】:
我正在尝试了解我的代码的调用顺序。有人,请解释一下调用顺序。
public class MainWithStaticCalls
{
static
{
String[] str = {"1", "2"};
System.out.println("Static");
main(str);
}
{
System.out.println("Init block");
}
void MainWithStaticCalls()
{
System.out.println("constructor");
}
public static void main(String[] a)
{
MainWithStaticCalls obj = new MainWithStaticCalls();
NewClass nc = new NewClass();
nc.callMe();
System.out.println("Main");
}
}
class NewClass
{
public void callMe()
{
System.out.println("I'm called");
}
}
根据我的理解,静态块将在 JVM 开始执行时立即执行,甚至在主类之前。然后实例 init 块被执行。那么构造函数应该被执行。但是如果我们从静态字段调用 main 方法,回调是如何工作的。哪个 main 将首先执行,JVM 正常执行的那个或静态字段显式调用的那个。
My output:
Static
Init block
I'm called
Main
Init block
I'm called
Main
P.S:我已经修改了我的问题。早些时候我将普通方法与构造函数混淆了,所以一些答案可能看起来无关紧要,但这确实有助于我理解问题。
【问题讨论】:
-
见:java "void" and "non void" constructor。由于虚假的
void,您实际上还没有在这里定义构造函数。删除它,它应该可以按预期工作。 -
void MainWithStaticCalls() 是一个方法,而不是一个构造函数。
-
是的,我明白我做错了什么,谢谢。你能解释一下回调顺序吗?哪个主要方法将首先执行。 JVM调用的或者静态字段显式调用的。
标签: java java-8 constructor