1.對(duì)象有編譯類型和運(yùn)行類型
Object obj = new Date();
編譯類型:Object ? ? ? 運(yùn)行類型(obj對(duì)象的真實(shí)類型):Date
需求:根據(jù)對(duì)象obj調(diào)用Date類種的一個(gè)方法匾效,toLocaleString,如何來做波丰?
obj.toLcaleString()代碼在編譯階段去編譯類型Object中檢查是否有該方法宛畦,若沒有惹挟,編譯失敗滔岳。身隐。
解決方案:
1:強(qiáng)制轉(zhuǎn)換obj為Date類型(必須知道obj的真實(shí)類型)
2:在不知道obj的真實(shí)類型的情況下邀泉,就用反射。胚迫。
那什么是反射喷户?反射是 得到元數(shù)據(jù)的行為。即Class是對(duì)一切類功能行為和狀態(tài)的抽象
元數(shù)據(jù):metadata 描述數(shù)據(jù)的描述數(shù)據(jù)
Class類:用于描述一切類/接口访锻。
Class實(shí)例:就是指JVM(虛擬機(jī))中的一份字節(jié)碼
對(duì)于對(duì)象來說褪尝,可以直接使用以下3種來獲取Class實(shí)例
1)對(duì)象.getClass()
2)Class.forName(className[類的權(quán)限定名:包名+類名]);
3)數(shù)據(jù)類型.class
但是我們的基本數(shù)據(jù)類型,就沒有類的權(quán)限定名期犬,也沒有g(shù)etClass方法河哑。
問題:那么如何使用Class類來表示基本數(shù)據(jù)類型的Class實(shí)例?
byte,short,int,long,char,float,double,boolean ?八大基本數(shù)據(jù)類型及 void 關(guān)鍵字
上述8種類型和void關(guān)鍵字龟虎,都有class屬性
表示int 的Class對(duì)象:Class clz = int.class; 泛型為包裝類Integer
表示Boolean的Class對(duì)象:Class clz =boolean.class
表示void的Class對(duì)象:Class clz = void.class;
說有的數(shù)據(jù)類型都有class屬性璃谨,表示都是Class對(duì)象
思考:
int的包裝類Integer
Integer.class ? ?==? ?int.class
System.out.println(Integer.class ?== int.class) ?==> false;
結(jié)果是false,說明是兩份字節(jié)碼鲤妥。
Integer 和 int 是同一種 數(shù)據(jù)類型嗎佳吞?
public void show(Integer i){}
public void show(int a){}
??答案是: 不是;
但是在八大基本數(shù)據(jù)類型的包裝類種都有一個(gè)頭常量:TYPE.
TYPE表示的是該包裝類對(duì)應(yīng)的基本數(shù)據(jù)類型的class實(shí)例棉安;
例:Integer.TYPE ?==> int.class
System.out.println(Integer.TYPE? == int.class)? ==> true;
System.out.println(Integer.TYPE? == Integer.class)? ==> false;
數(shù)組的Class實(shí)例:
String[] sArr1 = {"A","C"};
String[] sArr2 = {}底扳;
String[][] sArr = {};
int[] iArr = {};
表示數(shù)組的Class實(shí)例:
String[] sArr1 = {"A","C"};
Class clz = String[].class;//此時(shí)clz表示的就是一個(gè)String類型的一維數(shù)組類型
所有具有相同元素類型和維數(shù)的數(shù)組才共享同一份字節(jié)碼(Class對(duì)象)
注意:和數(shù)組中的元素沒有一點(diǎn)關(guān)系。