一.在创建类时为成员变量赋值和在构造函数中的赋值的先后顺序
在未用构造器之前其实已经将类的字段进行了赋值只是在调用构造器时,又将类的字段进行了重新的赋值。如下:
package com.cjm.inititalize; public class Initialize2 { public static void main(String[] args) { new A1(); } } class A1{ private int i; private B1 b; public A1 () { System.out.println("在初始化函数调用前:i的值为:"+i+"在初始化之前引用b的值为:"+b); i=4; b=new B1(); System.out.println("初始化之后的i值为:"+i+"初始化之后的b为"+b); } } class B1{ }
结果如下:
1.非静态成员变量赋值优先于构造函数且成员变量的赋值顺序按照初始化的顺序
public class Inititalize { private A a1 = new A("a1"); public Inititalize() { System.out.println("Inititalize类被初始化!"); } private A a2=new A("a2"); public static void main(String[] args) { new Inititalize(); }
结果如下:
2.静态成员赋值优先于非静态成员赋值,非静态成员优先于构造函数的
注意:静态变量只会初始化一次,且必须在创建是就初始化
public class Inititalize { private A a1 = new A("a1"); public Inititalize() { System.out.println("Inititalize类被初始化!"); } private static A a2=new A("a2"); public static void main(String[] args) { new Inititalize(); } }
结果为:
3.静态方法块的初始化同样也优先于非静态成员赋值
注意静态方法的变量为局部变量,生命周期仅在方法块中。
public class Inititalize { private A a1 = new A("a1"); public Inititalize() { System.out.println("Inititalize类被初始化!"); } private static A a2=new A("a2"); public static void main(String[] args) { new Inititalize(); } static { A a3=new A("a3"); } }
结果如下::
小结:
public class Inititalize { private A a1 = new A("a1");//4 private B b2=new B("b2");//5 public Inititalize() { System.out.println("Inititalize类被初始化!"); } private static A a2=new A("a2");//1 public static void main(String[] args) { new Inititalize(); } static {//2 A a3=new A("a3"); } private static B b1=new B("b1");//3 }
结果如下:
由上可知初始化顺序为:静态成员变量/静态方法块,成员变量初始化/方法块,构造函数。