java类的成员初始化顺序

来源:互联网 发布:管家婆备份数据库布 编辑:程序博客网 时间:2024/06/07 13:05

       最近在看Java编程思想,准备系统的巩固一下基础知识。

      对于java类的成员初始化顺序,总结记录一下;

      在一个简单无继承关系的类中 ,通过构造器初始化,直接上代码:

      

public class test {    /**     * Description      * @param args     */    public static void main(String[] args) {        new Java();    }}class Java {    {        System.out.println("Java1 初始化块");    }    static {        System.out.println("Java静态初始化块");    }    {        System.out.println("Java2 初始化块");    }    public Java() {        System.out.println("Java构造函数");    }}
执行结果:

Java静态初始化块Java1 初始化块Java2 初始化块Java构造函数
    可以发现:无继承关系的类中

     1、静态变量或者静态初始化块按照代码中的顺序先执行

     2、非静态变量或者非静态变量初始化块按照代码顺序先执行
     3、构造方法执行

   下面看一下有继承关系的类中初始化顺序

public class initTest {    /**     *  @parm args     */    public static void main(String[] args) {        new Son();        System.out.println("************");        new Son();    }}class Father{    static {        System.out.println("Fathier静态初始化块");    }    {        System.out.println("Fathier 初始化块");    }    public Father() {        System.out.println("Fathier构造函数");    }}class Son extends Father {    {        System.out.println("Son 初始化块");    }    static {        System.out.println("Son静态初始化块");    }    public Son() {        System.out.println("Son构造函数");    }}
结果:

Fathier静态初始化块Son静态初始化块Fathier 初始化块Fathier构造函数Son 初始化块Son构造函数************Fathier 初始化块Fathier构造函数Son 初始化块Son构造函数
可以看到:

1.父类静态成员和静态初始化快,按在代码中出现的顺序依次执行。
2.子类静态成员和静态初始化块,按在代码中出现的顺序依次执行。
3. 父类的非静态成员和非静态初始化块,按在代码中出现的顺序依次执行。
4.执行父类的构造方法。
5.子类非静态成员和非静态初始化块,按在代码中出现的顺序依次执行。
6.执行子类的构造方法。

     

      并且可以看到,静态初始化块只执行一次,非静态初始化快每次都会执行,那么这两者还有什么其他区别呢?

     非静态初始化块主要是用于对象的初始化操作,在每次创建对象的时都要调用一次,其执行顺序在构造方法之前。
在初始化块之前有static修饰,则为静态初始化块。由于非静态成员不能再静态方法中使用,同样也不能在静态初始化块中,因此,静态初始化块主要用于初始化静态变量和静态方法,静态初始化块只调用一次,是在类的第一次加载到内存时,并非一定要创建对象才执行,静态初始化块比非静态初始化块先执行。


原创粉丝点击