当前位置: 首页 > news >正文

内部类Lambda

静态内部类

/*** 静态成员是在类加载成字节码时就已经存在的,静态只能访问静态*/
public class Demo {public static void main(String[] args) {Outer.Inner.show();}
}class Outer {int num1 = 10;static int num2 = 20;static class Inner {static void show() {Outer outer = new Outer();System.out.println(outer.num1);System.out.println("show...");System.out.println(num2);}}
}

局部内部类

/*** 放在方法/代码块/构造器等执行体中* 方法体内的类必须在方法被执行的情况下才能被创建*/
public class LocalInnerClass {public static void main(String[] args) {A a = new A();a.show();}
}class A {void show() {class B {void show() {System.out.println("show--inner");}}B b = new B();b.show();}
}

匿名内部类

/*** 匿名内部类:* overview: 匿名内部类本质上是一个特殊的局部内部类(定义在方法内部)* prerequisite:需要存在一个接口或类* syntax: new className\interfaceName(){}*          new className(){}:代表继承这个类*          new interfaceName(){}:代表实现这个接口*/
public class AnonymousInnerClass {public static void main(String[] args) {//方法的形参是接口类型应该传入接口的实现类对象useInter(new InterImpl());useInter(new Inter() {@Overridepublic void show() {System.out.println("实现了这个类");}});}/*** new Inter() {**             @Override*             public void show() {*                 System.out.println("实现了这个类");*             }*         }* 这一些在定义实现类的同时实例化了实现类:匿名内部类可以作为方法的实际参数进行传输* //但是实现类必须要重写接口中所有抽象方法,如果抽象方法多,会变得可读性差,不好维护*/static void useInter(Inter i) {//Inter i =new InterImpl();//多态特性//静态方法调用会成一个变量等待给它数据 Interface i=i.show();//编译会检查Inter中有没有show()方法(多态)}
}interface Inter {void show();//接口抽象方法
}class InterImpl implements Inter {@Overridepublic void show() {System.out.println("implements...show...");}
}

Lambda表达式简化匿名内部类

public class lambdaDemo1 {/** Lambda表达式:JDK8开始的一种新的语法形式** 作用:简化匿名内部类的代码写法* 格式: () -> {}* ():匿名内部类被重写方法的形参列表* {}:被重写方法的方法体代码* ->是语法形式,无实际含义* */public static void main(String[] args) {useInter(()->{System.out.println("Lambda表达式重写的抽象方法");});}static void useInter(Inter i) {i.show();}
}interface Inter {void show();
}

反例:

public class LambdaDemo2 {public static void main(String[] args) {useInter(()-{});//编译错误//Lambda表达式只允许操作函数式编程接口:有且仅有一个抽象方法的接口}static void useInter(Inter1 i) {i.show1();}
}interface Inter1 {void show1();void show2();
}

注解@FunctionalInterface可以帮我们判断是不是函数式接口

image-20231202210814617

image-20231202210828252

Lambda省略规则

  • 参数类型可以省略不写
  • 如果只有一个参数,()也可以省略不写
  • 如果Lambda表达式的方法体代码只有一行代码

​ 可以省略大括号不写,同时必须省略分号

​ 此时如果这行代码是return语句,还必须省略return

public class LambdaDemo2 {public static void main(String[] args) {useCal(new Calculator() {@Overridepublic int calc(int a, int b) {return a+b;}});System.out.println("----------------");useCal((int a,int b)->{return a-b;});System.out.println("省略写法");useCal((a,b)-> a+b);}static void useCal(Calculator c) {int calc = c.calc(10, 20);System.out.println(calc);}
}interface Calculator {int calc(int a, int b);
}

Lambda表达式和匿名内部类的区别

使用限制不同

  • 匿名内部类:可以操作类,接口
  • Lambda表达式:只能操作函数式接口

实现原理不同

  • 匿名内部类:编译之后,产生一个单独的.class字节码文件
  • Lambda表达式:编译之后没有单独的字节码文件
http://www.lryc.cn/news/250860.html

相关文章:

  • 设一棵二叉树中各结点的值互不相同,其先序遍历序列和中序遍历序列分别存于两个一维数组A[1...n]和 Bfl...n]中,试编写算法建立该二叉树的二叉链表。
  • 什么是Daily Scrum?
  • 逆波兰表达式求值[中等]
  • Oracle连接和使用
  • redis单线程为什么这么快
  • 工业机器视觉megauging(向光有光)使用说明书(五,轻量级的visionpro)
  • 【LittleXi】2023年广东工业大学腾讯杯新生程序设计竞赛
  • 【C语言:数据在内存中的存储】
  • 每日一练:阿姆斯特朗数
  • fatal: remote error: upload-pack: not our ref (未解决问题)
  • Python 3 使用 read()、readline()、readlines() 函数 读取文件
  • 勒索解密后oracle无法启动故障处理----惜分飞
  • Leetcode144. 二叉树的前序遍历-C语言
  • dmesg命令在软件测试中的实际应用
  • 【渗透】记录阿里云CentOS一次ddos攻击
  • 前端面试提问(3)
  • fl studio21.2最新汉化中文完整版网盘下载
  • 差分数组相关知识点以及刷题
  • 使用 DMA 在 FPGA 中的 HDL 和嵌入式 C 之间传输数据
  • uniapp地图基本使用及解决添加markers不生效问题?
  • 使用系统ProgressBar实现三色进度条
  • Vue3中的组合式API的详细教程和介绍
  • Java后端开发——JDBC(万字详解)
  • python etree.HTML 以及xpath 解析网页的工具
  • 电机伺服驱动学习笔记(7)待编辑
  • 【云备份】业务处理
  • JVM GC算法
  • 对Spring框架的一些总结
  • C# WPF上位机开发(第一个应用)
  • 有点迷糊class和初始化参数的用法了