一、Java 类的实例变量的初始化
实例变量初始化的三种情形:定义实例变量时,指定初值;非静态初始化块对实例变量指定初始值;构造器中对实例变量指定初始值。
1.1 构造函数初始化&非静态代码段初始化
public class InitFieldTest { String name; int age; int score; public InitFieldTest(String name,int age){ System.out.println("构造函数初始化"); this.name=name; this.age=age; } { System.out.println("非静态代码段初始化"); score = 60; } public void print(){ System.out.println("name:"+name+",age:"+age+",score:"+score); } public static void main(String[] args) { InitFieldTest test1 = new InitFieldTest("bit", 1); test1.print(); InitFieldTest test2 = new InitFieldTest("byte", 8); test2.print(); } } |
测试结果:
可见非静态代码段初始化的初始化顺序优先于构造函数的初始化方式
1.2 定义时初始化&非静态代码段初始化
public class InitFieldTest { String name; int age; int score = 100; public InitFieldTest(String name,int age){ System.out.println("构造函数初始化"); this.name=name; this.age=age; } { System.out.println("定义score时的初始化值:"+score); System.out.println("非静态代码段初始化"); score = 60; System.out.println("非静态代码段初始化score值为:"+score); } public void print(){ System.out.println("name:"+name+",age:"+age+",score:"+score); } public static void main(String[] args) { InitFieldTest test1 = new InitFieldTest("bit", 1); test1.print(); InitFieldTest test2 = new InitFieldTest("byte", 8); test2.print(); } } |
测试结果:
可见定义时初始化优先非静态代码段初始化
如果将定义时初始化与非静态代码段初始化代码交换,代码如下:
public class InitFieldTest { String name; int age; public InitFieldTest(String name,int age){ System.out.println("构造函数初始化"); this.name=name; this.age=age; } { System.out.println("非静态代码段初始化"); score = 60; } int score = 100; public void print(){ System.out.println("name:"+name+",age:"+age+",score:"+score); } public static void main(String[] args) { InitFieldTest test1 = new InitFieldTest("bit", 1); test1.print(); InitFieldTest test2 = new InitFieldTest("byte", 8); test2.print(); } } |
结果如下:
可见非静态代码段初始化优先定义时初始化,得出如下结论:非静态代码段初始化、定义时初始化执行顺序与其在源程序的排列顺序有关。
1.3 结论
三种初始化方式的顺序为:非静态代码段初始化、定义时初始化执行顺序优先于构造函数初始化,非静态代码段初始化、定义时初始化执行顺序与其在源程序的排列顺序有关。