JAVA中類、執行個體與Class對象

來源:互聯網
上載者:User

標籤:

      類是物件導向程式設計語言的一個重要概念,它是對一項事物的抽象概括,可以包含該事物的一些屬性定義,以及操作屬性的方法。物件導向編程中,我們都是以類來編碼。

 

執行個體

簡單理解,就是new,就是對類的執行個體化,建立這個類對應的實際對象,類只是對事物的描述,而執行個體化就相當於為這個描述新開闢了一塊記憶體,可以改變這塊地區裡的各種屬性(成員變數),當然,也可以執行個體化多塊地區,只是不同的對象而已。

 

Class

注意這裡C大寫了,與類概念區分開,在java裡,Class是一個實實在在的類,在包 java.lang 下,有這樣一個Class.java檔案,它跟我們自己定義的類一樣,是一個實實在在的類,Class對象就是這個Class類的執行個體了。在Java裡,所有的類的根源都是Object類,而Class也不例外,它是繼承自Object的一個特殊的類,它內部可以記錄類的成員、介面等資訊,也就是在Java裡,Class是一個用來表示類的類。(o(∩_∩)o 有點繞啊,抓住關鍵一點,Class是一個實實在在的類,可以為它建立執行個體,也就是本文後面提到的Class對象,也看叫做Class執行個體)。

  java提供了下面幾種擷取到類的Class對象的方法:

    1) 利用對象執行個體調用getClass()方法擷取該對象的Class執行個體;
        2) 使用Class類的靜態方法forName("包名+類名"),用類的名字擷取一個Class執行個體

        3)運用 類名.class 的方式來擷取Class執行個體;

 

  我們知道java世界是運行在JVM之上的,我們編寫的類代碼,在經過編譯器編譯之後,會為每個類產生對應的.class檔案,這個就是JVM可以載入執行的位元組碼。運行時期間,當我們需要執行個體化任何一個類時,JVM會首先嘗試看看在記憶體中是否有這個類,如果有,那麼會直接建立類執行個體;如果沒有,那麼就會根據類名去載入這個類,當載入一個類,或者當載入器(class loader)的defineClass()被JVM調用,便會為這個類產生一個Class對象(一個Class類的執行個體),用來表達這個類,該類的所有執行個體都共同擁有著這個Class對象,而且是唯一的。

 總結

  在java裡,類只是資訊描述的,寫明了有哪些內部屬性及介面,你可以理解為是定義了一套規則;而Class對象在java裡被用來對類的情況進行表述的一個執行個體,也就是是類的實際表徵,可以理解為是對規則的圖表化,這樣JVM才能直觀的看懂,可以看做是一個模版;而類的執行個體化對象,就是通過模版,開闢出的一塊記憶體進行實際的使用。

 

例子:

我們通過一個例子來理解Class執行個體,為了說明方便,我們建立一個包名深點的類。

建立Name.java(當然,該檔案要放在com\dxjia\sample的目錄下)

 1 package com.dxjia.sample; 2  3 public class Name { 4     static int count = 0; 5     static { 6         count++; 7         System.out.println("Name Class Loaded! count = [" + count + "]" ); 8     } 9 10     public Name() {11         System.out.println("Name Constructor called!");12     }13 14 }

 

再在根目錄建立一個Test主類

 1 import com.dxjia.sample.Name; 2  3 public class Test { 4     static { 5         Name mName; 6         System.out.println("Test Class loaded"); 7     } 8      9     public  static void main(String[] args) {10         System.out.println("entern Test main()");11         12         // Name.class13         Class mClassPointClass;14         // Class.forName("完整包名+類名")15         Class mClassForName;16         // new 對象後,對象.getClass()17         Class mClassObjectPointClass1;18         Class mClassObjectPointClass2;19 20         try {21             //測試 類名.class22             mClassPointClass = Name.class;23             System.out.println("mClassPointClass = " + mClassPointClass);24             25             //測試Class.forName()26             mClassForName = Class.forName("com.dxjia.sample.Name");27             System.out.println("mClassForName = " + mClassForName);28 29             //測試Object.getClass()30             Name name1 = new Name();31             mClassObjectPointClass1 = name1.getClass();32             System.out.println("mClassObjectPointClass1 = " + mClassObjectPointClass1);33         } catch (ClassNotFoundException e) {34             // TODO Auto-generated catch block 35             e.printStackTrace();36             return;37         } 38 39         Name name2;40         System.out.println("defined one Name object");41         name2 = new Name();42         System.out.println("Name object instance done!");43         44         mClassObjectPointClass2 = name2.getClass();45         46         if (mClassForName == mClassPointClass47             && mClassPointClass == mClassObjectPointClass148             && mClassObjectPointClass1 == mClassObjectPointClass2) {49             System.out.println("all the Class object equal...");50         }51     }52 }

分別對他們進行編譯:

1 javac com\dxjia\sample\Name.java2 javac Test.java

執行:

1 java Test

 

代碼中使用了static靜態代碼塊來進行實驗,一個類的運行,JVM做會以下幾件事情 1、類裝載 2、連結 3、初始化 4、執行個體化;而初始化階段做的事情是初始化靜態變數和執行靜態方法等的工作,而且永遠只執行一次。

輸出結果:

Test Class loaded
entern Test main()
mClassPointClass = class com.dxjia.sample.Name
Name Class Loaded! count = [1]
mClassForName = class com.dxjia.sample.Name
Name Constructor called!
mClassObjectPointClass1 = class com.dxjia.sample.Name
defined one Name object
Name Constructor called!
Name object instance done!
all the Class object equal...

 

通過結果可以看出在使用 類名.class獲得Class執行個體時,並不會觸發類的初始化,而 Class.forName方法就會觸發,當然執行個體化對象肯定也是會觸發的,但因為static代碼塊只執行一次,所以不會再有列印,最後的列印,說明一個類的Class執行個體只有唯一的一個。

 

擴充:

對於Class.forName("")方法,可以看看下面這篇文章,結合起來理解,會更清晰:理解Class.forName()

 

 

JAVA中類、執行個體與Class對象

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.