非静态内部类的使用注意事项

045_成员内部类(静态 / 非静态) 文章摘要: 成员内部类是定义在外部类内部的类,分为非静态和静态两种。非静态内部类依赖外部类实例,可访问外部类所有成员,创建需通过外部类实例;静态内部类不依赖外部类实例,仅能访问外部类静态成员,可直接创建。两者核心区别在于依赖关系、访问权限和静态支持。成员内部类通过访问修饰符(如private)控制可见性,常用于逻辑分组和封装辅助类,非静态适合强关联场景(如Map.Entry),静态适合独立工具类。 阅读详情

1.非静态内部类的构造器

package com.example.javalib;

import java.lang.reflect.InvocationTargetException;

public class OuterClass {
    public class InnerClass{

    }

    public static void main(String[] args) throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
        new OuterClass().test();
    }
    private void  test() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        InnerClass innerClass = new InnerClass();// 注释1:正常执行
        InnerClass.class.getConstructor().newInstance();//注释2:利用反射实例化内部类

    }
}

运行:

在这里插入图片描述
利用javac命令将java文件生成class文件或者build文件夹下看对应的class文件

javac OuterClass.java

javap分析或者直接查看class文件

 javap -c OuterClass.InnerClass

在这里插入图片描述
由图可以看出非静态内部类并没有无参构造器,它的构造器需要一个OuterClass参数.
这就验证了非静态内部类的规则:
非静态内部类必须寄生在外部类的实例中,没有外部类的对象就不可能产生非静态内部类对象
so 非静态内部类不可能有无参构造器即使系统为非静态内部类提供了默认的构造器,也是需要外部类的形参,这就解释了为什么注释2会报错,程序通过反射指定调用InnerClass无参数构造器,so引发运行时异常.
系统在编译阶段总会为非静态内部类的构造器增加一个参数,非静态内部类的构造器的第一个形参类型总是外部类.

2.非静态内部类不能拥有静态成员


对于非静态内部类而言,由于它本身是一个非静态的上下文环境,so非静态内部类中不能拥有静态成员

3.非静态内部类的子类


非静态内部类在外部类中派生子类是安全的

Java之内部类续 静态内部类 阅读详情

相关推荐

别再只抄代码了!深入理解MQ2传感器数据手册,搞定ppm换算公式

本文深入解析MQ2烟雾传感器的工作原理与ppm换算公式,从数据手册解读到数学建模,提供详细的校准与优化方法。通过实际案例和代码示例,帮助开发者准确测量气体浓度,解决常见问题,提升传感器应用的可靠性。

weixin_42713608的博客 504

非静态内部类的构造器

有如下程序 public class Outer{ public static void main(String args[])throws Exception{ new Outer().test(); } public void test()throws Exception{ //创建非静态内部类对象 Sy...

weixin_30652879的博客 140

STM32F030F4P6 ADC多通道定时器触发DMA搬运

主函数中等待转换完成的标志位,然后打印出来。ADC回调函数中将数值赋值给变量。配置定时器1s读一次。

qq_24426625的博客 1355

Post请求,请求成功,但参数为null

问题描述 1.使用Postman测试写的接口时,发现错误,请求可以接收,但是参数为空, @RestController @RequestMapping("tsetApi") public class CompareController { ​ @PostMapping("query1") public String getTestPost1(@RequestParam(name="id",required = false) String id, @RequestParam(name="...

qq_41610498的博客 1万+

STM32F407 CanOpen主机实战:对象字典配置与多电机CIA402协议驱动详解

本文详细介绍了基于STM32F407的CanOpen主机开发实战,重点解析了对象字典的配置流程与多电机CIA402协议驱动方法。通过使用objdictedit工具配置SDO和PDO参数,并整合CanFestival协议栈,实现了对多个伺服电机的稳定同步控制。文章提供了从硬件连接到代码调试的完整指南,帮助开发者快速掌握工业现场的多轴运动控制技术。

plant的博客 528

领域驱动新实践:COLA框架全解析——架构设计与实战案例解析

定义订单支付事件java代码解读复制代码} }Order定义Order类,继承并实现支付逻辑:java代码解读复制代码} }定义接口:java代码解读复制代码定义类,处理订单支付逻辑并持久化:java代码解读复制代码} }定义和处理订单支付事件:java代码解读复制代码} }java代码解读复制代码} }定义和接口及其实现:java代码解读复制代码java代码解读复制代码。

