1、成员变量的初始化

如果你在方法中定义一个变量而不去初始化就使用它就会报错,如下

int i;
System.out.println(i);

但是你在对象中定义了一些变量,然后你new这个对象,就会被自动初始化。

如果变量是基本数据类型,那么就会初始化为默认值,如果是包装类型或引用就会初始化为 null

public class Test1 {

    private int aa;
    private Integer a;
    @Override
    public String toString() {
        return "Test1{" + "aa=" + aa + ", a=" + a + '}';
    }
    public static void main(String[] args) {
        Test1 t = new Test1();
        System.out.println(t);
    }
}

//打印结果:Test1{aa=0, a=null}

 

当然你也可以使用方法来初始化

int i = f();
int f() {  return 1; }

 

2、构造器初始化

 

2-1: 构造器无法阻止自动初始化的进行,它将在构造器呗调用之前发生。

下面这个代码,i 先等于 0 ,在等于 7

public class Test {
    int i;
    Test(){ this.i = 7; };
}

2-2:因此编译器不会强制你一定要在构造器的某个地方或使用它们之前对元素进行初始化 —— 因为初始化早已得到了保证。

2-3:在内的内部,变量定义的先后顺序也就是初始化的顺序。不管变量定义在什么位置,它都会在任何方法(包括构造器)被调用之前得到初始化。

 

3、静态数据的初始化

 

3-1:static关键字不能应用于局部变量,只能作用于域。

3-2:如果没有对静态数据初始化,如果是基本数据类型那么就会初始化为 相对应的默认值,如果是引用对象,那么初始化的值为null。

3-3:如果静态数据没有被引入就不会被初始化。如果已经初始化了,静态数据不会再次被初始化。

3-4:静态数据总是先于非静态数据得到初始化。

 

 

注:文章参考《java编程思想》第四版