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