Java中匿名内部类以及Lambda的表达式简化

目录

一、匿名内部类

二、Lambda表达式


一、匿名内部类

当方法的形参为接口类型,我们传入的应该是该接口的实现类对象

为了调用useInter(参数是接口)这个方法,一般步骤(不用匿名内部类):

编写一个类实现接口

重写show方法

创建实现类对象传入方法里

如下方代码:

//测试
package csdn;

public class test1 {
   public static void main(String[] args) {
       //形参是接口类型,接口无法实例化,传入该接口的实现类对象
       useInter(new am());//am是实现Inter接口的类
   }
   public static void useInter(Inter a){
       a.show();
   }
}
package csdn;

public interface Inter {
    void show();
}
package csdn;

public class am implements Inter {
    @Override
    public void show() {
        System.out.println("我热爱学习!!!");
    }
}

使用匿名内部类

 接口中的方法不多时,可以使得代码更加简洁,在定义类的时候对其进行实例化

格式:

new 类名\接口名(){

}

new 类名(){}:代表继承这个类

new 接口名(){}:代表实现这个接口

//测试
package csdn;

public class test1 {
   public static void main(String[] args) {
       //形参是接口类型,接口无法实例化,传入该接口的实现类对象
       useInter(new Inter() {
           @Override
           public void show() {
               System.out.println("匿名内部类,重写的show方法");
           }
       });
   }
   public static void useInter(Inter a){
       a.show();
   }
}

二、Lambda表达式

Lambda表达式的简化格式:

()->{}

(函数内部类被重写方法的形参列表)->{

被重写方法的方法体代码

}

其中->是语法形式,没有实际含义

Lambda表达式,只允许操作函数式编程接口(有且仅有一个抽象方法的接口)

代码如下(示例):

//测试
package csdn;

public class test1 {
   public static void main(String[] args) {
       //形参是接口类型,接口无法实例化,传入该接口的实现类对象
       useInter(new Inter() {
           @Override
           public void show() {
               System.out.println("匿名内部类,重写的show方法");
           }
       });
      System.out.println("------------------------------------");
       //用lambda表达式简化匿名内部类
       useInter(() -> System.out.println("匿名内部类,重写的show方法"));
   }
   public static void useInter(Inter a){
       a.show();
   }
}

 可以用@FunctionalInterface校验是不是函数式接口

package csdn;
@FunctionalInterface//是函数式接口,不会报错
public interface Inter {
    void show();
}
package csdn;
@FunctionalInterface//会报错
public interface Inter {
    void show();
    void show1();
}
package dome2;

public class test {
    public static void main(String[] args) {
        A dog1 = new dog();
        dog1.feed();
        System.out.println("-------------------");
        A dog2 = new A() {
            //A dog2=new A;   是错误的,因为接口不能实例化
            public void feed () {
                System.out.println("小狗喜欢吃骨头!!");
            }
        };
        dog2.feed();
        System.out.println("--------------------");
        A dog3=()->System.out.println("小狗超级喜欢吃骨头!!");
        dog3.feed();
        //将函数作为一个方法的参数
        System.out.println("---------------------");
    }
}

                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值