发现了一个很奇怪的现象,先上代码:

public interface A {int f();default A cf(A other){return new A(){@Overridepublic int f() {int i = this.f();return i!=0? 1:other.f();}};}
}

然后进行测试:

public class B {public static void main(String[] args) {A a1 = new A() {@Overridepublic int f() {return 6;}};System.out.println(a1.f());A a2 = new A() {@Overridepublic int f() {return 0;}};a1.cf(a2).f();}
}

结果是栈溢出,因为a1.cf(a2).f();这句执行时导致A接口中的默认函数中的这句:int i = this.f();

出现了无限自己调用自己的递归

然后我把A接口进行修改,用lambda表达式代替:

public interface A {int f();default A cf(A other){return ()->{int i = f();return i!=0?1:other.f();};}
}

结果就会正常执行

这段lambda表达式和匿名内部类是等价的,却导致了不同的结果

区别之一:

匿名内部类使用无限定的this,这个this指的就是该匿名内部类对应的实例。

而lambda表达式使用无限定的this,这个this却是外部类的实例。

有限定的this即指定某个外部类的this,无限定就是没有指定是哪个外部类的this。

区别之二:

匿名内部类内调用与外部类有相同签名的方法是,实际调用的是该匿名内部类实例的方法。

而lambda调用与外部类有相同签名的方法是,实际调用的是外部类实例的方法。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. java 8 Lambda 表达式(副作用)

    [1]转自: https://www.cnblogs.com/linlinismine/p/9283532.html 早在2014年oracle发布了jdk 8,在里面增加了lambda模块.于是ja ...

最新文章

  1. 从 Java 到 Scala(二):object
  2. 介绍importlib
  3. JavaScript学习知识点归纳
  4. 自对齐(self-aligned)
  5. SCSS SASS Color 颜色函数用法
  6. css样式引入方式,及常用设置标签样式
  7. python调试和测试有什么区别和联系_软件测试和测试开发到底有什么区别跟联系?...
  8. C中的extern-static-const关键词
  9. 3-单一职责原则+4-开放封闭原则+5依赖倒转原则
  10. vc linux 中文版下载64位,VSCode 64位下载
  11. 从奥卡姆剃刀定律再看决策树
  12. 人到中年,程序猿的人生路~
  13. 小柯印前设计师(DrawVBA)及教程
  14. python 隐藏其他窗口_python控制窗口显示隐藏
  15. 软件工程大一学年简单的总结一下
  16. Spring AOP 学习总结
  17. 微信小程序canvas画价格走势图(六)
  18. 一个账号可登录多个微信
  19. js监听鼠标拖动事件(按住左键拖动触发,松开左键取消)
  20. Android自定义按钮样式

热门文章

  1. 计算机毕业设计-基于SSM的网上书店管理系统
  2. Software Testing - UI自动化测试设计规范
  3. Nginx 配置代理https
  4. 内蒙古中考计算机考试知识点总结,内蒙古包头中考语文备考分析及知识总结.doc...
  5. Ubuntu16.04成功解决InvalidSpecError: Invalid spec: =2.7!!!
  6. DELL PC服务器PowerEdge 管理工具OMSA的使用
  7. FULLTEXT 搜索
  8. 链表应用之多项式相加
  9. 日常英语:Job interview
  10. STM32F103—有关BH1750(GY-302)环境光强度传感器模块的代码