匿名内部类
1.概述
匿名内部类:
格式:
new 类|抽象类名|接口名(){
重写方法;
};
Employee a = new Employee(){
public void work(){
System.out.println("好好工作");
}
}
a.work();
需求:
- 不采用匿名内部类
代码演示
public class Test {
public static void main(String[] args) {
Animal a = new Tiger(); //使用多态形式 惯用写法
a.run(); //编译看左边 运行看右边
}
}
//定义一个实现类 也就是子类 这是采用常规做法
class Tiger implements Animal{
@Override
public void run() {
System.out.println("开始");
System.out.println("老虎跑的很快");
System.out.println("结束");
}
}
interface Animal{
public void run();
}
说明
上述代码中,我们没有采用匿名内部类,首先声明一个动物的接口,里面有run方法,然后接着定义了一个Tiger实现类去实现Animal接口,重写run方法,然后在主方法中调用并执行。
- 采用匿名内部类
代码演示
public class Test {
public static void main(String[] args) {
Animal a = new Animal(){
@Override
public void run() {
System.out.println("开始");
System.out.println("老虎跑的很快");
System.out.println("结束");
}
}; //使用多态形式 惯用写法
a.run(); //编译看左边 运行看右边
}
}
interface Animal{
public void run();
}
说明
还是上面的代码,这里我们不用再定义一个子类去实现Animal接口,而是直接采用匿名内部类的形式,这里的 new Animal(){}
整体就是一个匿名内部类,因为有new关键字,所以实际上这里产生了匿名内部类的一个对象,该对象的类型相当于是当前new的那个类型的子类类型。
其实,上面的代码还可以写成这样:
public class Test {
public static void main(String[] args) {
Animal s = new Animal() {
@Override
public void run() {
System.out.println("老虎跑的很快");
}
};
go(s);
}
System.out.println("-----------------");
public static void go(Animal a){
System.out.println("开始跑步");
a.run();
System.out.println("结束跑步");
}
}
interface Animal{
public void run();
}
//新来一个对象狮子的时候 直接采用下面这个语句 更加简洁
go(new Animal() {
@Override
public void run() {
System.out.println("狮子跑的也很快");
}
});
代码执行流程:
首先,new Animal() {} 相当于是创建了一个对象,把这个对象的地址交给s,后面调用类中的静态方法go,进到go方法里边,在go里面调用重写的run方法,这里用到了一个机制,叫做 对象回调机制