歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java類的實例化探究

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

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

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

詳細內容如下:


顯性的實例化:

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

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

  1. public class Test  {  
  2.   
  3.     String strA = "xyz";  
  4.     String strB ;  
  5.       
  6.     public Test(String str){  
  7.         strB = str ;  
  8.     }  
  9.     public static void main(String[] args){  
  10.             Test t = new Test("abc");  
  11.     }  
  12.       
  13. }  
在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.   
  3.     String strA = "xyz";  
  4.     String strB ;  
  5.       
  6.     public Test(String str){  
  7.         this();  
  8.     }  
  9.     public Test(){  
  10.         strB = "mno";  
  11.     }  
  12.       
  13.     public void print(){  
  14.         System.out.println(strB);  
  15.     }  
  16.       
  17.     public static void main(String[] args){  
  18.             Test t = new Test("abc");  
  19.             t.print();  
  20.     }  
  21.       
  22.       
  23. }  
執行結果為
  1. mno  

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

Copyright © Linux教程網 All Rights Reserved