1. 概述
  1. 在Java中使用一个变量时,如果我们不给变量初始化,则编译器会自动给变量初始化赋值,使得所有的变量在使用前都能得到恰当的初始化。
  2. 对于方法中的局部变量,如果不初始化就使用,则会报错(类似“The local variable i may not have been initialized”的错误信息)。
  1. 举例
  1. Dog类代码如下:
1 public class Dog implements Serializable {
 2 
 3     private static final long serialVersionUID = 2239821175446189806L;
 4     private String kind;
 5     private String name = "jack";
 6     private int i;
 7     private double d;
 8     private float f;
 9     private byte b;
10     private short s;
11     private long l;
12     private char c;
13     private boolean bl;
14     private Order order;
15 
16     public Dog() {
17         System.out.println(this.name);
18         System.out.println(this.kind);
19         this.kind = "哈士奇";
20         System.out.println(this.kind);
21         System.out.println("编译器为int类型设置的初始化默认值为:" + i);
22         System.out.println("编译器为double类型设置的初始化默认值为:" + d);
23         System.out.println("编译器为float类型设置的初始化默认值为:" + f);
24         System.out.println("编译器为byte类型设置的初始化默认值为:" + b);
25         System.out.println("编译器为short类型设置的初始化默认值为:" + s);
26         System.out.println("编译器为long类型设置的初始化默认值为:" + l);
27         System.out.println("编译器为char类型设置的初始化默认值为:" + c);
28         System.out.println("编译器为boolean类型设置的初始化默认值为:" + bl);
29         System.out.println("编译器为引用类型(如Order)设置的初始化默认值为:" + order);
30     }
31 
32     public Dog(String name) {
33         this.name = name;
34     }
35 
36     public String getKind() {
37         return kind;
38     }
39 
40     public void setKind(String kind) {
41         this.kind = kind;
42     }
43 
44     public String getName() {
45         return name;
46     }
47 
48     public void setName(String name) {
49         this.name = name;
50     }
51 
52     public Order getOrder() {
53         return order;
54     }
55 
56     public void setOrder(Order order) {
57         this.order = order;
58     }
59 
60 }
  1. View Code
  2. Order代码如下:
1 public class Order implements Serializable {
 2 
 3     private static final long serialVersionUID = 7441323999887439757L;
 4 
 5     private String orderNo;
 6     private String orderType;
 7 
 8     public Order( String str) {
 9         System.out.println(str);
10     }
11 
12     public String getOrderNo() {
13         return orderNo;
14     }
15 
16     public void setOrderNo(String orderNo) {
17         this.orderNo = orderNo;
18     }
19 
20     public String getOrderType() {
21         return orderType;
22     }
23 
24     public void setOrderType(String orderType) {
25         this.orderType = orderType;
26     }
27 }
  1. View Code
  2. 执行类代码如下:
1 public class Test {
2     public static void main(String[] args) {
3         Dog d = new Dog();
4     }
5 }
  1. View Code
  2. 执行结果如下图:
  3. 分析如下:
  1. 由Dog类代码可知,成员变量kind是在构造方法中初始化的,成员变量name是在定义时初始化的,其他变量则没有初始化。
  2. 在main方法中创建了Dog对象,将调用构造方法。
  3. 构造方法中第一行代码是打印成员变量name的值,由于name在定义时就初始化了,所以name的值就是其定义时初始化的值“jack”;
  4. 构造方法中第二行代码是打印成员变量kind的值,虽然kind没有在定义时初始化,但是上图显示的结果却是null,这说明编译器为kind初始化了一个null值。
  5. 构造方法中第三行代码则是为kink赋值为“哈士奇”,所以第四行代码自然而然的打印出了kind的值是“哈士奇”。
  6. 构造方法的第五行代码之后,都是打印的未初始化的变量的值,由上面截图可知,虽然没有给这些变量赋值,但是他们却都打印出了值。
  1. 结论:
  1. 如果我们没有给变量赋值,则编译器会自动为每个变量赋一个恰当的值,具体情况如下:
  1. int类型的初始化默认值是 0   
  2. double类型的初始化默认值是 0.0d
  3. float类型的初始化默认值是 0.0f
  4. byte类型的初始化默认值是 0
  5. short类型的初始化默认值是 0
  6. lang类型的初始化默认值是 0
  7. char类型的初始化默认值是 “\0000”
  8. boolean类型的初始化默认值是 false
  9. 引用类型(如Order)的初始化默认值是 null
  10. 另外,数组引用类型的变量的默认值为 null。当数组变量实例化后,如果没有没有显示的为每个元素赋值,Java 就会把该数组的所有元素初始化为其相应类型的默认值。
  1. 定义时初始化和构造器初始化的差异:变量定义时初始化的次数是一次,如上面的变量name;而构造器初始化的次数是两次,首先编译器发现kind没有初始化,自动为kind赋null值,然后在构造方法中,再次初始化为“哈士奇”。