第十四章-類(lèi)型信息--Class對(duì)象

在Java的思想里面组去,萬(wàn)事萬(wàn)物皆對(duì)象:

其中類(lèi)也是對(duì)象,所有的類(lèi)都是一個(gè)Class對(duì)象势决,可以通過(guò) 類(lèi)名.class 的方式獲取該類(lèi)的Class對(duì)象阻塑,也可以通過(guò)使用Class類(lèi)的一個(gè)靜態(tài)方法forName("全限定類(lèi)名");的方式獲取該類(lèi)的Class對(duì)象,其中forName()方法當(dāng)類(lèi)名不存在的時(shí)候會(huì)拋出一個(gè)ClassNotFoundException異常果复,有趣的一點(diǎn)是,使用 類(lèi)名.class 的方法類(lèi)不會(huì)初始化陈莽,使用forName()方法 類(lèi)會(huì)初始化。Class類(lèi)的一些方法:
1.getName()和getCanonicalName()方法都會(huì)返回一個(gè)全限定類(lèi)名(包含包名)
2.getSimpleName()該方法返回一個(gè)不包含包名的類(lèi)名
3.getInterfaces()返回該類(lèi)實(shí)現(xiàn)的所有的接口
4.isInterface()該類(lèi)為接口時(shí)返回true,否則返回false走搁;
5.getSuperclass();返回該類(lèi)的直接父類(lèi)的Class對(duì)象
6.newInstance();該方法能夠在沒(méi)有任何類(lèi)型信息的情況下創(chuàng)建一個(gè)該類(lèi)的實(shí)例独柑,并返回一個(gè)Object對(duì)象,當(dāng)然私植,在你可以發(fā)送Object能夠接受的消息之外的任何消息之前忌栅,你更多的了解它并執(zhí)行某種轉(zhuǎn)型,該方法是實(shí)現(xiàn)虛擬構(gòu)造器的一種途徑曲稼,虛擬構(gòu)造器允許你申明:“我不知道你的具體類(lèi)型索绪,但是無(wú)論如何你要正確的創(chuàng)建自己”。示例如下:

interface Run{}
interface Eat{}
interface Sleep{}

class People{
    public int a = 10;

    People(){}

    People(int i){}

    @Override
    public String toString() {
        return "this is a class People toString!";
    }
}

