为什么在使用初始化器,构造函数和方法调用时print语句按此顺序执行?

这是我正在运行的代码,此代码的输出是4 2 1 3,有人可以解释为什么结果按此顺序打印。

public class goFuncTest { goFuncTest() { System.out.print("1 "); } { System.out.print("2 "); } public static void main(String[] args) { new goFuncTest().go(); } void go() { System.out.print("3 "); } static { System.out.print("4 "); } } 

根据您最近的问题编辑,您的输出将是4 2 1 3.首先运行静态初始化程序,然后运行实例初始化程序。 如果您有多个相同类型的初始值设定项,它们将按照它们在类中出现的顺序执行。

 // static initializer first static { System.out.print("4 "); } // then instance initializer { System.out.print("2 "); } 

接下来构造函数会启动,它会为您提供:

 goFuncTest() { System.out.print("1 "); } 

最后调用该方法:

 void go() { System.out.print("3 "); } 

正如JB Nizet在第一次评论中指出的那样,结果应该是2,4,3,1。

接下来,首先执行静态块,然后执行初始化块。 在您的代码中,没有静态块,只有inti块。

初始化块执行的顺序是它们在源代码-2,4中的顺序。

根据构造函数和方法调用剩下两个结果。 1,3

现在你可以看到答案了吗?

原因:

  1. 你有一个实例块,它按顺序执行,出现在你的类定义中。 所以2首先是4然后输出2 4
  2. 接下来,您将调用new goFuncTest(),它将调用您的构造函数,因此您将在输出中看到1。
  3. 现在你的实例上你正在调用go方法打印3。

似乎主要的混乱只是因为不理解一个class级可以拥有的各种块;

这个答案给出了一个很好的例子和解释;

这是他们给出的代码:

 public class Test { static int staticVariable; int nonStaticVariable; // Static initialization block: // Runs once (when the class is initialized). static { System.out.println("Static initalization."); staticVariable = 5; } // Instance initialization block: // Runs before the constructor each time you instantiate an object { System.out.println("Instance initialization."); nonStaticVariable = 7; } public Test() { System.out.println("Constructor."); } public static void main(String[] args) { new Test(); new Test(); } } 

该类具有static initialiserinstance initialisation blockconstructorclass method

static initialiserstatic {...} instance initialiser{...} constructorPublic ClassName(){...} class methodPublic Static Whatever classMethod(String[] args){...}

在不同情况下调用这些中的每一个; 在加载类时调用static initialiser器,没有其他方法可以调用它,甚至不能通过reflection来实现它,因为它从未由method instance表示,它由JVM调用。

每当您在构造函数之前创建类的实例时,都会调用instance initialiser

您可以拥有多个static initialiser和多个instance initialiser ,并且它们按照它们在代码中出现的顺序执行。

你可能已经知道的constructorclass method

在您的示例中,稍微重新排列代码可能会更有帮助,以更好地反映该层次结构;

 public class goFuncTest { //static instance initialiser static { System.out.print("4 "); } //instance initialiser { System.out.print("2 "); } //Constructor goFuncTest(){ System.out.print("1 "); } //Class method void go(){ System.out.print("3 "); } public static void main(String[] args){ new goFuncTest().go(); } } 

(编辑以添加静态关键字)