- 概述
- 在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 }
- 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 public class Test { 2 public static void main(String[] args) { 3 Dog d = new Dog(); 4 } 5 }
- 執行結果如下圖:
-
- 分析如下:
- 由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值,然后在構造方法中,再次初始化為“哈士奇”。
- 如果我們沒有給變量賦值,則編譯器會自動為每個變量賦一個恰當的值,具體情況如下:
- Dog類代碼如下: