Java基礎知識之初始化——定義時初始化和構造器初始化的差異


  1. 概述
    1. 在Java中使用一個變量時,如果我們不給變量初始化,則編譯器會自動給變量初始化賦值,使得所有的變量在使用前都能得到恰當的初始化。
    2. 對於方法中的局部變量,如果不初始化就使用,則會報錯(類似“The local variable i may not have been initialized”的錯誤信息)。
  2. 舉例
    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 }
      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 }
      View Code
    3. 執行類代碼如下:
      1 public class Test {
      2     public static void main(String[] args) {
      3         Dog d = new Dog();
      4     }
      5 }
      View Code
    4. 執行結果如下圖:
      1.  
    5. 分析如下:
      1. 由Dog類代碼可知,成員變量kind是在構造方法中初始化的,成員變量name是在定義時初始化的,其他變量則沒有初始化。
      2. 在main方法中創建了Dog對象,將調用構造方法。
      3. 構造方法中第一行代碼是打印成員變量name的值,由於name在定義時就初始化了,所以name的值就是其定義時初始化的值“jack”;
      4. 構造方法中第二行代碼是打印成員變量kind的值,雖然kind沒有在定義時初始化,但是上圖顯示的結果卻是null,這說明編譯器為kind初始化了一個null值。
      5. 構造方法中第三行代碼則是為kink賦值為“哈士奇”,所以第四行代碼自然而然的打印出了kind的值是“哈士奇”。
      6. 構造方法的第五行代碼之后,都是打印的未初始化的變量的值,由上面截圖可知,雖然沒有給這些變量賦值,但是他們卻都打印出了值。
    6. 結論:
      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 就會把該數組的所有元素初始化為其相應類型的默認值。
      2. 定義時初始化和構造器初始化的差異:變量定義時初始化的次數是一次,如上面的變量name;而構造器初始化的次數是兩次,首先編譯器發現kind沒有初始化,自動為kind賦null值,然后在構造方法中,再次初始化為“哈士奇”。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM