匿名内部类本质上是一个没有名字的局部内部类,定义在方法中,代码块中等
作用:方便创建子类对象,最终目的为了简化代码编写。
匿名内部类是一个没有名字的内部类。
匿名内部类写出来就会产生一个匿名内部类的对象。
匿名内部类的对象类型相当于是当前new的那个类型的子类类型
public class Test {
public static void main(String[] args) {
//Animal a1=new Animal();这样会报错,因为抽象类是不能创造对象的。
//但抽象类可以通过匿名内部类直接重写方法达到某个目的,不必再创建子类对象。
Animal s=new Animal() {
@Override
public void run() {
System.out.println("老虎跑得快");
}
};
s.run();
//下面的过程是通过普通的方式进行的调用,需要先创建子类对象重写方法,然后再进行调用。
Animal a=new Tiger();
a.run();
}
}
class Tiger extends Animal{
@Override
public void run() {
System.out.println("老虎跑得快");
}
}
abstract class Animal{
public abstract void run();
}
下面通过一个案例进行简单练习:
public class Test2 {
public static void main(String[] args) {
//正常调用
Swimming s=new Student();
qo(s);
//使用匿名内部类调用
Swimming s1=new Swimming() {
@Override
public void swim() {
System.out.println("老师游得快");
}
};
qo(s1);
System.out.println("---------");
//因为是整个匿名内部类当作一个对象赋给s1,s1再进行对象回调
//所以可以直接将匿名内部类给qo方法。
qo(new Swimming() {
@Override
public void swim() {
System.out.println("运动元更快");
}
});
}
//学生,老师,运动员一起参加游泳比赛
public static void qo(Swimming s){
System.out.println("开始");
s.swim();
System.out.println("结束");
}
}
class Student implements Swimming{
@Override
public void swim() {
System.out.println("学生自由泳");
}
}
interface Swimming{
void swim();
}
运行后结果为:
Lambda表达式:
作用:简化匿名内部类的代码写法。
lanbda只能简化接口中只有一个抽象方法的匿名内部类形式。
函数式接口:及接口内部只有一个匿名内部类。
public class Test1 {
public static void main(String[] args) {
//简化前:
Animal b=new Animal() {
@Override
public void run() {
System.out.println("不爱跑步");
}
};
b.run();
//简化后:
Animal a = () -> System.out.println("爱跑步");
a.run();
}
}
interface Animal{
void run();
}
运行后结果为:
Lambda表达式简化规则为:
如果只有一个参数,参数类型可省略,同时()也可以省略。
如果lambda表达式的方法体代码只有一行代码,可以省略大括号不写,同时要省略分号。
如果lambda表达式的方法体代码只有一行代码,可以省略大括号不写,同时要省略分号。此时,如果为return语句,必须省略return不写,同时也必须省略“;”不写。