J a v a 匿 名 内 部 类 \huge{Java匿名内部类} Java匿名内部类
通俗一点来讲匿名内部类就是没有名字的局部内部类。
注意这里的两点:
方便创建子类的对象,最终的目的是简化代码的编写。
具体方便再哪里呢?
比方说有一个方法进行调用的时候需要传入一个对象作为参数,这个时候就需要首先写一个类,然后创建一个对象,之后再把对象传进去一共三步。非常麻烦,但是匿名内部类就支持直接将这个类创建在参数中,并且这个类创建了之后直接生成一个对象,就相当于传入了一个对象,省去了大量的繁琐步骤。
Employee a = new Emloyee(){
//匿名内部类的类的结构体
public void work(){
}
}
这两个特征非常的重要:
new
的那个类型的子类类型。public class Test {
public static void main(String[] args) {
Animal a = new Animal(){
//匿名内部类定义
@Override
public void run() {
System.out.println("老虎跑的块~~~");
}
};
a.run();
}
}
//抽象类
abstract class Animal{
public abstract void run();
}
上面代码借助下面的抽象类Animal
进行定义匿名内部类,这行代码:
Animal a = new Animal(){
右边写的是Animal
类,但是实际上a
真正的类型就是Animal
类吗?
一定不是!
因为Animal
是抽象类,一定不可以产生对象!!!!
❗❗❗所以匿名内部类所产生的对象,一定不是new
的类型的对象,但是这个类又可以直接赋值给new
类型的对象(左边),这个对象只能是new
类型的子类对象!
匿名内部类就是作为一个对象,直接传输给方法的。
示例:
//实现原理
//有一个游泳接口,还有一个Swimming方法,需要让老师、学生、运动员去使用Swimming方法进行游泳
//但是不想创建一个学生对象、一个老师对象、一个运动员对象之后在分别进行调用,实在是麻烦
//直接使用匿名内部类,在创建对象的时候直接创建不同的匿名内部类,然后分别重写swim方法即可
public class Test2 {
public static void main(String[] args) {
//学生的匿名内部类
Swimming s = new Swimming() {
@Override
public void swim() {
System.out.println("学生快乐的自由泳");
}
};
go(s);
System.out.println("--------------");
//老师的匿名内部类
Swimming s1 = new Swimming() {
@Override
public void swim() {
System.out.println("老师泳的贼快~~~~~");
}
};
go(s1);
System.out.println("--------------");
//运动员的匿名内部类
go(new Swimming() {
@Override
public void swim() {
System.out.println("运动员的贼快啊~~~~~");
}
});
}
/**
学生 老师 运动员可以一起参加游泳比赛
*/
public static void go(Swimming s){
System.out.println("开始。。。");
s.swim();
System.out.println("结束。。。");
}
}
//定义一个游泳接口,所有实现了该接口的人都要会游泳!
interface Swimming{
void swim();
}
从上面的代码可以看出来,匿名内部类创建出来大多是就是为了当前的立刻使用能比较方便。
匿名内部类,没有名字,基本就是创建出来为了当调用方法的参数,创建出来的类属于new
类型对应的子类,并且匿名内部类定义之后就会产生一个相应类型的对象,匿名内部类的使用目的就是简化代码。