- 概述
- 在Java中使用一个变量时,如果我们不给变量初始化,则编译器会自动给变量初始化赋值,使得所有的变量在使用前都能得到恰当的初始化。
- 对于方法中的局部变量,如果不初始化就使用,则会报错(类似“The local variable i may not have been initialized”的错误信息)。
- 举例
- 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 }
- View Code
- 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 }
- View Code
- 执行类代码如下:
1 public class Test {
2 public static void main(String[] args) {
3 Dog d = new Dog();
4 }
5 }
- View Code
- 执行结果如下图:
- 分析如下:
- 由Dog类代码可知,成员变量kind是在构造方法中初始化的,成员变量name是在定义时初始化的,其他变量则没有初始化。
- 在main方法中创建了Dog对象,将调用构造方法。
- 构造方法中第一行代码是打印成员变量name的值,由于name在定义时就初始化了,所以name的值就是其定义时初始化的值“jack”;
- 构造方法中第二行代码是打印成员变量kind的值,虽然kind没有在定义时初始化,但是上图显示的结果却是null,这说明编译器为kind初始化了一个null值。
- 构造方法中第三行代码则是为kink赋值为“哈士奇”,所以第四行代码自然而然的打印出了kind的值是“哈士奇”。
- 构造方法的第五行代码之后,都是打印的未初始化的变量的值,由上面截图可知,虽然没有给这些变量赋值,但是他们却都打印出了值。
- 结论:
- 如果我们没有给变量赋值,则编译器会自动为每个变量赋一个恰当的值,具体情况如下:
- int类型的初始化默认值是 0
- double类型的初始化默认值是 0.0d
- float类型的初始化默认值是 0.0f
- byte类型的初始化默认值是 0
- short类型的初始化默认值是 0
- lang类型的初始化默认值是 0
- char类型的初始化默认值是 “\0000”
- boolean类型的初始化默认值是 false
- 引用类型(如Order)的初始化默认值是 null
- 另外,数组引用类型的变量的默认值为 null。当数组变量实例化后,如果没有没有显示的为每个元素赋值,Java 就会把该数组的所有元素初始化为其相应类型的默认值。
- 定义时初始化和构造器初始化的差异:变量定义时初始化的次数是一次,如上面的变量name;而构造器初始化的次数是两次,首先编译器发现kind没有初始化,自动为kind赋null值,然后在构造方法中,再次初始化为“哈士奇”。