问:说说内部类和静态内部类的区别?

示例

内部类(Non-static Inner Class):

public class OuterClass {private String outerField = "我是外部类字段";class InnerClass {public void display() {System.out.println(outerField); // 可以直接访问外部类的成员}}public void showInnerClass() {InnerClass inner = new InnerClass(); // 实例化内部类inner.display();}
}public class Test {public static void main(String[] args) {OuterClass outer = new OuterClass();outer.showInnerClass(); // 外部类方法调用内部类}
}

静态内部类(Static Inner Class):

public class OuterClass {private static String outerField = "我是外部类静态字段";static class StaticInnerClass {public void display() {System.out.println(outerField); // 可以直接访问外部类的静态成员}}public static void showStaticInnerClass() {StaticInnerClass inner = new StaticInnerClass(); // 不需要外部类实例即可实例化inner.display();}
}public class Test {public static void main(String[] args) {OuterClass.showStaticInnerClass(); // 直接通过外部类调用静态内部类的方法}
}
区别说明

1. 实例化

  • 内部类:需要依赖外部类的实例来创建实例。即内部类的实例与外部类的实例是绑定的,每一个内部类实例都隐式地持有一个外部类实例的引用。
  • 静态内部类:不需要外部类的实例即可创建实例,因为它属于类层级(而非实例层级),所以它可以直接通过外部类名来访问(如果它是publicprotected/default访问级别,并且在相同的包中或子类中)。

2. 访问权限

  • 内部类:可以直接访问外部类的所有成员(包括私有成员),因为它持有一个外部类实例的引用。
  • 静态内部类:只能直接访问外部类的静态成员。如果需要访问非静态成员,则必须通过外部类的实例。

3. 用途

  • 内部类:常用于实现回调接口(如事件监听器)、定义辅助类以及实现多继承的效果(Java不直接支持多继承,但可以通过内部类实现)。
  • 静态内部类:常用于作为工具类或者当内部类与外部类逻辑上较为独立时使用。它提供了一种将代码组织在一起的方式,但又保持了类的独立性和可重用性。
结语
特性内部类 (Non-static Inner Class)静态内部类 (Static Inner Class)
实例化需要外部类的实例不需要外部类的实例
访问外部类成员可以访问所有成员(包括私有)只能访问静态成员
持有外部类引用
用途实现回调、辅助类、多继承模拟组织代码、工具类、逻辑独立

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

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

相关文章

144. 腾讯云Redis数据库

文章目录 一、Redis 的主要功能特性二、Redis 的典型应用场景三、Redis 的演进过程四、Redis 的架构设计五、Redis 的数据类型及操作命令六、腾讯云数据库 Redis七、总结 Redis 是一种由 C 语言开发的 NoSQL 数据库,以其高性能的键值对存储和多种应用场景而闻名。本…

可重入VI,VI模板和动态VI之间的差异 转

可重入VI 当您想要同时运行同一VI的多个实例时,将使用可重入VI。当VI不可重入时,VI只有一个数据空间。因此,一次只能有一个调用者运行VI,因此调用者可能必须“等待轮到它”时才能使用VI。这是VI的默认选项,但您可以将V…

ARKTS数组和Map的常规操作

数组 Entry Component struct ArrayDemo {State message: string Hello World;// 创建一个数组State testList: Array<string> [测试1, 测试2, 测试3];build() {Row() {Column() {Button(新增元素).onClick(() > {// this.testList.push(测试4)//在数组末尾添加一个…

js基础速成-字符串方法

字符串方法 JavaScript 中的所有内容都是对象。字符串是一种基本数据类型&#xff0c;这意味着一旦创建就无法修改。字符串对象有许多字符串方法&#xff0c;有不同的字符串方法可以帮助我们处理字符串。 length 字符串的 length 方法返回字符串中字符的数量&#xff0c;包括…

Hibernate 批量插入速度慢的原因和解决方法

由于业务需要一次性连续写入超过10k条以上的新数据&#xff0c;当对象超过10个成员变量以后&#xff0c;整个写入过程居然需要长达35秒&#xff0c;这个速度是不能接受的&#xff0c;故此研究了一下怎么开启Hibernate批量写入的功能。 我这边使用的是Hibernate 5.6.15 在网上…

Spark MLlib模型训练—回归算法 Linear regression

Spark MLlib模型训练—回归算法 Linear regression 线性回归是回归分析中最基础且应用广泛的一种方法。它用于建模目标变量和一个或多个自变量之间的关系。随着大数据时代的到来,使用像 Spark 这样的分布式计算框架进行大规模数据处理和建模变得尤为重要。本文将全面解析 Spa…

Java 异常架构Exception(异常)

1. Exception 类的概述 在Java中&#xff0c;Exception类是Throwable类的直接子类之一。Throwable类是Java异常处理体系的根类&#xff0c;所有异常和错误都继承自它。Java的异常体系可以分为以下几个部分&#xff1a; Throwable&#xff1a;所有异常和错误的基类。 - Exce…

【Java|Stream流】不可变集合

文章目录 1.什么是不可变集合2.创建不可变集合的方式2.1 List类型2.2 Set2.3 Map 1.什么是不可变集合 不可变集合:不可以被修改的集合 不可变集合优点: 安全性 由于不可变集合不能被修改&#xff0c;所以可以安全地在多个线程之间共享&#xff0c;而不用担心被意外修改&#xf…

【kubernetes】Service 介绍和应用

一&#xff0c;Service介绍 四层代理是基于传输层&#xff08;第四层&#xff09;工作的代理&#xff0c;主要在传输层&#xff08;如TCP、UDP协议&#xff09;上转发和管理数据流 七层代理是基于应用层&#xff08;第七层&#xff09;工作的代理&#xff0c;能够对应用层协议…

# 利刃出鞘_Tomcat 核心原理解析(十)-- Tomcat 性能调优--2

利刃出鞘_Tomcat 核心原理解析&#xff08;十&#xff09;-- Tomcat 性能调优–2 二、Tomcat专题 - Tomcat性能调优 - 性能测试结果说明 1、压力性能测试 # 打开另一个终端&#xff0c;切换目录 [rootbogon ~]# cd /usr/local/tomcat# 进行压力性能测试[rootbogon tomcat]# …

JSON处理库 -- Fastjson

文章目录 一、json格式1.1 用途1.2 语法1.3 常见格式 二、fastjson常用类2.1 JSONObject2.2 JSONArray 三、序列化和反序列化3.1 默认序列化与反序列化3.2 序列化的扩展3.3 自定义序列化SerializeFilter3.4 JSONField 注解3.5 复习Jackson 一、json格式 1.1 用途 一种轻量级的…

浅谈SpringMvc的核心流程与组件

一、SpringMvc的核心流程 当发起请求时被前置的控制器(DispatcherServlet)拦截到请求&#xff0c;根据请求参数生成代理请求&#xff0c;找到请求对应的实际控制器&#xff0c;控制器处理请求&#xff0c;创建数据模型&#xff0c;访问数据库&#xff0c;将模型响应给中心控制…

threadLocal底层源码解析

分享链接&#xff1a; https://www.cnblogs.com/blissful/p/17929221.html

边缘计算与物联网中的深度学习应用

边缘计算与物联网中的深度学习应用 目录 一、引言 二、边缘计算基础 三、物联网基础 四、深度学习在物联网中的应用实例 五、总结 一、引言 随着物联网技术的不断发展&#xff0c;越来越多的设备和传感器被连接到互联网上&#xff0c;产生了海量的数据。这些数据需…

Android创建自己的内容提供器(ContentProvider)

文章目录 Android创建自己的内容提供器&#xff08;ContentProvider&#xff09;创建内容提供器的步骤新建MyProvider继承自ContentProvider内容URI的格式修改MyProvider中的代码MIME类型 Android创建自己的内容提供器&#xff08;ContentProvider&#xff09; 在上一节当中&a…

扑捉一只耿鬼(HTML文件)

图例&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>耿鬼</title><style>body {background: #fff;font-family: Comfortaa, sans-serif;}* {box-sizing:…

Unet改进12:添加PCONV||减少冗余计算和同时存储访问

本文内容:添加PCONV 目录 论文简介 1.步骤一 2.步骤二 3.步骤三 4.步骤四 论文简介 为了设计快速的神经网络,许多工作都集中在减少浮点运算(FLOPs)的数量上。然而,我们观察到FLOPs的这种减少并不一定会导致类似程度的延迟减少。这主要源于低效率的每秒浮点操作数(FLOP…

Bean 的实例化(创建 | 获取)

Spring为Bean提供了多种实例化方式&#xff0c;包括如下4种方式&#xff1a; 第一种&#xff1a;通过构造方法实例化第二种&#xff1a;通过简单工厂模式实例化第三种&#xff1a;通过factory-bean实例化&#xff08;工厂方法模式实例化&#xff09;第四种&#xff1a;通过Fact…

盘点java8 stream中隐藏的函数式接口

shigen坚持更新文章的博客写手&#xff0c;记录成长&#xff0c;分享认知&#xff0c;留住感动。个人IP&#xff1a;shigen 提到函数式接口&#xff0c;最常见的就是lambda表达式&#xff0c;IDEA也有智能的提示&#xff1a; 最后改成这样的就是最简洁的、IDEA希望的风格&#…

Android UI绘制原理:UI的绘制流程是怎么样呢?为什么子线程不能刷新UI呢?讲解大体的流程是怎么样的

目录&#xff1a; 一、 为什么要学习android UI绘制原理呢&#xff1f;对我们有什么帮助&#xff1f; 1.解决复杂布局问题&#xff1a;了解UI绘制原理可以帮助我们更好地理解和解决布局问题&#xff0c;比如使用自定义View、优化布局层级等。 2.知道何时触发布局&#xff08;…