JAVA-初步認識-第十一章-object類-Getclass方法


一.

只看名字,是獲取類的意思。

什么叫運行時類?

現在進行一個前期的鋪墊介紹,在創建對象前先要有class文件,這是個字節碼文件。

先要加載class文件,后面才能接着運算。現在舉了一個例子,如下

Demo類和Class類,對它們的共性進行抽取。類文件都有一個共性特點就是,它里面都是源文件中所描述的那些成員,只不過類文件將它們變成了字節碼,變成了另外一種符號形式而已。

它們既然有共性,那就可以進行抽取(但這個共性抽取起來比較麻煩,被抽取的內容不是很具體)。抽完以后就形成了類,接着我們用java語言對這個字節碼文件進行描述。

能描述字節碼文件的類就不需要定義了,它里面有。注意是大寫的C,小寫是關鍵字,大寫是類名。

它是專門描述字節碼文件的類,這里面描述的內容就有很多了,首先無論什么字節碼文件都有名稱(字節碼文件的名稱),(這里是對getclass類進行描述)。接着無論什么樣的字節碼文件里面都有字段field,就是屬性,也是成員變量。無論什么樣的字節碼文件,里面都有constructor,構造器。無論什么樣的類文件,里面都有方法。

上述這些都是類文件的組成部分,因此用這個類描述完了類文件這個事物以后,就可以產生類的對象(感覺這像是一個創建對象的前提條件,乃至於是加載類的前提條件)。

這個Class對象是不需要你去new的,而且你也new不了。

這個字節碼對象(Test.class)本身就是你字節碼一進內存就已經被變成了對象,或者說封裝成了對象。你想拿字節碼文件里的東西,只要通過Class對象里面的方法就能拿到。

我想拿人里面的東西,有了人對象就易如反掌。因為有方法,getage,getname….

所以這個類在哪兒,就在getclass。getclass方法返回的就是Class對象(萬物皆對象,類也是對象)。

現在,我們把這個流程畫一下,現在我們讀到了person.class文件。一裝載進內容,其實第一步就在在堆內存中產生了一個對象,其實這個就是person.class對象。就是字節碼文件對象。先把它加載進來,並封裝成對象。封裝完以后,將它們的內容進行公約分布完以后,我們再產生new的時候,其實在干嘛呀?其實根據字節碼文件,在內存中產生了一個person對象。這就是我們說的new person。

如果說還要new相同類型的對象,那就不需要加載class文件了。也就是說內存中的任意一個對象都有自己所屬,也就是自己所屬的字節碼文件。因為對象都是字節碼文件創建的(那么這些創建的對象也是字節碼格式么?)。

這個getclass方法就是獲取當前對象所屬的字節碼文件對象。

現在做一個演示,

按照上面截圖的寫法,拿到的就是p1對象所屬的字節碼文件。

按下圖所示,拿到就是Person.class這個對象。

這個對象什么類型,大寫的Class類型,往下面看,字節碼文件抽取出來的就是大寫Class類型。

接着使用getclass方法

我是覺着兩者是相等的,因為使用getclass方法后,得到就是一個抽出來的共同的大寫Class類。→不對,getclass方法是用來獲取字節碼文件的,而不是字節碼文件的父類。

結果顯示,它們就是相等的。

以下圖來講解,person(29)為p1,person(40)作為p2,它們都是以Person.class產生的,它們拿的都是Person.class對象的地址(這里不是比較p1和p2對象的地址,而是它們字節碼文件地址,比較的是兩個clazz)。一個person.class產生好多對象,都來這這么一個文件,這個對象在內存中只有一份,不可能有第二份。

現在類文件對象被我們拿到了,它是有名字的,

我們看Class這個類里面都有什么。

只要有了類字節碼文件對象,它里面有什么東西,我們說拿到就拿到。就和我們有人對象一樣,

上面程序運行的結果就是person。

總結:現在回過來,想想調用getclass方法得到的到底是什么東西?

講解字節碼文件抽出出來的父類,可能就是為了后面定義Class clazz1中的Class講解做鋪墊。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM