編譯類型和運行類型
Object obj = new Date();
編譯類型:Object
運行類型(obj對象真實的類型):Date
需求:
根據對象obj調用Date類中的一個方法
obj.toLocalString();
toLocalString 是Date中的方法。編譯的時候出錯
代碼在編譯階段去編譯類型Object中檢查該方法,若沒有,編譯失敗
解決方案:
強制轉換obj爲Date類型:
Date d = (Date)obj;
d.toLocalString();//yes
強制轉換:
前提:必須知道對象的真是類型是什麼?
若不知道obj的真實類型,那又如何調用toLocalString方法?
元數據:metadata
描述數據的描述數據
反射
得到元數據的原型,得到元數據的行爲
對象:數據 -》類:描述對象 :描述數據-》描述類的類:描述數據的描述數據
class數對一切類共同功能行爲和狀態的抽象
class中有應該有類具備的成員
getPackage():表示類的包
getSuperClass():表示累的父類
getMethods():
getField():
通過反射,可以得到一個類中的包、類名、父類、字段、方法
但是前提,必須知道,你反射的是那一個類
得到某一個類中的所有成員的一種機制。
class類和class類實例
person類代表人,他的實力對象就是張三、李四這樣這樣具體的人
class類代表Java類,他的實例對象:
對應各個類在內存中的字節碼,如:Person類的字節碼
一個類在虛擬機中只要一份字節碼
CLASS類:用於描述一切類/接口===枚舉是一種類,註解是一種接口
class實例:就指JVM中一份字節碼
問題:
那class實例到底表示的是那一份字節碼,爲了明確區分出Class實例表示的是誰的字節碼,Class類提供了泛型Class<T(當前所表示的字節碼類型)>
Class<Date> clz1 = Date.class;//clz1表示的是Date的字節碼
class<String> clz2 = Date.class;//clz2表示的是String的字節碼
獲得class的實例:
1、類名.class(就是一份字節碼)
class<User> clz1 = User.class;//一份字節碼
2、Class.forName(String className);//根據一個類的全限定名來構建Class對象
Class<?> CLZ2 = Class.forName("cn.com.User");
3、每一個對象都有getClass()方法:obj.getClass();返回對象的真實類型(運行類型)
對象.getClass();得到對象的真實類型
Object obj = new Date();
Class clz3 = obj.getClass();
同一份字節碼,在java虛擬機中有且僅有一份