2401_89221445的博客 2659

Java内部类应用——非静态内部类

一 内部类的基本概念 1定义 把一个类放在另一类的内部定义,这个定义在其它类内部的类就被称为内部类,也叫嵌套类,包含内部类的类也被称为外部类,也叫宿主类。 2作用 内部类提供更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类。 内部类成员可以直接访问外部类的私有数据,因为内部类是外部类的成员,同一个类的成员之间可以互相访问,但外部类不能访问内部类的实现细节,例...

实践求真知 685

SFT看这一篇就够了!万字长文:监督微调(Supervised Fine-Tuning, SFT)技术全解析【从理论到实战】

大家好,我是大 F,深耕AI算法十余年,互联网大厂技术岗。分享AI算法干货、技术心得。欢迎关注,一起探索技术的无限可能!

大F子的智能小课 711

内部类,非静态的成员变量必须通过实体类来调用

今天在给内部类赋值时遇到了这个问题,于是便记录下大概意思就是:像这样的非静态内部类只能通过使用默认的无参数构造函数来实例化。那么无非两种情况,要么用static,要么不用static

一名后端程序猿 9549

YOLO26 旋转框检测 OBB 技术:角度预测与解码优化

YOLO26旋转框检测技术通过CSL角度编码有效解决了OBB检测中的周期性问题。该技术采用5参数表示法(cx,cy,w,h,θ),在检测头中分别处理分类、回归和角度预测。核心创新点包括:1)使用高斯或三角窗口的CSL编码对角度进行平滑表示;2)通过加权平均解码角度,避免边界不连续问题。该方法在遥感、文本检测等需要精确方向信息的场景中表现优异,相比传统HBB框可提升定位精度30%以上,同时保持了YOLO系列的高效特性。

一键难忘的博客 520

深入详细分析Skyworks 78113 PAMiD射频方案图

是一种高集成度的射频前端模块,它结合了功率放大器(PA)、双工器(Duplexer)、滤波器和开关等多个组件,主要用于4G LTE移动通信系统中的射频前端链路。是一款典型的PAMiD模块,通过将多个频段的发射(TX)和接收(RX)路径集成在一个模块中,大大减少了传统射频设计中的分立器件,同时提高了信号链路的效率和可靠性。模块化设计的优势PCB空间优化:高集成度设计大幅减小了射频电路的尺寸,适用于紧凑型移动设备。减少设计复杂度:模块化设计减少了器件间的匹配与调试工作,加速产品开发周期。性能稳定性。

weixin_43199439的博客 1480

Java内部类使用注意事项

