Java中类成员变量初始化顺序
一、 定义处默认初始化vs构造函数中初始化
java中类成员变量支持在声明处初始化,也可以在构造函数中初始化,那么这两者有什么区别呢?看下面例子
1 public class FieldsInit { 2 public static void main(String[] args) { 3 Test test = new Test(); 4 } 5 } 6 class Print 7 { 8 public Print(String s) { 9 System.out.println(s); 10 } 11 } 12 class Test 13 { 14 private Print p1 = new Print("inin in declare"); 15 private Print p2; 16 private Print p3 = new Print("init in declare"); 17 18 public Test() { 19 this.p2 = new Print("init in contructor"); 20 } 21 }
输出结果:
inin in declare
init in declare
init in contructor
结论:说明类中普通成员变量定义处默认初始化先与在构造函数中初始化
区别:除了初始化顺序不一样还有什么区别?对类的使用者来说,在构造函数中初始化更加灵活,可以通过构造函数参数初始化
二、静态变量vs非静态变量初始化,看下面例子
1 public class FieldsInit { 2 public static void main(String[] args) { 3 Test test = new Test(); 4 } 5 } 6 class Print 7 { 8 public Print(String s) { 9 System.out.println(s); 10 } 11 } 12 class Test 13 { 14 private Print p3 = new Print("non static var init"); 15 private static Print p1 = new Print("static var init"); 16 }
输出结果:
static var init
non static var init
结论:说明静态变量初始化先与非静态成员变量初始化