【java11】java11新特性之嵌套类

Java 11在嵌套类方面主要关注的是通过JEP 181来改进访问控制,解决之前版本中存在的权限不一致问题。

下面先来看下嵌套类的使用:

静态嵌套类(Static Nested Class)

  • 定义:静态嵌套类(也称为静态内部类)是定义在另一个类中的类,并且使用static关键字修饰。
  • 访问权限:静态嵌套类只能访问外部类的静态成员(静态变量、静态方法和静态嵌套类),不能访问外部类的非静态成员。
  • 实例化:静态嵌套类不需要外部类对象即可实例化,可以直接通过类名来创建实例。
  • 用途:静态嵌套类通常用于组织工具类、辅助类等与外部类紧密相关的类,但不依赖于外部类的非静态状态。

静态嵌套类使用static关键字修饰,可以独立于外部类实例使用。由于它是静态的,因此不能直接访问外部类的非静态成员。

package com.morris.java11;/*** 静态嵌套类(Static Nested Class)的使用*/
public class StaticNestedClassDemo {// 静态嵌套类public static class StaticNestedClass {public void display() {System.out.println("Inside static nested class");}}public static void main(String[] args) {// 创建静态嵌套类的实例StaticNestedClassDemo.StaticNestedClass nested = new StaticNestedClassDemo.StaticNestedClass();nested.display();}
}

内部类(Inner Class)

  • 定义:内部类(也称为非静态嵌套类)是定义在另一个类中的类,不使用static关键字修饰。
  • 访问权限:内部类可以访问外部类的所有成员(静态和非静态成员),包括私有成员。
  • 实例化:内部类需要外部类对象才能实例化,通常通过外部类对象来创建内部类实例,或者在内部类中通过this或外部类名.this来引用外部类对象。
  • 用途:内部类常用于实现回调、监听器、闭包等需要访问外部类状态的场景,也可以用于组织紧密相关的类,提高代码封装性。

非静态嵌套类(内部类)没有使用 static 修饰,需要通过外部类的实例来创建。它可以直接访问外部类的所有成员,包括私有成员。

package com.morris.java11;/*** 内部类(Inner Class)的使用*/
public class InnerClassDemo {private String outerField = "Outer field value";// 内部类public class InnerClass {public void display() {System.out.println("Inside inner class");System.out.println("Accessing outer class field: " + outerField);}}public static void main(String[] args) {InnerClassDemo outer = new InnerClassDemo();// 创建内部类的实例InnerClassDemo.InnerClass inner = outer.new InnerClass();inner.display();}
}

匿名内部类(Anonymous Inner Class)

匿名内部类是内部类的一种特殊形式,它没有类名,通常在实现接口或继承类时直接定义在方法内部。匿名内部类通常用于一次性的操作,比如创建一个线程或实现某个接口时。

匿名类是没有名字的局部类,通常用于实现接口或继承类的临时实例。

