当前位置: 代码迷 >> 综合 >> java创建对象初始化顺序
  详细解决方案

java创建对象初始化顺序

热度:10   发布时间:2024-02-11 06:18:43.0

package java_basic;

public class java_Java创建对象的初始化顺序 {

    /**
* @param args
*/
public static void main(String[] args) {

        Parent p = new Child();new Child();   这俩句话效果一样

        //           parent static init block
//           child static init block
//           parent init block
//           parent constructor
//           child init block
//           child constructor

        /*
* 1,   p静态
* 2,静态
* 3,p初始化,构造
* 4,初始化,构造
*/

        System.out.println();
System.out.println();

        new Child();

        //           parent init block
//           parent constructor
//           child init block
//           child constructor

        /*
* 已经静态一次了
* 1,p初始化,构造
* 2,   初始化,构造
*/

    }

}

class Parent {
private static int ps;
private int pv;

    static {
System.out.println("parent static init block");
}
{
System.out.println("parent init block");
}

    Parent() {
System.out.println("parent constructor");
}
}

class Child extends Parent {
private static int cs;
private int cv;

    static {
System.out.println("child static init block");
}
{
System.out.println("child init block");
}

    Child() {
System.out.println("child constructor");
}

}

/*
* 
Java创建对象的初始化顺序
1. 初始化块

 初始化块通常写在类的构造方法之前,由花括号括起来,通常包含对成员属性进行初始化的语句;

 初始化块分为instance初始化块和static初始化块,初始化块在构造方法执行之前被执行;

 static初始化块不能访问非statci成员,也不能调用非static方法,并且只在类加载时执行一次;

 初始化块通常用于提取多个构造方法中的公共代码。

 2. 初始化的执行顺序

(1)在初次new一个Child类对象时,发现其有父类,则先加载Parent类,再加载Child类。

(2)加载Parent类:

       初始化Parent类的static属性,赋默认值;

       执行Parent类的static初始化块;

(3)加载Child类:

   初始化Child类的static属性,赋默认值;

 执行Child类的static初始化块;

(4)创建Parent类对象:

       初始化Parent类的非static属性,赋默认值;

   执行Parent类的instance初始化块;

   执行Parent类的构造方法;

(5)创建Child类对象:

   初始化Child类的非static属性,赋默认值;

 执行Child类的instance初始化块;

   执行Child类的构造方法;

后面再创建Child类对象时,就按照顺序执行(4)(5)两步。

*/