很早就知道匿名内部类,但没去探究,后面也没用到,索性算个知识盲点,今天顺便研究下。匿名内部类,顾名思义,没有名字的内部类。
存在即合理,那匿名内部类的使用场景是什么呢,如果实现父类(或继承接口的)实现类只在业务中被调用一次,也即只使用一次,那么它的存在就是有点尴尬的,只为了一部分的要求而单独写个类这在工程上也不合理,那么此刻,为了解决这种尴尬,匿名内部类就被引入了。看个例子,加深理解吧。
使用匿名内部类之前:
//抽象父类
public abstract class Animal {
public abstract void eat();
}
//继承类
public class Dog extends Animal{
public void eat(){
System.out.println("eat food");
}
}
//继承类的使用
public class Demo {
public static void main(String[] args) {
Person p = new Child();
p.eat();
}
}
使用匿名内部类:
//抽象类
public abstract class Animal {
public abstract void eat();
}
//匿名内部类使用
public class Demo {
public static void main(String[] args) {
Animal p = new Animal() {
public void eat() {
System.out.println("eat food");
}
};
p.eat();
}
}
使用时需要注意几点:
1.必须继承一个抽象类或实现一个接口,并且仅只能继承一个抽象类或实现一个接口。
2. 匿名内部类不是抽象的,所以需要实现接口或抽象类所有的抽象方法。
3. 不存在静态成员变量、静态方法、构造函数。
那么不存在构造函数,匿名内部类怎么传参呢?外面的参数是可以直接传进来的,匿名内部类是可以读取的,但是匿名内部类里对参数的改变并不会影响外部参数的改变,所以为了参数一致性,编译器要求传参定义为final类型。举个例子吧,还是刚才的代码,修改一下,如下:
public class Demo {
public static void main(String[] args) {
Demo demo = new Demo();
demo.display("bone");
}
public void display(final String food){
final String something="water";
Animal p = new Animal() {
public void eat() {
System.out.println("dog eat "+food);
System.out.println("dog drink "+something);
}
};
p.eat();
}
}
如果有考虑不全之处,欢迎评论斧正,相互交流,共同进步!