匿名内部类
最后那个分号不要忘掉,不然就错了。
- 8的例子
基于接口的匿名内部类的例子:
实际上,底层就是用一个匿名内部类去实现了接口。然后对该类实例化了一个对象,并将这个对象赋给了tiger引用。
即== IA tiger = new Outer$01()==;
//基于接口的匿名内部类
//老韩解读
//1.需求: 想使用IA接口,并创建对象
//2.传统方式,是写一个类,实现该接口,并创建对象
//3.老韩需求是 Tiger/Dog 类只是使用一次,后面再不使用
//4. 可以使用匿名内部类来简化开发
//5. tiger的编译类型 ? IA
//6. tiger的运行类型 ? 就是匿名内部类 Outer04$1
/*
我们看底层 会分配 类名 Outer04$1
class Outer04$1 implements IA {
@Override
public void cry() {
System.out.println("老虎叫唤...");
}
}
*/
//7. jdk底层在创建匿名内部类 Outer04$1,立即马上就创建了 Outer04$1实例,并且把地址
// 返回给 tiger
//8. 匿名内部类使用一次,就不能再使用
IA tiger = new IA() {
@Override
public void cry() {
System.out.println("老虎叫唤...");
}
};
基于类的匿名内部类的例子:
此时的运行类型为Outer$02。
实际上,此时的底层就是用另外一个类去继承了father类。然后对该类实例化了一个对象,并将这个对象赋给了father引用。
即Father father = new Outer$02
没有大括号的时候,此时的运行类型为Father,就和平时的实例化一个对象是一样的意思。
基于抽象类的匿名内部类,方法必须要给他进行重写实现
匿名内部类的直接使用,不再赋值给某个引用
- 例子
最佳实践
public class InnerClass{
public static void main(String[] args) {
Cellphone cellphone = new Cellphone();
cellphone.alarmclock(new Bell() {
@Override
public void ring() {
System.out.println("懒猪起床了");
}
});
cellphone.alarmclock(new Bell() {
@Override
public void ring() {
System.out.println("小伙伴上课了");
}
});
}
}
interface Bell{
public void ring();
}
class Cellphone{
public void alarmclock(Bell bell){
bell.ring();
}
}