匿名類相關(guān)知識(shí)

什么算是匿名內(nèi)部類,怎么體現(xiàn)出匿名這兩個(gè)字

首先為什么要出現(xiàn)這個(gè)匿名內(nèi)部類,說白了就是想簡化一些代碼的編寫,匿名就是連名字都沒有,也就是不是經(jīng)常創(chuàng)建的(只創(chuàng)建一次);另外匿名類必須繼承一個(gè)類(實(shí)現(xiàn)了接口或者是個(gè)抽象類)或者實(shí)現(xiàn)一個(gè)接口

abstract class Person{ abstract void speak();}

class Man extends Person{ @Override void speak() { System.out.println("i am man,i can speak"); }}

class Woman extends Person{ @Override void speak() { System.out.println("i am woman,i can speak"); }}

Person xiaoming=new Man();

xiaoming.speak();

上面的是正常寫法,Man和Women對(duì)speak的方法實(shí)現(xiàn)不相同

但是我的業(yè)務(wù)不經(jīng)常用Man或者Women類,于是乎出現(xiàn)了下面的這種寫法

Person xiaoming= new Person(){ @Override void speak() { System.out.println("i am man,i can speak"); } };xiaoming.speak();

具體你想怎樣實(shí)現(xiàn)就怎么實(shí)現(xiàn),不需要?jiǎng)?chuàng)建中間類(Women或者M(jìn)an),這樣就簡化了代碼的編寫

當(dāng)然我們也可以把抽象類換成Interface,在Android中我們應(yīng)該用匿名類為某個(gè)控件添加點(diǎn)擊事件如下

view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { }});

上面的OnClickListener是個(gè)接口

接下來還有Thread,這個(gè)我們應(yīng)該也使用過

Thread thread=new Thread(){ @Override public void run() { }};

在run里面寫自己的相應(yīng)實(shí)現(xiàn)

之所以寫匿名類是因?yàn)锳ndroid開發(fā)中內(nèi)存泄漏中,其中一種場景是使用匿名內(nèi)部類造成的內(nèi)存泄漏

為什么會(huì)泄漏呢,有小伙伴說我經(jīng)常用,怎么沒有遇到內(nèi)存泄漏,內(nèi)存泄漏并不一定導(dǎo)致程序崩潰,如果你想知道有沒有內(nèi)存泄漏可以使用Profiler工具或者集成LeakCanary檢測;生命周期不同是內(nèi)存泄漏的真正原因

我們回歸到匿名類上,我們使用匿名類的時(shí)候會(huì)持有外部類的引用的,當(dāng)外部類被回收時(shí),匿名內(nèi)部類還在運(yùn)行中,故外部類就不能進(jìn)行回收,就會(huì)造成內(nèi)存泄漏

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容