package com.morris.java11;/*** 匿名内部类(Anonymous Inner Class)的使用*/
public class AnonymousInnerClass {private String outerField = "Outer field value";public void methodWithAnonymousClass() {// 匿名类实现接口Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("Inside anonymous class");System.out.println("Accessing outer class field: " + outerField);}};runnable.run();}public static void main(String[] args) {AnonymousInnerClass outer = new AnonymousInnerClass();outer.methodWithAnonymousClass();}
}

局部内部类(Local Inner Class)

局部内部类定义在外部类的方法内部,它的作用域仅限于该方法。局部内部类只能访问该方法中的final局部变量(从Java 8开始,这个限制放宽了,但局部变量必须是事实上不可变的)。

局部类是在方法、构造器或作用域内部定义的类。它只能在定义它的作用域中使用。

package com.morris.java11;/*** 局部内部类Local Inner Class的使用*/
public class LocalInnerClassDemo {private String outerField = "Outer field value";public void methodWithLocalClass() {// 局部内部类class LocalClass {public void display() {System.out.println("Inside local class");System.out.println("Accessing outer class field: " + outerField);}}LocalClass local = new LocalClass();local.display();}public static void main(String[] args) {LocalInnerClassDemo outer = new LocalInnerClassDemo();outer.methodWithLocalClass();}
}

嵌套类API的使用

Class.isNestmateOf()用于确定一个类是否是另一个类的嵌套成员或与其在同一嵌套类中。

Class.getNestHost()用于获取嵌套类的宿主类(nest host)。

package com.morris.java11;import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;/*** 嵌套类API的使用*/
public class NestClassApiDemo {public static void main(String[] args) {boolean isNestMate = NestClassApiDemo.class.isNestmateOf(NestClassApiDemo.Inner.class);boolean nestHost = NestClassApiDemo.Inner.class.getNestHost() == NestClassApiDemo.class;System.out.println(isNestMate); // trueSystem.out.println(nestHost); // trueSet<String> nestedMembers = Arrays.stream(NestClassApiDemo.Inner.class.getNestMembers()).map(Class::getName).collect(Collectors.toSet());System.out.println(nestedMembers); // [com.morris.java11.NestClassApiDemo, com.morris.java11.NestClassApiDemo$Inner]}public static class Inner{}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

X-Caps

用于对视觉属性进行编码的胶囊 补充信息 数据集太大&#xff0c;不建议复现

【西瓜书】4.决策树

1 递归返回情况 &#xff08;1&#xff09;结点包含样本全为同一类别 &#xff08;2&#xff09;属性集为空&#xff0c;没有属性可供划分了 或 有属性&#xff0c;但是在属性上划分的结果都一样 &#xff08;3&#xff09;结点为空结点 **结束时判定该结点的类别遵循如下规则&…

『哈哥赠书 - 54期』-『架构思维:从程序员到CTO』

文章目录 ⭐️ 架构思维&#xff1a;从程序员到CTO⭐️ 本书简介⭐️ 作者简介⭐️ 编辑推荐⭐️ 不想成为架构师的程序员不是好CTO 在程序员的职业规划中&#xff0c;成为软件架构师是一个非常有吸引力的选择。但是对于如何才能成为一名架构师&#xff0c;不少同学认为只要代码…

python大作业:实现的简易股票简易系统(含源码、说明和运行截图)

实现一个简单的股票交易模拟系统。该系统将包括以下几个部分: 数据处理:从CSV文件中读取股票数据。 股票交易算法:实现一个简单的交易策略。 命令行界面(CLI):允许用户查看股票数据和进行交易。 数据持久化:将用户的交易记录和当前资金存储在数据库中。 为了简化这个示例…

uniadmin引入iconfont报错

当在uniadmin中引入iconfont后&#xff0c;出现错误&#xff1a; [plugin:vite:css] [postcss] Cannot find module ‘E:/UniAdmin/uniAdmin/static/fonts/iconfont.woff2?t1673083050786’ from ‘E:\UniAdmin\uniAdmin\static\fonts\iconfont.css’ 这是需要更改为绝对路径…

王炸级产品:字节跳动的Seed-TTS

在人工智能的快速发展中&#xff0c;文本到语音&#xff08;TTS&#xff09;技术已成为连接数字世界与人类沟通的重要桥梁。而字节跳动推出的Seed-TTS模型&#xff0c;无疑是这一领域的一个突破性进展&#xff0c;它以其卓越的性能和高度的自然度&#xff0c;被誉为TTS模型中的…

4句话学习-k8s节点是如何注册到k8s集群并且kubelet拿到k8s证书的

一、kubelet拿着CSR&#xff08;签名请求&#xff09;使用的是Bootstrap token 二、ControllerManager有一个组件叫CSRAppprovingController&#xff0c;专门来Watch有没有人来使用我这个api. 三、看到有人拿着Bootstrap token的CSR来签名请求了&#xff0c;CSRAppprovingContr…

排序---快速排序的4次优化

前言 个人小记 一、代码 #include<stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define MAX_ARR 10000000 #define SCOPE 16 #define swap(a,b)\ {\__typeof(a) __ca;\ab,b__c;\ } #define TEST(func,arr,l,r)\ {\printf(&…

父组件调用子组件方法(组合式 API版)

在 Vue 3 中&#xff0c;defineExpose 是一个用于在组合式 API (Composition API) 中暴露组件内部方法或属性的函数。它允许父组件通过 ref 引用子组件实例&#xff0c;并调用子组件暴露的方法或访问其属性。 以下是子组件和父组件如何使用 defineExpose 和 ref 的详细解释和示…

如何快速分析并将一个简单的前后端分离项目跑起来

一、前言 主要是前一段时间有小伙伴问我说自己刚入坑学后端不久&#xff0c;在开源网站上找了个简单的前后端分离项目&#xff0c;但是自己不会跑起来&#xff0c;让我给他说说&#xff0c;介于这玩意三两句话不是很好说清楚&#xff0c;而且不清楚那个小伙伴的知识到何种地步…

规则引擎LiteFlow发布v2.12.1版本,决策路由特性

个人博客&#xff1a;无奈何杨&#xff08;wnhyang&#xff09; 个人语雀&#xff1a;wnhyang 共享语雀&#xff1a;在线知识共享 Github&#xff1a;wnhyang - Overview 简介 标题其实是不准确的&#xff0c;了解过的会知道在LiteFlow的2.12.0已经有了决策路由的特性&…

【TB作品】MSP430 G2553 单片机口袋板,读取单片机P1.4电压显示,ADC,电压表

功能 读取P1.4电压&#xff0c;显示到口袋板显示屏&#xff0c;电压越高亮灯越多。 部分程序 while (1){ADC10CTL0 | ENC ADC10SC; // Sampling and conversion startLPM0;adcvalue ADC10MEM; //原始数据 0到1023adtest (float) adcvalue / 1024.…

【算法训练 day48 零钱兑换、完全平方数】

目录 一、零钱兑换-LeetCode 322思路实现代码问题总结 二、完全平方数-LeetCode 279思路实现代码问题总结 一、零钱兑换-LeetCode 322 Leecode链接: leetcode 322 文章链接: 代码随想录 视频链接: B站 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及…

每一个企业,都值得拥有自己专属的AI大模型!

前言 在数字化浪潮席卷全球的今天&#xff0c;人工智能&#xff08;AI&#xff09;已不再是遥不可及的科幻概念&#xff0c;而是成为了企业创新、转型、升级的必备工具。尤其是AI大模型&#xff0c;凭借其强大的数据处理能力和深度学习能力&#xff0c;正在为企业带来前所未有…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 字符串序列判定(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 字符串序列判定(100分) 🌍 评测功能需要订阅专栏后私信联系…

Leetcode:四数之和

题目链接&#xff1a;18. 四数之和 - 力扣&#xff08;LeetCode&#xff09; 普通版本&#xff08;排序 双指针&#xff09; 主旨&#xff1a;类似于三数之和的解法&#xff0c;但需要多加一些限制&#xff0c;同时为了防止多个数组元素的相加之和出现整型溢出问题还要将整型…

基于python可伸缩JSON格式列表实现

对于消息体为一个json格式列表&#xff0c;列表长度变化的代码设计&#xff0c;如下实现可供参考。 1、python语言实现(直接取值) #codingutf-8n 2 # 行项目数 productCode [11111,222222,333333] unit [H06,H07,H08] qty [6,7,8] items []for i in range(0, n):item …

数据分析每周挑战——心衰患者特征数据集

这是一篇关于医学数据的数据分析&#xff0c;但是这个数据集数据不是很多。 背景描述 本数据集包含了多个与心力衰竭相关的特征&#xff0c;用于分析和预测患者心力衰竭发作的风险。数据集涵盖了从40岁到95岁不等年龄的患者群体&#xff0c;提供了广泛的生理和生活方式指标&a…

spring事务实现原理

Spring事务的实现原理主要是基于AOP&#xff08;面向切面编程&#xff09; 事务的开启与提交/回滚 开启事务&#xff1a;当Spring容器中的AOP代理检测到一个匹配的切点方法被调用时&#xff0c;它会首先开启一个新的事务或者加入到现有的事务中&#xff08;这取决于事务传播行…

【读脑仪game】

读脑仪&#xff08;Brain-Computer Interface&#xff0c;BCI&#xff09;游戏是一种利用脑电信号来控制游戏的新型交互方式。这类游戏通常需要专业的硬件设备来读取用户的脑电信号&#xff0c;并将这些信号转化为游戏中的控制信号。编写这样的游戏代码涉及到多个方面&#xff…