歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java類的實例化探究

Java類的實例化探究

日期:2017/3/1 10:17:53   编辑:Linux編程

java類的實例化(instantiation)具有顯性的和隱性的區別。

一般編程時,我們鎖使用new的方法實例化,這是最簡單直接的顯性實例化。另外還有三種實例化,分別為反射機制中的newInstance()方法,類的clone()方法 和 解串行化使用的ObjecInputStream中的getObject()方法。

而隱性的實例化則出現在java程序的整個生命周期中,包括String 、 Class ,StringBuffer 或者StringBuilder的實例化。

詳細內容如下:


顯性的實例化:

1.直接使用new關鍵字創建新的對象

調用相應的構造函數完成實例化。(類中的非靜態成員變量如果有初始化語句,都會被隱式的加入到構造函數中)代碼如下:

  1. public class Test {
  2. String strA = "xyz";
  3. String strB ;
  4. public Test(String str){
  5. strB = str ;
  6. }
  7. public static void main(String[] args){
  8. Test t = new Test("abc");
  9. }
  10. }
在eclipse中裝了ASM bytecode插件後,觀察.class文件中的構造函數對應的字節碼如下:
  1. INVOKESPECIAL Object.<init>() : void
  2. ALOAD 0: this
  3. LDC "xyz"
  4. PUTFIELD Test.strA : String
  5. ALOAD 0: this
  6. ALOAD 1: str
  7. PUTFIELD Test.strB : String
  8. RETURN

關鍵在於LDC"xyz"這條指令,明顯可以看出,這是用於strA初始化的字符串。

由此我們可以歸納出,在沒有調用 本類中其他的構造函數的情況下,每次類的構造函數中都會按如下順序進行:

a)隱式(或顯性)的調用父類的構造函數,

b)然後執行寫在構造函數外的成員變量的初始化賦值

c)最後再執行構造函數中的命令。

如果是有顯性的調用本類其他構造函數(必須是放在構造函數第一步執行),那麼對於這個構造函數,處理過程就簡單些了:

a)調用那個構造函數。

b)執行之後的代碼。

  1. public class Test {
  2. String strA = "xyz";
  3. String strB ;
  4. public Test(String str){
  5. this();
  6. }
  7. public Test(){
  8. strB = "mno";
  9. }
  10. public void print(){
  11. System.out.println(strB);
  12. }
  13. public static void main(String[] args){
  14. Test t = new Test("abc");
  15. t.print();
  16. }
  17. }
執行結果為
  1. mno

至於為什麼一定要將另外一個構造函數放在構造函數的第一步:必須先處理好heap中的變量初始化後才能下一步執行。

Copyright © Linux教程網 All Rights Reserved