Java类静态代码块、构造块、构造器的执行顺序

By | 06月09日
Advertisement

代码:

public class TestClass {      static {         System.out.println("1");     }      {         System.out.println("2");     }      public TestClass() {         System.err.println("3");   //注意这里是err,不是out     }      public static void main(String[] args) {         new TestClass();     } }

问:输出结果是什么?

很有趣的是,不同的情况有不同的结果。

使用MyEclipse、Intellij Idea等IDE工具运行时,结果不定。有时是:

1

2

3

有时又是:

1

3

2

还有可能是

3

1

2

甚至还有这种的:

31

2

大家没看错哈,3和1就是在一行的,同时与2之间就是有那么一个空白行。不知为啥,请大神求解。

上面的结果是在IDE中运行。而假如手动编译源文件,手动运行,结果又不一样了。看截图:

Java类静态代码块、构造块、构造器的执行顺序

上面结果无论是对TestClass.java编译一次,多次运行还是多次编译多次运行,结果始终一样,都是上图你看到的结果。

有趣吧?哈哈

如有大神知晓,为什么IDE中结果不定,而手动运行结果一致的缘由,还望指教指教!

另外还有趣的是,上面的代码不是特意注释了构造器中的代码是 err,而不是 out 吗,现在把这个err改为out,那么无论是在IDE中执行还是手动编译执行,运行结果都是

1

2

3

什么原因啊?

无论怎样,个人认为手动运行的结果是正确的,其他不同的结果应该是受IDE环境的影响。所以可以得出结论静态代码块、构造块、构造器的执行顺序是:

静态代码块-->构造块-->构造器(构造函数)。

Similar Posts:

  • java静态成员静态代码块初始化顺序

    最近写一个配置类打算配置文件的信息 用一个配置类的静态成员保存,所以在静态代码块里读取配置文件.考虑类 加载 后 类静态成员变量与类静态代码块的执行顺序问题. 如果静态代码块先实行 而类的 静态成员变量未执行.那 在静态成员变量初始化之前 就向静态成员变量赋值是不是会出 问题. 经测试 非实例对象 执行的顺序 是 类加载 首先初始化 类静态成员变量 类静态代码块 ,静态方法是调用的时候执行. package com.yjm.ldapdao; import java.io.IOException;

  • java中静态代码块的用法和static用法详解

    (一)java 静态代码块 静态方法区别 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用 比如main方法就必须是静态的 这是程序入口 两者的区别就是:静态代码块是自动执行的; 静态方法是被调用的时候才执行的. 静态方法 (1)在Java里,可以定义一个不需要创建对象的方法,

  • [转]Java中静态代码块及对象的初始化顺序

    from:http://lehsyh.javaeye.com/blog/569674 修正了原文的一点错误 class Parent { static String name = "hello"; static { System.out.println("parent static block"); } { System.out.println("parent block"); } public Parent() { System.out.pri

  • 静态代码块 构造代码块 构造函数 的用法和执行顺序

    (一)java 静态代码块 静态方法区别 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用 比如main方法就必须是静态的 这是程序入口 两者的区别就是:静态代码块是自动执行的; 静态方法是被调用的时候才执行的. 静态方法 (1)在Java里,可以定义一个不需要创建对象的方法,

  • java中静态代码块 静态方法 static

    java 静态代码块 静态方法区别 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用 比如main方法就必须是静态的 这是程序入口 两者的区别就是:静态代码块是自动执行的; 静态方法是被调用的时候才执行的. 静态方法 (1)在Java里,可以定义一个不需要创建对象的方法,这种方

  • new 对象时,其静态成员变量、非静态成员、代码块、构建器的执行顺序

    1.示例代码: class Dmeo { int a=f1(); static int b=f2(); Demo() { System.out.println("构建器开始执行!"); } { System.out.println("非静态代码块执行!"); } static { System.out.println("静态代码块执行!"); } int f1() { System.out.println("非静态变量开始初始化&quo

  • java 静态语句块 构造快 构造器的初始化顺序

    /* * * All Rights Reserved. */ package com.thinkInJava.chapter05; public class Father { public Father() { System.out.println("Father"); } static { System.out.println("I am Father class"); } { System.out.println("Father Class"

  • [置顶] Java中普通代码块,构造代码块,静态代码块区别及代码示例

    //执行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. 其中静态代码块只执行一次.构造代码块在每次创建对象是都会执行. 1 普通代码块 1 //普通代码块:在方法或语句中出现的{}就称为普通代码块.普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--"先出现先执行" 2 public class CodeBlock01{ 3 public static void main(String[] args){ 4 5 { 6 int x

  • java基础--java静态代码块和静态方法的区别、static用法

    转载自: http://blog.sina.com.cn/s/blog_afddb8ff0101aqs9.html 静态代码块:有些代码必须在项目启动的时候就执行,这种代码是主动执行的(当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性的初始化) 静态方法:需要在项目启动的时候就初始化,在不创建对象的情况下,这种代码是被动执行的(静态方法在类加载的时候 就已经加载 可以用类名直接调用) 两者的区别就是:静态代码块是自动执行的; 静态方法是被调用的时候才执行的. 使用类的静态方

  • [置顶] Java中初始化对象的顺序,静态代码块的用法以及Static的用法详解

    (一)java 静态代码块 静态方法区别 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用 比如main方法就必须是静态的 这是程序入口 两者的区别就是:静态代码块是自动执行的; 静态方法是被调用的时候才执行的. 静态方法 (1)在Java里,可以定义一个不需要创建对象的方法,

Tags: