匿名内部类与Lambda表达式

匿名内部类本质上是一个没有名字的局部内部类,定义在方法中,代码块中等
作用:方便创建子类对象,最终目的为了简化代码编写。
匿名内部类是一个没有名字的内部类。
匿名内部类写出来就会产生一个匿名内部类的对象。
匿名内部类的对象类型相当于是当前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表达式_第1张图片
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表达式_第2张图片
Lambda表达式简化规则为:
如果只有一个参数,参数类型可省略,同时()也可以省略。
如果lambda表达式的方法体代码只有一行代码,可以省略大括号不写,同时要省略分号。
如果lambda表达式的方法体代码只有一行代码,可以省略大括号不写,同时要省略分号。此时,如果为return语句,必须省略return不写,同时也必须省略“;”不写。

你可能感兴趣的:(java)