java - 怎樣才算是一個(gè)內(nèi)部類(lèi)
問(wèn)題描述
請(qǐng)問(wèn)下怎樣才算是一個(gè)內(nèi)部類(lèi),最近在看android的Handler方面的東西,有點(diǎn)被搞暈了,一般情況下的內(nèi)部類(lèi)我是明白的,但是為什么Handler也算是Activity的一個(gè)內(nèi)部類(lèi)。
public class MainActivity extends Activity{ private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) { super.handleMessage(msg);} }; }
Handler并已經(jīng)是一個(gè)被定義好的類(lèi),只不過(guò)在使用的時(shí)候一般回去重寫(xiě)其中的handleMessage方法,這樣就算是一個(gè)內(nèi)部類(lèi)了嗎?這里主要是想請(qǐng)問(wèn)下:
內(nèi)部類(lèi)的定義是什么?
編譯器是怎么去判斷一個(gè)類(lèi)是內(nèi)部類(lèi)的
問(wèn)題解答
回答1:如果說(shuō)一般的內(nèi)部類(lèi)你知道,那這個(gè)內(nèi)部類(lèi)你應(yīng)該知道才是,因?yàn)樗亲罨镜摹?/p>
按照 Java 語(yǔ)言的官方定義,內(nèi)部類(lèi)是這樣定義的:
A nested class is a member of its enclosing class.
如果一個(gè)類(lèi)是另一個(gè)類(lèi)的成員,那就是內(nèi)部類(lèi)。內(nèi)部類(lèi)又分為靜態(tài)內(nèi)部類(lèi)和非靜態(tài)內(nèi)部類(lèi)
上述的 handler 是一個(gè)非靜態(tài)內(nèi)部類(lèi)。與靜態(tài)內(nèi)部類(lèi)不同的是,要初始化這樣的內(nèi)部類(lèi)的實(shí)例,必須先有它的外部類(lèi)的一個(gè)實(shí)例。在這樣的非靜態(tài)內(nèi)部類(lèi)中,你可以通過(guò)MainActivity.this引用到外部類(lèi)的實(shí)例。而靜態(tài)內(nèi)部類(lèi)是不可以的。
編譯器只要識(shí)別到一個(gè)類(lèi)是定義在另一個(gè)類(lèi)的內(nèi)部,就能知道它是內(nèi)部類(lèi)。
回答2:這個(gè)叫匿名內(nèi)部類(lèi)
相關(guān)文章:
1. python - 如何正則字符串中的所有漢字2. mysql - 千萬(wàn)級(jí)數(shù)據(jù)的表,添加unique約束,insert會(huì)不會(huì)很慢?3. python - oslo_config4. mysql - 分庫(kù)分表、分區(qū)、讀寫(xiě)分離 這些都是用在什么場(chǎng)景下 ,會(huì)帶來(lái)哪些效率或者其他方面的好處5. mysql - 如何減少使用或者不用LEFT JOIN查詢(xún)?6. mysql - eclispe無(wú)法打開(kāi)數(shù)據(jù)庫(kù)連接7. mysql 5個(gè)left關(guān)鍵 然后再用搜索條件 幾千條數(shù)據(jù)就會(huì)卡,如何解決呢8. mysql - jdbc的問(wèn)題9. 圖片鏈接的地址怎么獲得的10. 視頻文件不能播放,怎么辦?
