我无法理解以下代码的执行情况。我想遵循Java程序,以便我能理解一切如何协同工作。我在Eclipse中加强了断点,但它没有解释原因。这是代码:
public class Sequence {
public Sequence() {
System.out.print("c ");
}
{
System.out.print("y ");
}
public static void main(String[] args) {
new Sequence().go();
}
void go() {
System.out.print("g ");
}
static {
System.out.print("x ");
}
}
代码的输出为x y c g
。有人可以解释为什么会这样吗?我认为程序入口点是public static void main
,但看起来static
首先执行?
答案 0 :(得分:3)
static
块在main
开始之前执行,因此x
会被打印。
然后我们进入main,我们调用
new Sequence().go();
调用Sequence
构造函数。根据 static 块,之前的 Sequence
构造函数被调用(所以在新的Sequence
对象被初始化之前),实例块( y
被打印出来。
然后构造函数调用打印c
。
最后,在新创建的对象上调用go()
方法,以便打印g
。
所以完整的输出将是
x y c g
答案 1 :(得分:2)
JLS在这方面很有帮助,确切地说是chapter 12。
首先运行static
块。当ClassLoader
加载类时,会发生这种情况。
然后main
将运行,这由JVM执行以启动应用程序。
然后在调用new Sequence()
时执行构造函数。编译器会将您的实例初始化器(大括号中的位)放入构造函数的顶部(在对超类构造函数的隐式调用之后)。所以大括号中的位首先运行构造函数中的代码。
最后调用方法go()
。
因此代码的输出为x y c g
答案 2 :(得分:1)
在您的班级中,您使用了
//constructor
public Sequence() {
System.out.print("c ");
}
//instance init block
{
System.out.print("y ");
}
//method
void go() {
System.out.print("g ");
}
//static init block
static {
System.out.print("x ");
}
- > Init块按它们出现的顺序执行。
- >首次加载类时,静态初始化块运行一次。
- >每次创建类实例时都会运行实例初始化块。
- >实例初始化块在构造函数调用super()之后运行。
- >构造函数在您创建实例后运行。
根据所有规则,按预期x y c g
输出
答案 3 :(得分:1)
Java在类加载之后和任何方法之前执行静态块。主方法是任何程序的入口点,但它是一个静态类初始化的方法。
答案 4 :(得分:1)
首先,jvm在应用程序启动时加载静态块。所以首先执行静态块。 然后开始主方法执行。
{
System.out.print("y ");
}
是它将被复制到每个构造函数的构造函数块,所以当你实例化类时,它每次都会被调用。 点击here
答案 5 :(得分:1)
步骤:
我。加载类时,首先执行静态块。
II。每次实例化该类的对象然后初始化块 即
{
System.out.print("y ");
}
is executed(every time) and after that the time of constructor comes to be executed.
III。完成对象创建后,执行go()方法。 因此输出。