Java進階04 RTTI

來源:互聯網
上載者:User

標籤:

 

運行時類型識別(RTTI, Run-Time Type Identification)是Java中非常有用的機制,在Java運行時,RTTI維護類的相關資訊。

多態(polymorphism)是基於RTTI實現的。RTTI的功能主要是由Class類實現的。

 

Class類

Class類是"類的類"(class of classes)。如果說類是對象的抽象和集合的話,那麼Class類就是對類的抽象和集合。

每一個Class類的對象代表一個其他的類。比如下面的程式中,Class類的對象c1代表了Human類,c2代表了Woman類。

 
public class Test{    public static void main(String[] args)    {        Human aPerson = new Human();        Class c1      = aPerson.getClass();        System.out.println(c1.getName());
        Human anotherPerson = new Woman();        Class c2      = anotherPerson.getClass();        System.out.println(c2.getName());  
}}class Human{
/** * accessor */ public int getHeight() { return this.height; } /** * mutator */ public void growHeight(int h) { this.height = this.height + h; }private int height; }class Woman extends Human{ /** * new method */ public Human giveBirth() { System.out.println("Give birth"); return (new Human()); }}
 

當我們調用對象的getClass()方法時,就得到對應Class對象的引用。

在c2中,即使我們將Women對象的引用向上轉換為Human對象的引用,對象所指向的Class類對象依然是Woman。

Java中每個對象都有相應的Class類對象,因此,我們隨時能通過Class對象知道某個對象“真正”所屬的類。無論我們對引用進行怎樣的類型轉換,對象本身所對應的Class對象都是同一個。當我們通過某個引用調用方法時,Java總能找到正確的Class類中所定義的方法,並執行該Class類中的代碼。由於Class對象的存在,Java不會因為類型的向上轉換而迷失。這就是多態的原理。

getClass: 我是誰?

 

除了getClass()方法外,我們還有其他方式調用Class類的對象。

 
public class Test{    public static void main(String[] args)    {        Class c3      = Class.forName("Human");        System.out.println(c1.getName());        Class c4      = Woman.class        System.out.println(c2.getName());      }}
 

上面顯示了兩種方式:

  • forName()方法接收一個字串作為參數,該字串是類的名字。這將返回相應的Class類對象。
  • Woman.class方法是直接調用類的class成員。這將返回相應的Class類對象。

 

Class類的方法

Class對象記錄了相應類的資訊,比如類的名字,類所在的包等等。我們可以調用相應的方法,比如:

getName()         返回類的名字

getPackage()      返回類所在的包

 

可以利用Class對象的newInstance()方法來建立相應類的對象,比如:

Human newPerson = c1.newInstance();  

newInstance()調用預設的不含參數的構建方法。

 

我們可以獲得類定義的成員:

getFields()       返回所有的public資料成員

getMethods()      返回所有的public方法

可以進一步使用Reflection分析類。這裡不再深入。

 

Class類更多的方法可查詢官方文檔:

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html

 

Class類的載入

當Java建立某個類的對象,比如Human類對象時,Java會檢查記憶體中是否有相應的Class對象。

如果記憶體中沒有相應的Class對象,那麼Java會在.class檔案中尋找Human類的定義,並載入Human類的Class對象。

在Class對象載入成功後,其他Human對象的建立和相關操作都將參照該Class對象。

Java進階04 RTTI

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.