什么算是匿名內(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)存泄漏