class Man extends People implements Run,Eat,Sleep{
    Man(){
        super(1);
    }
}
public class ClassTest {
    public static void main(String[] args){
        Class c = Class.forName("com.cuit.typeinfo.Man");
        Class up = c.getSuperclass();
        People people = null;
        try {
            people = (People) up.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        System.out.println(people.a);
        Object obj = null;
        try {
            obj = up.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        System.out.println(obj.toString());

    }
}

在上例中我們并沒(méi)有up的任何更進(jìn)一步的類(lèi)型信息躯肌,只知道他是一個(gè)Class引用者春,但我們利用newInstance()方法成功的獲得了該類(lèi)的實(shí)例,并在知道了他是People類(lèi)的時(shí)候?qū)⑵滢D(zhuǎn)型為People對(duì)象清女。


類(lèi)字面常量:

為了使用類(lèi)而做的準(zhǔn)備工作實(shí)際包含三個(gè)步驟:
1.加載:由類(lèi)加載器執(zhí)行,創(chuàng)建一個(gè)Class對(duì)象
2.鏈接:為靜態(tài)域分配存儲(chǔ)空間晰筛,如果必須將解析這個(gè)類(lèi)創(chuàng)建的對(duì)其他類(lèi)的所有引用
3.初始化:如果該類(lèi)具有超類(lèi)嫡丙,則對(duì)其初始化,執(zhí)行靜態(tài)初始化器和靜態(tài)初始化塊
關(guān)于初始化有以下幾點(diǎn):
1.初始化被延遲到了對(duì)靜態(tài)方法(構(gòu)造器隱式的是靜態(tài)的)或者非常數(shù)靜態(tài)域進(jìn)行首次引用時(shí)才執(zhí)行
2.關(guān)于 static 和 final 關(guān)鍵字:如果一個(gè)值是編譯期 常量并被聲明為static final那么這個(gè)值不需要初始化便能讀取读第,如果一個(gè)static域不是final的曙博,那么對(duì)它訪(fǎng)問(wèn)時(shí)必須要先進(jìn)行連接(為這個(gè)域分配存儲(chǔ)空間)和初始化(初始化該存儲(chǔ)空間)


泛型與Class:

當(dāng)將泛型語(yǔ)法用于Class對(duì)象時(shí),會(huì)發(fā)生一件有趣的事情:newInstance()方法會(huì)返回該對(duì)象的確切類(lèi)型而不是基本的Object怜瞒,但如果你手頭是超類(lèi)父泳,則有一些不同,如下:

//Class<? super Man> 方式獲得的Class對(duì)象在調(diào)用newInstance()方法時(shí)返回的是Object而不是Man的超類(lèi)People
        Class<People> c = People.class;
        Class<? super Man> upp = c.getSuperclass();
        try {
            Object o = upp.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
 //當(dāng)手頭的是People的子類(lèi)Man時(shí)吴汪,使用newInstance()方法返回People
        Class<? extends People> tClass = Man.class;
        try {
            People people1 = tClass.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

類(lèi)型轉(zhuǎn)換:

當(dāng)嘗試向上轉(zhuǎn)型時(shí)惠窄,編譯器允許自由的做向上轉(zhuǎn)型的賦值操作,二不需要做任何顯示的轉(zhuǎn)型操作
向下轉(zhuǎn)型:
向下轉(zhuǎn)型時(shí)漾橙,編譯器將檢查向下轉(zhuǎn)型是否合理杆融,因?yàn)樗辉试S向下轉(zhuǎn)型到實(shí)際上不是待轉(zhuǎn)型類(lèi)的子類(lèi)的類(lèi)型上,可以使用關(guān)鍵字instanceof霜运,它返回一個(gè)布爾值脾歇,告訴我們對(duì)象是否是某個(gè)特定類(lèi)的實(shí)例

if(x instanceof Man){
    //do something...
}

動(dòng)態(tài)的instanceof: isInstance(T);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市淘捡,隨后出現(xiàn)的幾起案子藕各,更是在濱河造成了極大的恐慌,老刑警劉巖焦除,帶你破解...
    沈念sama閱讀 223,002評(píng)論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件激况,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)誉碴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門(mén)宦棺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人黔帕,你說(shuō)我怎么就攤上這事代咸。” “怎么了成黄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵呐芥,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我奋岁,道長(zhǎng)思瘟,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任闻伶,我火速辦了婚禮滨攻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蓝翰。我一直安慰自己光绕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布畜份。 她就那樣靜靜地躺著诞帐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪爆雹。 梳的紋絲不亂的頭發(fā)上停蕉,一...
    開(kāi)封第一講書(shū)人閱讀 52,821評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音钙态,去河邊找鬼慧起。 笑死,一個(gè)胖子當(dāng)著我的面吹牛驯绎,可吹牛的內(nèi)容都是我干的完慧。 我是一名探鬼主播,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼剩失,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼屈尼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起拴孤,我...
    開(kāi)封第一講書(shū)人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤脾歧,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后演熟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鞭执,經(jīng)...
    沈念sama閱讀 46,716評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡司顿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兄纺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片大溜。...
    茶點(diǎn)故事閱讀 40,928評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖估脆,靈堂內(nèi)的尸體忽然破棺而出钦奋,到底是詐尸還是另有隱情,我是刑警寧澤疙赠,帶...
    沈念sama閱讀 36,583評(píng)論 5 351
  • 正文 年R本政府宣布付材,位于F島的核電站,受9級(jí)特大地震影響圃阳,放射性物質(zhì)發(fā)生泄漏厌衔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評(píng)論 3 336
  • 文/蒙蒙 一捍岳、第九天 我趴在偏房一處隱蔽的房頂上張望富寿。 院中可真熱鬧,春花似錦锣夹、人聲如沸作喘。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至窖贤,卻和暖如春砖顷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赃梧。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工滤蝠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人授嘀。 一個(gè)月前我還...
    沈念sama閱讀 49,378評(píng)論 3 379
  • 正文 我出身青樓物咳,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蹄皱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子览闰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法巷折,內(nèi)部類(lèi)的語(yǔ)法压鉴,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法锻拘,線(xiàn)程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,669評(píng)論 18 399
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理油吭,服務(wù)發(fā)現(xiàn)击蹲,斷路器,智...
    卡卡羅2017閱讀 134,720評(píng)論 18 139
  • 一:java概述:1婉宰,JDK:Java Development Kit歌豺,java的開(kāi)發(fā)和運(yùn)行環(huán)境,java的開(kāi)發(fā)工...
    ZaneInTheSun閱讀 2,662評(píng)論 0 11
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 11,016評(píng)論 6 13
  • 6月已到8日心包,離月底還有22天类咧,到了那天我就要搬離呆了8年的倉(cāng)庫(kù),辦公室谴咸,辦公桌轮听。有時(shí),駐足平臺(tái)岭佳,凝神遠(yuǎn)望血巍,暗自露...
    浪可閱讀 260評(píng)論 0 0