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

Java10:内部类

  • 7 内部类(了解)
    • 7.1 成员内部类
    • 7.2 静态内部类
    • 7.3 局部内部类
    • 7.4 匿名内部类
  • 2.3. 静态内部类
  • 2.4. Lambda表达式,

7 内部类(了解)

内部类:就是在一个类的内部再定义一个类。

分类:
成员内部类
静态内部类
局部内部类
匿名内部类

7.1 成员内部类

package com.i.innerClass;
//inner Class 内部类
public class Outer {private int id= 10;/** 局部内部类:方法内部*/public void method(){class Inner2{public void in(){}}}/** 成员内部类:类内部*/public class Inner{//获取外部类私有属性public int getId() {System.out.println("内-部类");return id;}}
}
/** class内部类可以有多个,但是只能有一个是public修饰*/
class OuterClass{public static void main(String[] args) {}
}
package com;import com.i.innerClass.Outer;
public class Application {public static void main(String[] args) {Outer outer = new Outer();//要使用内部类,要通过这个外部类来实例化内部类Outer.Inner inner = outer.new Inner();//调用内部类方法int id = inner.getId();System.out.println(id);}
}

7.2 静态内部类

package com.i.innerClass;
//inner Class 内部类
public class Outer {private static int id= 10;/**成员内部类:类内部*/public static class Inner{//获取外部类私有属性public int getId() {System.out.println("内-部类");return id;}}
}

7.3 局部内部类

package com.i.innerClass;
//inner Class 内部类
public class Outer {/** 局部内部类:方法内部*/public void method(){class Inner2{public void in(){}}}
}

7.4 匿名内部类

package com.i.innerClass;public class Outer1 {public static void main(String[] args) {//没有名字初始化类,不用将实例保存到变量中new Apple().eat();/** 匿名内部类,(接口实现类)*/UserService userService= new UserService() {@Overridepublic void hello() {}};}
}class Apple{public void eat(){System.out.println("吃了一个苹果");}
}
// 接口
interface UserService{void hello();
}

  • 7 内部类(了解)
    • 7.1 成员内部类
    • 7.2 静态内部类
    • 7.3 局部内部类
    • 7.4 匿名内部类
  • 2.3. 静态内部类
  • 2.4. Lambda表达式,

2.3. 静态内部类

静态代理模式总结:

  • 1.真实对象和代理对象都要实现同一个接口;
  • 2.代理对象要代理真实角色

这样做的好处:

  • 1.代理对象可以做很多真实对象做不了的事情
  • 2.真实对象可以专注做自己喜欢的事情

举例:(Tom 结婚的案例)

  1. 定义一个 Marry的接口
//Marry 接口
interface Marry{void HappyMarry();
}
  1. 被代理对象
// 真实角色-Tom,Tom去结婚
class Tom implements Marry {@Overridepublic void HappyMarry() {System.out.println("Tom 结婚了了,他很开心");}
}
  1. 代理对象-婚庆公司
// 代理角色-婚庆公司。帮助 Tom结婚
class WeddingCompany implements Marry {//被代理对象,真实角色private Marry target;// 构造方法public WeddingCompany(Marry target) {this.target = target;}@Overridepublic void HappyMarry() {before();this.target.HappyMarry();//真实角色after();}private void after() {System.out.println("婚礼后,结尾款");}private void before() {System.out.println("婚礼前,准备婚礼现场");}
}
  1. 主方法
public class StaticProxy {public static void main(String[] args) {Tom tom = new Tom();//Tom 要结婚/*WeddingCompany weddingCompany = new WeddingCompany(you);weddingCompany.HappyMarry();*///用 lambda表达式对比new Thread(()-> System.out.println("I Love You")).start();new WeddingCompany(tom).HappyMarry();}
}

2.4. Lambda表达式,

Lambda表达式的实质是函数式编程
函数式接口的定义:

  • 任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口。比如 Runable接口:
public interface Runnable {public abstract void run();
}
  • 对于函数式接口,我们可以通过 lambda表达式来创建该接口的对象。
(params) -> expression [ 表达式 ](params) -> statement [ 单个语句 ](params) -> { statements }

为什么要使用 lambda表达式

  • 1.避免匿名内部类定义过多
  • 2.可以让代码看起来很简洁
  • 3.去掉了一些没有意义的代码,只保留核心逻辑

推导 Lambda表达式

  1. 普通方法

使用一个类去实现他的接口,重写它的方法
再 创建它的对象,调用它的方法

public class TestLambda9_1 {public static void main(String[] args) {MyAddress address = new MyHome();address.lambdaAddress();}
}
//1.定义一个函数式接口
interface MyAddress {void lambdaAddress();
}//2.实现类
class MyHome implements MyAddress {@Overridepublic void lambdaAddress() {System.out.println("我的老家 就是那个屯");}
}
  1. 使用 静态内部类 来简化

把实现类放到方法外面

public class TestLambda9_1 {//3.使用静态内部类代替static class MyHome2 implements MyAddress {@Overridepublic void lambdaAddress() {System.out.println("我的老家 就是那个屯 那个屯");}}public static void main(String[] args) {MyAddress address = new MyHome2();address.lambdaAddress();}
}
//1.定义一个函数式接口
interface MyAddress {void lambdaAddress();
}
  1. 使用 局部内部类 来代替

把实现类放到方法中,

public class TestLambda9_1 {public static void main(String[] args) {//4.局部内部类class MyHome3 implements MyAddress {@Overridepublic void lambdaAddress() {System.out.println("我的老家 就是那个屯 那个屯里 有土生土长的人");}}//局部内部类MyAddress address = new MyHome3();address.lambdaAddress();}
}
//1.定义一个函数式接口
interface MyAddress {void lambdaAddress();
}
  1. 使用 匿名内部类 来代替
public class TestLambda9_1 {public static void main(String[] args) {//5.匿名内部类,没有类的名称,必须借助接口或父类address = new MyAddress() {@Overridepublic void lambdaAddress() {System.out.println("匿名内部类");    }};address.lambdaAddress();}
}
//1.定义一个函数式接口
interface MyAddress {void lambdaAddress();
}
  1. 使用 Lambda表达式 来简化,(JDK1.8)

因为这个接口只有一个方法,所以可以进一步简化
简化后可以只关注于 业务的实现

public class TestLambda9_1 {public static void main(String[] args) {//6.用 lambda表达式简化address = ()-> {System.out.println("用 lambda表达式简化");};address.lambdaAddress();}
}
//1.定义一个函数式接口
interface MyAddress {void lambdaAddress();
}
  1. 最后再来一个示例
public class TestLambda9_2 {public static void main(String[] args) {ILove lo = null;/*4.局部内部类class Love implements ILove {@Overridepublic void loveYou(int year) {System.out.println("Tom, I Love you "+ year +" year");}}ILove lo = new Love();lo.loveYou(1);*//*5.匿名内部类lo = new ILove() {@Overridepublic void loveYou(int year) {System.out.println("Tom, I Love you "+ year +" year");}};lo.loveYou(2);*//*6.lambda表达式简化*/lo = (int year) -> {System.out.println("Tom, I Love you " + year + " year");};lo.loveYou(4);/*简化1:去掉参数类型。如果去掉参数类型,就全部去掉lo = (year) -> {System.out.println("Tom, I Love you " + year + " year");};lo.loveYou(8);*//*简化2:去掉括号。只有一个参数时,才可以使用lo = year -> {System.out.println("Tom, I Love you " + year + " year");};lo.loveYou(16);*//*简化2:去掉花括号。只有一行代码时,才可以使用lo = year -> System.out.println("Tom, I Love you " + year + " year");lo.loveYou(32);*//* 总结:*   1.前提:接口为函数式接口。*   2.lambda表达式,只有一行代码时,才可以简化成一行; 如果有多行,那么就用代码块包裹;*   3.多个参数也可以去掉参数类型,如果去掉参数类型,就全部去掉,并且必须加上括号;* */}
}interface ILove {void loveYou(int year);
}

相关文章:

Java10:内部类

7 内部类(了解)7.1 成员内部类7.2 静态内部类7.3 局部内部类7.4 匿名内部类 2.3. 静态内部类2.4. Lambda表达式, 7 内部类(了解) 内部类:就是在一个类的内部再定义一个类。 分类: 成员内部类 静…...

PostgreSQL 支持的字段类型

PostgreSQL 支持多种字段类型,以下是 PostgreSQL 13 版本中支持的所有字段类型: 数值类型: smallint:小整数类型。integer:整数类型。bigint:大整数类型。decimal:精确小数类型。numeric&#x…...

npm报错error:03000086:digital envelope routines::initialization error

可能是因为node版本过高,与现在的项目不符合 这是降低node版本的命令,然后重新运行 npm install npm8.1.2 -g...

el-table 展开行表格,展开的内容高度可以变化时,导致的固定列错位的问题

问题描述 一个可展开的表格(列设置了type“expand”),并且展开后的内容高度可以变化,会导致后面所有行的固定列错位,图如下,展示行中是一个树形表格,默认不展示子级,点击树形表格的…...

python插入排序

插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常使用in-place排序&#xff0…...

怎么将营业执照图片转为excel表格?(批量合并识别技巧)

一、为何要将营业执照转为excel表格? 1、方便管理:将营业执照转为excel格式,可以方便地进行管理和整理,快速查找需要的信息。 2、数据处理:Excel可以提供丰富的计算和数据分析功能,转化为excel后方便数据…...

关于java数组Arrays类

关于java数组Arrays类 前面的文章中,我们了解了数组创建方法等,我们本篇文章来了解一下数组的方法类Arrays,有了这个类,我们在日常写代码的时候就不不用自己去手动创建方法了😀。 Arrays类 数组的工具类java.util.A…...

LeetCode-58/709

1.最后一个单词的长度(58) 题目描述: 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 思路&…...

linux 流量监控

linux 流量监控 Linux 网络流量监控利器 iftop命令详解及实战 https://blog.csdn.net/qq_50247813/article/details/134164093 iftop命令详解 https://www.cnblogs.com/gaoyuechen/p/17300017.html 1 ubuntu如何查看流量监控 Ubuntu是一种非常流行的Linux发行版&#xff0c…...

AUTOSAR从入门到精通-漫谈autosar软件架构(八)

目录 前言 原理 AUTOSAR的方法论 AUTOSAR架构的优点 AUTOSAR 软件架构 1.应用层...

C#设计模式之单例模式

介绍 单例模式(Singleton)保证一个类仅有一个实例,并提供一个访问它的全局访问点。 单例模式的结构图如下所示: 使用单例模式的原因 对一些类来说,只有一个实例是很重要的。如何才能保证一个类只有一个实例并且这个…...

【源码预备】Calcite基础知识与概念:关系代数概念、查询优化、sql关键字执行顺序以及calcite基础概念

文章目录 一. 关系代数的基本知识二. 查询优化三. SQL语句的解析顺序1. FROM2. WHERE3. GROUP BY4. HAVING5. SELECT 四. Apache Calcite中的基本概念1. Adapter2. Calcite中的关系表达式2.1. 关系表达式例子2.2. 源码底层结构 3. Calcite的优化规则4. Calcite的Trait--算子物理…...

【Java 设计模式】23 种设计模式

文章目录 设计模式是什么计算机行业里的设计模式创建型模式(共 5 种)结构型模式(共 7 种)行为型模式(共 11 种) 总结 设计模式是什么 “每一个模式描述了一个在我们周围不断重复发生的问题,以及…...

ElasticSearch深度分页解决方案

一、前言 ElasticSearch是一个基于Lucene的搜索引擎,它支持复杂的全文搜索和实时数据分析。在实际应用中,我们经常需要对大量数据进行分页查询,但是传统的分页方式在处理大量数据时会遇到性能瓶颈。本文将介绍ElasticSearch分页工作原理、深…...

nginx下upstream模块详解

目录 一:介绍 二:特性介绍 一:介绍 Nginx的upstream模块用于定义后端服务器组,以及与这些服务器进行通信的方式。它是Nginx负载均衡功能的核心部分,允许将请求转发到多个后端服务器,并平衡负载。 在upst…...

基于ssm的双减后初小教育课外学习生活活动平台的设计与实现论文

双减后初小教育课外学习生活活动平台的设计与实现 摘 要 当下,正处于信息化的时代,许多行业顺应时代的变化,结合使用计算机技术向数字化、信息化建设迈进。以前学校对于课外学习活动信息的管理和控制,采用人工登记的方式保存相关…...

wblogic中间件配置数据源

配置数据源 1.服务-数据源-配置-新建 2.单机选一般数据源 3.选择源名称、jndi名称、数据库类型 4.选择驱动 5.下一步 6.输入连接串信息 参考&#xff1a; 格式二&#xff1a;jdbc:oracle:thin:<host>:<port>:<SID> 数据库名称配置的sid 7.测试配置&#xff…...

Java数据结构之装箱拆箱

装箱和拆箱 也叫装包拆包&#xff0c;装包是把那八种基本数据类型转换为它的包装类&#xff0c;拆包则相反 上面这俩种方式都是装包&#xff0c;下面是它的字节码文件 用到了Integer的ValueOf方法&#xff1a; 就是返回了一个Integer类的对象&#xff0c;把它的value属性设置成…...

各版本 操作系统 对 .NET Framework 与 .NET Core 支持

有两种类型的受支持版本&#xff1a;长期支持 (LTS) 版本和标准期限支持 (STS) 版本。 所有版本的质量都是一样的。 唯一的区别是支持的时间长短。 LTS 版本可获得为期三年的免费支持和补丁。 STS 版本可获得 18 个月的免费支持和修补程序。 有关详细信息&#xff0c;请参阅 .N…...

Golang 线程安全与 sync.Map

前言 线程安全通常是指在并发环境下&#xff0c;共享资源的访问被适当地管理&#xff0c;以防止竞争条件&#xff08;race conditions&#xff09;导致的数据不一致 Go语言中的线程安全可以通过多种方式实现 实现方式 互斥锁&#xff08;Mutexes&#xff09; Go的sync包提供…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...