有了前几篇内部类的基础,现在我们进一步学习没名字的内部类,即匿名内部类。
我们先写一段常规代码:
定义一个接口PersonAnonyInnerClass和它的抽象方法study:
interface PersonAnonyInnerClass{
public abstract void study();
}
定义接口的实现类StudentAnonyInnerClass并重写study方法:
class StudentAnonyInnerClass implements PersonAnonyInnerClass{
@Override
public void study() {
System.out.println("day day up.");
}
}
定义一个Demo类PersonDemoAnonyInnerClass和它的method方法,将PersonAnonyInnerClass作为参数,
ps:接口名作为形参,实际上需要的是接口的实现类的对象。
class PersonDemoAnonyInnerClass{
public void method(PersonAnonyInnerClass p){
p.study();
}
}
接下来我们在main中调用method:
PersonAnonyInnerClass p = new StudentAnonyInnerClass();
PersonDemoAnonyInnerClass pd = new PersonDemoAnonyInnerClass();
pd.method(p);
现在我们使用匿名内部类来做:
pd.method(new PersonAnonyInnerClass() {
@Override
public void study() {
System.out.println("day day up.");
}
});
瞬间搞定,简化代码。
小结:
1.条件:匿名内部类需要继承类或者接口实现类的匿名对象;
2.优点:栈内存没东西指向你,用完就是垃圾,可以马上被回收;
3.缺点:只能用1次。
完整源代码:
public class AnonyInnerClassTest {
/**
* 匿名内部类
* 权兴权意-2016.11.08
*/
public static void main(String[] args) {
PersonAnonyInnerClass p = new StudentAnonyInnerClass();
PersonDemoAnonyInnerClass pd = new PersonDemoAnonyInnerClass();
pd.method(p);
//匿名内部类:继承类或者接口实现类的匿名对象
//栈内存没东西指向你,用完就是垃圾,可以马上被回收
//弊端:只能用1次
pd.method(new PersonAnonyInnerClass() {
@Override
public void study() {
System.out.println("day day up.");
}
});
}
}
interface PersonAnonyInnerClass{
public abstract void study();
}
class StudentAnonyInnerClass implements PersonAnonyInnerClass{
@Override
public void study() {
System.out.println("day day up.");
}
}
class PersonDemoAnonyInnerClass{
//接口名形参-需要接口的实现类的对象
public void method(PersonAnonyInnerClass p){
p.study();
}
}