内部类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() {

            @Override
            public 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 {
    @Override
    public 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() {
            @Override
            public 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表达式:编译之后没有单独的字节码文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/210951.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

重庆市失业金申领流程

1.领失业金的前提:非本人意愿中断就业。个人理解就是不是主动辞职才能领。 2.因此公司在处理社保减员的时候,不能是劳动者主动提出离职。 3.社保减员可选择原因:其他原因中断缴费 / 由单位提出双方协商一致解除劳动合同。 4.当社保暂停缴费…

A--Z与a--z的ASCII码的差异

从z到A还有一些字符 应该改为str[i]>A&&str[i]<Z||str[i]>a&&str[i]<z;

C++ string类—初始化、容量操作、迭代器

目录 前言 一、string类 二、初始化 1、无参或带参 2、用字符串变量初始化 3、用字符串初始化 4、指定数量字符 三、容量操作 1、size 2、push_back 3、append​编辑 4、运算符 5、reserve 6、resize 四、迭代器 五、OJ练习 反转字符 找出字符串中出现一次的…

Leetcode144. 二叉树的前序遍历-C语言

文章目录 题目介绍题目分析解题思路1.创建一个数组来储存二叉树节点的值2.根据二叉树的大小来开辟数组的大小3.边前序遍历边向创建的数组中存入二叉树节点的值 完整代码 题目介绍 题目分析 题目要求我们输出二叉树按前序遍历排列的每个节点的值。 解题思路 1.创建一个数组来…

Android HCI日志分析案例1

案例1--蓝牙扫描设备过程分析 应用层发起搜索蓝牙设备&#xff0c;Android 官方提供的蓝牙扫描方式有三种&#xff0c;分别如下&#xff1a; BluetoothAdapter.startDiscovery(); //可以扫描经典蓝牙和BLE两种。BluetoothAdapter.startLeScan();//扫描低功耗蓝牙&#xff0c;…

为XiunoBBS4.0开启redis缓存且支持密码验证

修改模块文件1 xiunoPHP/cache_redis.class.php: <?phpclass cache_redis {public $conf array();public $link NULL;public $cachepre ;public $errno 0;public $errstr ;public function __construct($conf array()) {if(!extension_loaded(Redis)) {return $thi…

2023-2024-1-高级语言程序设计-字符数组

7-1 凯撒密码 为了防止信息被别人轻易窃取&#xff0c;需要把电码明文通过加密方式变换成为密文。输入一个以回车符为结束标志的字符串&#xff08;少于80个字符&#xff09;&#xff0c;再输入一个整数offset&#xff0c;用凯撒密码将其加密后输出。恺撒密码是一种简单的替换…

【spring(六)】WebSocket网络传输协议

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 核心概要&#xff1a; 概念介绍&#xff1a; 对比HTTP协议&#xff1a;⭐ WebSocket入门案例&#xff1a;⭐ 核心概要&#xff1a; websocket对比http 概念介绍&#xff1a; WebSocket是Web服务器的一个组件…

力扣.特定深度节点链表(java BFS解法)

Problem: 面试题 04.03. 特定深度节点链表 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 根据题意需要取出二叉树每一层节点组成的链表并将其添加到一个数组中。我们将该要求分解成如下的操作&#xff1a; 1.利用BFS获取二叉树每一层的节点 2.利用链表的尾插法将二…

04.PostgreSQL是如何实现隔离级别的?

PostgreSQL是如何实现隔离级别的&#xff1f; 事务有哪些特性&#xff1f; 事务看起来感觉简单&#xff0c;但是要实现事务必须要遵守 4 个特性&#xff0c;分别如下&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;一个事务中的所有操作&#xff0c;要么…

YOLOv8界面-目标检测+语义分割+追踪+姿态识别(姿态估计)+界面DeepSort/ByteTrack-PyQt-GUI

YOLOv8-DeepSort/ByteTrack-PyQt-GUI&#xff1a;全面解决方案&#xff0c;涵盖目标检测、跟踪和人体姿态估计 YOLOv8-DeepSort/ByteTrack-PyQt-GUI是一个多功能图形用户界面&#xff0c;旨在充分发挥YOLOv8在目标检测/跟踪和人体姿态估计/跟踪方面的能力&#xff0c;与图像、…

具有标记和笔记功能的文件管理器TagSpaces(续)

熟悉老苏的读者都知道&#xff0c;老苏通常只是推荐软件&#xff0c;并简单介绍如何运行它们&#xff0c;而具体的功能则需要读者自行研究。这种方式让老苏能够在工作之余&#xff0c;还能保持每周发布 4 篇的更新。 然而&#xff0c;这种方式也存在明显的缺点。由于老苏没有深…

【面试经典 150 | 二分查找】搜索插入位置

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;二分查找闭区间左闭右开区间开区间总结 知识总结写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c…

使用Pytorch从零开始实现BERT

生成式建模知识回顾: [1] 生成式建模概述 [2] Transformer I&#xff0c;Transformer II [3] 变分自编码器 [4] 生成对抗网络&#xff0c;高级生成对抗网络 I&#xff0c;高级生成对抗网络 II [5] 自回归模型 [6] 归一化流模型 [7] 基于能量的模型 [8] 扩散模型 I, 扩散模型 II…

一篇带你走进线性表之顺序表(C语言阐述)——逐行解释代码

目录哇 1. 引言- 顺序表在数据结构中的地位和作用- 概述本文将讨论的内容和结构 2. 顺序表的基本概念- 定义&#xff1a;什么是顺序表&#xff1f;- 结构&#xff1a;顺序表的内部结构和特点 3. 实现一个基本的顺序表***需要用到的头文件******定义顺序表的基本结构和属性*****…

Windows11系统下MemoryCompression导致内存占用率过高

. # &#x1f4d1;前言 本文主要是win11系统下CPU占用率过高如何下降的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日…

计算机毕业设计|基于SpringBoot+MyBatis框架健身房管理系统的设计与实现

计算机毕业设计|基于SpringBootMyBatis框架的健身房管理系统的设计与实现 摘 要:本文基于Spring Boot和MyBatis框架&#xff0c;设计并实现了一款综合功能强大的健身房管理系统。该系统涵盖了会员卡查询、会员管理、员工管理、器材管理以及课程管理等核心功能&#xff0c;并且…

【vue-router】useRoute 和 useRouter 的区别

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

Python模块与Linux stat 命令:双剑合璧的文件系统探索

简介&#xff1a;在Linux和Unix-like系统中&#xff0c;stat命令用于获取文件或目录的详细属性信息&#xff0c;包括但不限于大小、所有权、权限和时间戳。同样&#xff0c;在Python编程中&#xff0c;我们也有多个模块&#xff08;例如os、pathlib等&#xff09;提供了与stat类…

力扣题:字符串的反转-11.24

力扣题-11.24 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;151. 翻转字符串里的单词 解题思想&#xff1a;保存字符串中的单词即可 class Solution(object):def reverseWords(self, s):""":type s: str:rtype: str"&quo…