匿名内部类

匿名内部类适合创建那种只需要一次使用的类,匿名内部类的语法有点奇怪,创建匿名内部类时会立即创建一个该的实例,这个定义立刻消失,匿名内部类不能重复使用(一次性的)

  • 定义匿名内部类的格式如下:
new 实现接口()  | 父类构造器(实参列表){//匿名内部类的类体部分}
  • 匿名内部类必须继承一个父类,或实现一个接口,但最多只能继承一个父类,或实现一个接口
  • 匿名内部类有如下规则:
  1. 匿名内部类不能是抽象类,因为系统在创建匿名内部类时,会立即创建匿名内部类的对象。因此不允许将匿名内部类定义成抽象类。

  2. 匿名内部类不能定义构造器。由于匿名内部类没有类名,所以无法定义构造器,但匿名内部类可以定义初始化块,可以通过实例初始化块来完成构造器需要完成的事情。

  3. 通过实现接口来创建匿名内部类时,匿名内部类也不能显示创建构造器,因此匿名内部类只有一个隐式的无参构造器,故 new 接口名后的括号里不能传入参数值。(无参构造)

  4. 通过继承父类来创建匿名内部类时,匿名内部类将拥有和父类相似的构造器,此处的相似指拥有相同的形参列表。

  5. 创建匿名内部类时,必须实现接口或抽象父类里的所有抽象方法。

下面对应解释说明:

  1. 因为抽象类有构造器但不能直接实例化(因为有抽象方法);上列已经得知创建内部类时会立即创建内部类对象。抽象类是不能实例的,只能作为父类被继承,由子类实现抽象类里的抽象方法。

  2. 匿名内部类不能定义构造器,这个好理解,因为构造器就是一个没有返回值,方法名和类一样的构造方法而已,类都是匿名的你怎么定义构造器呢?

  3. 实现接口创建匿名内部类时,匿名内部类不能显示创建构造器;我们先回顾下接口,接口里不能包含构造器和初始化块因为 接口里成员变量只能是静态常量,接口里的方法只能是抽象方法、类方法、默认方法

  4. 继承父类来创建匿名内部类,匿名内部类将拥有和父类相似的构造器,这个没什么解释,知道就可以它的规则就是这样。

  5. 匿名内部类也是类,也需要遵守继承类/抽象类 或 实现接口的规则。

  • 最后我们来分析一下这个 定义匿名内部类的格式:
new 实现接口()  | 父类构造器(实参列表){//匿名内部类的类体部分}
  1. 通过实现接口来创建匿名内部类
    new 实现接口 (){ } 会得到一个实现此接口的类的实例/对象
    例如 :new A() { } 会得到一个实现了A接口的类的实例
    (A此例中代表接口)

  2. 通过继承父类来创建匿名内部类
    new 父类构造器(实参列表){ } 会得到一个继承了该类的子类实例 / 对象
    例如 :new B() { } 会得到一个继承了B类的子类实例
    (B此例中代表父类)

Lambda表达式

这是Java 8 的重要更新,Lambda表达式支持将代码块作为方法参数,Lambda 表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例。

  • Lambda表达式可以简化匿名内部类对象,不需要new Xxx(){}这种繁琐的代码,不需要指出重写的方法名字,也不需要给出重写的方法的返回值类型-----只要给出重写的方法括号以及括号里的形参列表即可。

  • 使用Lambda表达式代替匿名内部类创建对象时,Lambda表达式的代码块会代替实现抽象方法的方法体,Lambda表达式就相当一个匿名方法。

  • Lambda由3部分组成

  1. 形参列表。允许省略形参类型,如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略。
  2. 箭头(->)
  3. 代码块。如果代码块只包含一条语句,Lambda表达式允许省略代码块的花括号,那么这条语句就不要用花括号表示语句结束。Lambda代码块只有一条return语句,甚至可以省略return关键字,Lambda表达式需要返回值,而他的代码块中仅有一条省略了return的语句,Lambda表达式会自动返回这条语句的值。
说了这么多,先来个实例吧!
interface It{    //函数式接口(只有一个抽象方法)void hi(String s);   //此接口只有个抽象方法hi(String s)
}
  • 使用Lambda表达式创建一个 It 对象(实际类型是lt接口实现类的实例,自动向上转型了)
 It  t = s->System.out.println(s);t.hi("大家好!");//输出 大家好!
  • 上列利用了lambda表达式实现了如上匿名内部类一样的效果,
  • 最后说明下:,同样的 Lambda 表达式的目标类型完全可能是变化的 -----唯一的要求是,Lambda 表达式实现的匿名方法与目标类型 (函数式接口)中唯一的抽象方法有相同的形参列表

最后介绍下方法引用与构造器引用

  • 如果 Lambda 表达式的代码块只有一条代码,程序就可以省略 Lambda 表达式中代码的花括号{}.不仅如此,如果 Lambda 表达式的代码块只有一条代码,还可以在代码块中使用方法引用和构造器引用。

  • 方法引用和构造器引用可以让 Lambda 表达式的代码更简洁。方法引用和构造器引用都需要使用 两个英文冒号。Lambda 表达式支持如下表几种引用方式。

种类 示例 对应的 Lambda表达式
引用类方法 类名::类方法 (a,b…)->类名.类方法(a,b…)
引用特定对象的实例方法 特定对象::实例方法 (a,b…)->特定对象.实例方法(a,b…)
引用某类对象的实例方法 类名::实例方法 (a,b…)->a.实例方法(b…)
引用构造器 类名::new (a,b…)->类名(a,b…)
  • 对应的说明参考下列:
  1. 函数式接口中被实现的全部参数传给该类方法作为参数
  2. 函数式接口中被实现的全部参数传给该类方法作为参数
  3. 函数式接口中被实现方法的第一个参数作为调用者,后面的参数全部传给该方法作为参数
  4. 函数式接口中被实现的全部参数传给该类方法作为参数
  • 赶着写作业了,就借助上面例子来个示例:
interface It{    //函数式接口(只有一个抽象方法)void hi(String s);   //此接口只有个抽象方法hi(String s)
}
  • 使用Lambda表达式创建一个 It 对象(实际类型是lt接口实现类的实例,自动向上转型了)
 It  t = s->System.out.println(s);t.hi("大家好!");//输出 大家好!
  • 引用特定对象的实例方法
 It  t = System.out::println;t.hi("大家好!");//输出 大家好!

先溜了,如有哪里需要补充请留言,多实践!

Lambda表达式与匿名内部类相关推荐

  1. 1.24 Lambda表达式与匿名内部类的联系和区别

    Java Lambda 表达式的一个重要用法是简化某些匿名内部类的写法,因此它可以部分取代匿名内部类的作用. Lambda 表达式与匿名内部类的相同点如下: Lambda 表达式与匿名内部类一样,都可 ...

  2. Lambda01 编程范式、lambda表达式与匿名内部类、函数式接口、lambda表达式的写法...

    1 编程范式 主要的编程范式有三种:命令式编程,声明式编程和函数式编程. 1.1 命令式编程 关注计算机执行的步骤,就是告诉计算机先做什么后做什么 1.2 声明式编程 表达程序的执行逻辑,就是告诉计算 ...

  3. 关于JDK lambda表达式与匿名内部类的等价实现却出现了截然不同的结果原因分析

    发现了一个很奇怪的现象,先上代码: public interface A {int f();default A cf(A other){return new A(){@Overridepublic i ...

  4. Lambda表达式和匿名内部类的区别【理解】

    所需类型不同 匿名内部类:可以是接口,也可以是抽象类,还可以是具体类 Lambda表达式:只能是接口 使用限制不同 如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类 如 ...

  5. [Java基础]Lambda表达式和匿名内部类的区别

  6. 匿名内部类与Lambda表达式

    匿名内部类与Lambda表达式 一.匿名内部类 谁没有名字:匿名内部类指的是接口的实现类 或者 抽象类的子类没有名字. 1.前提: 1)必须要有一个接口.抽象类(普通类也可以,但是方法不会强制重写,不 ...

  7. Lambda 表达式详解~简化匿名内部类

    本节将介绍如何使用Lambda表达式简化匿名内部类的书写,但Lambda表达式并不能取代所有的匿名内部类,只能用来取代函数接口(Functional Interface)的简写.先别在乎细节,看几个例 ...

  8. 工具技巧和读文档 | 读函数式编程接口文档 | 匿名内部类 | lambda表达式 |IDEA

    Function接口,函数式接口 按入参返回值分类,大概分为4种类型,再加上多个入参就又多了Bi开头的两种. 有Ctrl+P的时候不懂参数列表该写啥,就先Ctrl+ALT看下入参类型的相关实现类! 一 ...

  9. jdk8新特性 lambda表达式详解

    本文主要讲到的内容有: 一- 前言 二- 背景 三- lambda表达式的语法 四- Lambda程序例子 4-1 Runnable Lambda 4-2 Comparator Lambda 4-3 ...

最新文章

  1. POJ 1678 I Love this Game!
  2. python自学网站有哪些-分享干货:三个新手自学Python的网站!
  3. 中国石材胶市场需求现状调研与前景预测分析报告2022版
  4. 行业研究报告基本分析思路
  5. Ucenter会员同步通讯登录原理(转)
  6. python os.walk
  7. hdu 2111 Saving HDU (DP)
  8. 嵌入式OS入门笔记-以RTX为案例:三.初探进程
  9. VMware NAT模式设置静态IP(可上网)
  10. listview拖动优化问题
  11. python 读取并显示图片,用plt 同时显示多幅图像
  12. R语言中最强的神经网络包RSNNS
  13. jquery多字段筛选,极简方法
  14. 遭遇爆炸式匿名*** 瑞星称有人下黑手
  15. VC++ 窗口拆分CSplitterWnd
  16. 利用STM32F103精确控制步进电机
  17. Xcelsius 2008和Crystal Xcelsius Professional 4.5截图对比
  18. 花生壳 linux客户端 命令
  19. Snort - manual 笔记(二)
  20. 拦截器、过滤器、监听器

热门文章

  1. Python 超简单3行代码提取音乐高潮(附批量提取)!
  2. 红包还能这么玩?60行代码教你模拟群发手气红包
  3. matlab图像处理(笔记)
  4. matlab 图中的legend,matlab中legend加图示命令的使用
  5. 使用FFmpeg命令给视频文件添加软字幕并解决播放器播放没有出现字幕的问题
  6. 前端js实现上传图片大于2M时压缩,预览
  7. easyui load reload acceptChanges函数的区别
  8. 计算机考证大几考比较合适
  9. 建筑模拟2015服务器人数修改,建筑模拟2015
  10. 研一下学期第九周周记