什么算是匿名内部类,怎么体现出匿名这两个字
首先为什么要出现这个匿名内部类,说白了就是想简化一些代码的编写,匿名就是连名字都没有,也就是不是经常创建的(只创建一次);另外匿名类必须继承一个类(实现了接口或者是个抽象类)或者实现一个接口
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对speak的方法实现不相同
但是我的业务不经常用Man或者Women类,于是乎出现了下面的这种写法
Person xiaoming= new Person(){ @Override void speak() { System.out.println("i am man,i can speak"); } };xiaoming.speak();
具体你想怎样实现就怎么实现,不需要创建中间类(Women或者Man),这样就简化了代码的编写
当然我们也可以把抽象类换成Interface,在Android中我们应该用匿名类为某个控件添加点击事件如下
view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { }});
上面的OnClickListener是个接口
接下来还有Thread,这个我们应该也使用过
Thread thread=new Thread(){ @Override public void run() { }};
在run里面写自己的相应实现
之所以写匿名类是因为Android开发中内存泄漏中,其中一种场景是使用匿名内部类造成的内存泄漏
为什么会泄漏呢,有小伙伴说我经常用,怎么没有遇到内存泄漏,内存泄漏并不一定导致程序崩溃,如果你想知道有没有内存泄漏可以使用Profiler工具或者集成LeakCanary检测;生命周期不同是内存泄漏的真正原因
我们回归到匿名类上,我们使用匿名类的时候会持有外部类的引用的,当外部类被回收时,匿名内部类还在运行中,故外部类就不能进行回收,就会造成内存泄漏