Java内部类使用注意事项: 1. 非静态内部类成员可以访问外部类实例成员 (如注释1),但外部类访问非静态内部类的成员 必须创建非静态内部类对象来访问其成员,如注释2 public class Lab02 { private int ss=5; private class InnerClass{ private int demo=4; private void tes...

a2381111的博客 436

成功解决安装cuda的时候,下载的文件自动消失,并且出现An unknown error has occurred

成功解决安装cuda的时候,下载的文件自动消失,并且出现An unknown error has occurred. 目录 解决问题 解决思路 解决方法 解决问题 安装cuda的时候,下载的文件自动消失,并且出现An unknown error has occurred. 解决思路 发生未知错误。 解决方法 很可能是因为当前电脑下载的cuda版本不适合当前电脑GPU支持的cuda版本! 推荐文章:CV:Win1..

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 7523

Java基础——内部类

方法中、代码块中、构造中。

YTC178的博客 902

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

详述Java中的静态内部类与非静态内部类

目录 一、静态内部类与非静态内部类的定义 二、静态内部类与非静态内部类 (1)非静态内部类 a、非静态内部类在非静态方法中 b、非静态内部类在静态方法中 (2)静态内部类 a、静态内部类在非静态方法中的调用 b、静态内部类在静态方法中的调用 三、注意 一、静态内部类与非静态内部类的定义 按照是否有static修饰分为静态内部类和非静态内部类,有static修饰的为静态内...

Liuxiaoyang1999的博客 429

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

java中的非静态内部类和静态内部类

内部类:定义在一个类的成员位置,和成员变量以及成员方法所在的位置是一样的,在位置上它们时平行的。 Class Outer{ //成员变量 private int num=10; //成员方法 public void method(){ Inner i=new Inner(); i.function(); } ...

guyue的博客 365

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

java内部类可以使用public_Java内部类使用注意事项

Java内部类使用注意事项:1. 非静态内部类成员可以访问外部类实例成员 (如注释1),但外部类访问非静态内部类的成员 必须创建非静态内部类对象来访问其成员,如注释2public class Lab02 {private int ss=5;private class InnerClass{private int demo=4;private void test() {//注释1:非静态内部类可以直...

weixin_34098846的博客 2382

重学java 26.面向对象 内部类⭐

所谓的匿名内部类:可以理解为没有显式声明出类名的内部类当简单调用一次接口中的方法,我们就可以使用匿名内部类。

m0_73983707的博客 1327

面向对象的陷阱——非静态内部类的陷阱

3、非静态内部类的陷阱        内部类是Java提供的一个常用语法。内部类能提供更好的封装,而且它可以直接访问外部类的private成员,因此在一个特殊场合下更常用。 3、1 非静态内部类的构造器 public class Outer { public static void main(String[] args) throws Exception { new Outer().t

Never_Blue的博客 689

java 反射创建内部类

Java 反射创建内部类 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时检查或修改类的行为。内部类(Inner Class)则是一种特殊的类,它定义在另一个类的内部,并可以访问外部类的成员。本文将深入探讨如何使用Java反射来创建内部类的实例,并展示其在实际开发中的应用。 内部类的基本概念 J...

cnzzs的博客 815

Java内部类有坑,100%内存泄露!

内部类改为静态的之后,它所引用的对象或属性也必须是静态的,所以静态内部类无法获得外部对象的引用,只能从 JVM 的 Method Area(方法区)获取到static类型的引用。内部类改为静态的之后,它所引用的对象或属性也必须是静态的,所以静态内部类无法获得外部对象的引用,只能从 JVM 的 Method Area(方法区)获取到 static 类型的引用。非静态内部类会持有外部类,如果有地方引用了这个非静态内部类,会导致外部类也被引用,垃圾回收时无法回收这个外部类(即使外部类已经没有其他地方在使用了)。

轻描时光 1095

Java中使用内部类实战

一点睛 分三种情况讨论内部类的使用: 1 在外部类内部使用内部类 2 在外部类以外使用非静态内部类 3在外部类以外使用静态内部类 二在外部类内部使用内部类 可以直接通过内部类的类名来定义变量,通过new调用内部构造器来创建实例。 不要在外部类的静态成员(包括静态方法和静态初始化块)中使用非静态内部类,因为静态成员不能访问非静态成员。 三在外部类以外使用非静态内部类 1点...

实践求真知 388

Java中内部类

非静态内部类可以直接在一个类里面定义,只有在外部对象存在时才有意义静态内部类的实例化不需要一个外部类的实例为基础,可以直接实例化在声明一个类的同时实例化它。

m0_72805195的博客 216

内部类创建方法

1.内部类也有四种访问权限,同其他属性,作用权限为同一个类、同一个包、父子类和任何位置. 声明非静态内部类对象的方法: 外部类名.内部类名 对象名=new 外部类名().new 内部类名(); 即先有对象再创建 2.声明静态内部类对象的方法: 外部类名.内部类名 对象名=new 外部类.内部类名(); 如果想去掉外部类名,则需要引包 public class ...

Hmq1025的博客 689

内部类和静态内部类

关于了解到匿名内部类和单例模式中静态内部类,引发的学习

qq_56412380的博客 323

深入的理解嵌套类和内部类

Java   内置了多线程,         想象一下:     我现在在一个方法里面定义了一个   内部类   它需要用到这个方法的局部变量,但是这个内部类是在另一个线程中启动调用的,那个线程和这个方法调用的线程不是同一个调用堆栈,当那个线程调用了这个内部类的方法,这个时候定义这个内部类的方法的那个局部变量的值是不是变得不可预测了?   这两个线程是独立执行的,为了消除这个很容易出现的错误,Ja

daniel112的专栏 653
上一篇: static关键字
下一篇: JVM虚拟机内存结构和JAVA内存模型
zz白龙
博客等级 码龄10年 26粉丝 138原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zz白龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值