Java进阶04 RTTI
鏈接地址:http://www.cnblogs.com/vamei/archive/2013/04/14/3013985.html
作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段聲明。謝謝!
?
運行時類型識別(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.classSystem.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快速教程”系列文章
轉載于:https://www.cnblogs.com/wvqusrtg/p/4992526.html
總結
以上是生活随笔為你收集整理的Java进阶04 RTTI的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 读《About Face 4 交互设计精
- 下一篇: 在Ubuntu桌面上显示我的电脑等图标
