Java静态方法vs主静态方法

时间:2013-10-17 19:39:52

标签: java static-methods main

我无法理解以下代码的执行情况。我想遵循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首先执行?

6 个答案:

答案 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()方法。      因此输出。