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

嵌入式SD/TF卡通用协议-SDIO协议 为了驱动SD卡,首先的第一步就是观察SD卡引脚接线情况,通常我们在画原理图时,都是使用的SD卡卡槽与MCU进行接线。SD卡可以使用SDIO协议和SPI协议进行通信,这里我们主要介绍SDIO协议。下图中的TF卡只是容量小一点的SD卡。以F1C100S为例,接线图如下所示:我们发现上图中的TF卡使用的协议为SDIO协议,主要有4根数据线,1根命令线,1根时钟线组合而成。为了驱动这个SD/TF卡我们就需要去了解SDIO协议的时序。 阅读详情

3、非静态内部类的陷阱

       内部类是Java提供的一个常用语法。内部类能提供更好的封装,而且它可以直接访问外部类的private成员,因此在一个特殊场合下更常用。

3、1 非静态内部类的构造器

public class Outer {
	public static void main(String[] args) throws Exception {
		new Outer().test();
	}
	
	private void test() throws Exception {
		System.out.println(new Inner());  //①
		System.out.println(Inner.class.newInstance());  //②
	}
	
	public class Inner {
		public String toString() {
			return "Inner对象";
		}
	}
}
输出结果为:
Inner对象
Exception in thread "main" java.lang.InstantiationException: Outer$Inner
at java.lang.Class.newInstance(Unknown Source)
at Outer.test(Outer.java:10)
at Outer.main(Outer.java:5)
       代码①行运行正常,代码②行运行报错。这符合静态内部类的规则:非静态内部类必须寄生在外部类的实例中,没有外部类的对象,就不可能产生非静态内部类的对象。因此,非静态内部类不可能有无参数的构造器——即使系统为非静态内部类提供一个默认的构造器,这个默认的构造器也需要一个外部类形参。对于①行代码,程序表面上调用Inner无参数的构造器创建实例,实际上虚拟机会将this(代表当前默认的Outer对象)作为实参传入Inner构造器。至于程序②行代码的效果则不同,程序通过反射指定调用Inner类无参数的构造器,所以引发了运行时异常。
注意:系统在编译阶段总会为非静态内部类的构造器增加一个参数,非静态内部类的构造器的第一个形参总是外部类。因此调用非静态内部类的构造器时必须传入一个外部类对象作为参数,否则程序将会引发运行时异常。

3、2 非静态内部类的子类

class Out {
	class In {
		public void test() {
			System.out.println("In的test()方法");
		}
	}
	
	class A extends In {}
}

public class OutTest extends Out.In {
	public static void main(String[] args) {
		System.out.println("Hello World!");
	}
}
报错:No enclosing instance of type Out is available due to some intermediate constructor invocation
       上面程序错误的关键在于,由于非静态内部类In必须寄生在Out对象之内,因此父类Out.In根本没有无参数的构造器。而程序定义其Out.In时,也没有定义构造器,那么系统会为它提供一个无参数的构造器。在OutTest无参数的构造器中,编译器会增加代码super(),对于super()调用,指定调用父类Out.In无参数的构造器,必然导致编译错误。为了解决这个问题,应该为OutTest显示定义一个构造器,在该构造器中显示调用Out.In父类对应的构造器,也就是OutTest类的代码改为如下所示。
public class OutTest extends Out.In {
	public OutTest() {
		new Out().super();
	}
	public static void main(String[] args) {
		System.out.println("Hello World!");
	}
}
输出结果为:
Hello World!

总结:由于非静态内部类必须寄生在外部类的实例之中,程序创建非静态内部类对象的实例,派生非静态内部类的子类时都必须特别小心,否则很容易引入陷阱。如果条件允许,推荐多使用静态内部类,而不是非静态内部类。对于静态内部类来说,外部类相当于它的一个包,因此静态内部类的用法就简单多了,限制也会少很多,但是静态内部类不能访问外部类的非静态成员。





【仿真】Carla Python API实战:从零搭建自动驾驶测试环境 本文详细介绍了如何使用Carla Python API从零搭建自动驾驶测试环境。通过Carla仿真平台,开发者可以构建高度逼真的城市环境和车辆物理模型,利用Python API实现传感器配置、数据采集、场景构建及自动驾驶算法集成。文章还分享了实际项目中的调试技巧和性能优化经验,帮助读者快速掌握自动驾驶仿真测试的核心技术。 阅读详情

相关推荐

通过PXE的方式实现Ubuntu 24.04 自动安装

之前都是通过PXE来自动化安装Redhat系列的,例如:Rocky9、Rocky10、CentOS7、银河麒麟 Kylin-V10、Kylin-V11、OpenEuler 24.03等。现在安装Ubuntu系列的跟红帽的不太一样,所以在这里介绍下。

邢宇宇的博客 1494

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

1.非静态内部类的构造器 package com.example.javalib; import java.lang.reflect.InvocationTargetException; public class OuterClass { public class InnerClass{ } public static void main(String[] args) throws InvocationTargetException, NoSuchMethodExceptio

白龙的博客 523

BDD测试之Behave使用入门

BDD测试(Behavior-Driven Development Testing)是一种基于“行为驱动开发”(BDD)理念。

想要成为酷盖但是失败的小明 581

java innerexception_Java 的内部类反射,使用 newInstance 总是抛 NoSuchMethodException 异常呢?...

package com.prac;public class outer {int i = 1;private static class staticInner{int j = 2;staticInner(){}void print(){System.out.println("in staticInner");}}private class normalInner{int k =3;void pri...

weixin_42117340的博客 1321

基于aarch64分析kernel源码 六:kernel_init进程(1号进程)、kthreadd进程(2号进程)

kernel_init进程(1号进程)、kthreadd进程(2号进程)分析

OnlyLove_的博客 764

基于mediapipe的动作捕捉和unity的人物模型驱动

用到的人体关键点检测的算法是Google开发的基于深度学习的实时多媒体套件,汇集了人体、手部、人脸关键点追踪、物体检测、物体识别等多个流行的视觉任务的成果。整套 Mediapipe正如其名字,专门为便携设备上的多媒体应用设计,模型非常小,在笔记本手机上也能实时跑,跨平台、跨语言。mediapipe实时性是没什么问题。但是是以牺牲了质量为代价的,这种关键点检测一般是用来做动作识别,类似于运动app跳绳计数、判定瑜伽动作标不标准这种。用单目视觉来做人物模型的驱动,总差点意思。

qq_58484580的博客 5727

No enclosing instance of type WallpaperService is available due to some intermediate constructor inv

在写动态壁纸时遇到: No enclosing instance of type WallpaperService is available due to some intermediate constructor invocation 意思是说,Engine是WallpaperService的内部实现类,如果我们在onCreateEngine中返回的Engine不是Wallpaper

猛虎o蔷薇 2474

什么是华为OD?怎么才能通过华为OD机试?华为OD机试怎么刷题?(2024最新华为OD机试E卷更新中)

华为OD是Outsourcing Dispacth模式,是华为和外企德科联合招聘的简称。目前华为大多数是OD招聘。OD模式也是华为提出的一种新的用工形式,每年都会从OD项目挑优秀员工转为正编。所有OD和正式员工一样对待,没有差别,部门平时开会、评审等活动都是一起参加的,是同薪同酬,都是由华为的HR直接定的薪资,看的是我们技术能力。华为是大企业,能到华为上班也是有能力的,每个部门都有好多职位,是金子,在哪都会发光。

KJ.JK 11万+

fasterxml jackson反序列化时对于非静态内部类报错

java中通常使用jackson、fastjson两个库来处理json。后者的api使用起来比较方便,但是安全漏洞太多了。对于嵌套结构,定义了一个包含内部类的java类来接收,如果这个复杂结构是一个数组形式,那么反序列化时会报上面错误。

赶路人儿 2652

uniapp - 强力解决 swiper 轮播图内嵌套视频导致滑动不流畅卡顿问题,轮播滑块视图容器里既有图片也有视频video组件共同存在出现滑动切换特别卡,轮播组件包裹视频播放器加载慢及层级过高解决

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,swiper,轮播图,轮播图嵌套视频,卡顿,加载慢,左右滑动不流畅,很卡,滑动过快就会卡住,uniapp使用swiper组件里嵌套视频与图片如何解决卡顿问题,详细解决教程,swiper里有视频video,播放器,视频+图片轮播,层级过高及卡顿问题,没等看完视频就自动切换了,报错,无法加载播放,uniapp的App安卓苹果端,video老是加载,APP端video组件播放视频卡顿,抖音,快手,上下滑动视

🏆 前端领域优质创作者 1万+

063、推挽变换器的磁偏问题与解决

本文针对推挽变换器中的磁偏问题展开分析。作者通过实际案例指出,磁偏主要由开关管导通压降差异和驱动信号不对称引起,会导致变压器饱和、MOS管炸毁等问题。文章提供了四种解决方案:采用电流模式控制、添加隔直电容、优化对称驱动设计以及引入磁芯气隙(作为最后手段)。调试时应重点观察原边电流波形对称性、变压器声音和直流分量。作者强调实践经验的重要性,建议预留隔直电容位置,并指出推挽拓扑在500W以上功率场合的局限性。这些基于实战的经验总结为电源工程师提供了有价值的参考。

Jack010169的博客 312

Jackson反序列化问题

本文翻译于一片国外文章,原文链接如下:Tatu Saloranta JackSon和内部类,是的,你可以使用,但他们必须是静态的内部类。 这是我直到今天没有意识到的东西:这显然是正确使用内部类在Java开发者社区的巨大的困惑。事实上有一些网页显示 JackSon不能使用内部类值。 这实际上是真实的和虚假的,原因就在于Java的内部类的特点。早在Java 1.1的时候就引入了

c_yahoo的专栏 3146

Oracle EBS FA 如何打开关闭的资产会计期间?

用户“运行折旧”,误勾选为“关闭期间”,还有一部分资产还需要操作报废和调整,希望后台打开关闭的资产会计期。

陈显平的专栏-Oracle EBS 1031

4.面向对象的陷阱

Java面向对象的设计过程中也会有一些陷阱***************************************************************************************学习笔记如下:instanceof运算符的陷阱 instanceof是一个非常简单的运算符。instanceof运算符的前一个操作数通常是一个引用类型的变量,后一个操作数通常是一个类(...

Hyo_yew的博客 433

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

面试 Java 基础八股文十问十答第十三期

1)在一个静态方法内调用一个非静态成员是非法的,因为静态方法属于类而不是实例,它不依赖于类的实例化。非静态成员(例如实例变量或非静态方法)需要在对象实例化后才能被访问,而静态方法在对象实例化之前就可以被调用。在静态方法内部,没有this对象的引用,因此无法直接访问非静态成员,因为非静态成员的访问需要一个实例化的对象。2)方法的返回值是指方法执行后返回的数据。在很多编程语言中,方法可以执行一些操作,并产生一个结果,这个结果就是返回值。返回值可以是任何数据类型,包括整数、浮点数、字符串、对象等。

qq_67358181的博客 617

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

27、面向对象的陷阱

1、instanceof运算符的陷阱

YGingko的专栏 564

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

疯狂Java笔记之面向对象的陷阱

instanceof运算符的陷阱instanceof是一个非常简单的运算符。instanceof运算符的前一个操作数通常是一个引用类型的变量,后一个操作数通常是一个类(也可以是接口,可以把接口理解成一个特殊的类),他用于判断前面的对象是否是后面的类或其子类,实现类的实例。如果是,则返回true,否则,返回false.String obj="Java"; obj instanceof Math上面程序

Jack921的专栏 460

Java SE 085 Java内部类深度剖析及常见使用陷阱

(1)一个人只要自己不放弃自己,整个世界也不会放弃你. (2)天生我才必有大用 (3)不能忍受学习之苦就一定要忍受生活之苦,这是多么痛苦而深刻的领悟. (4)做难事必有所得 (5)精神乃真正的刀锋 (6)战胜对手有两次,第一次在内心中. (7)编写实属不易,若喜欢或者对你有帮助记得点赞+关注或者收藏哦~ Java SE 085 Java内部类深度剖析及常见使用陷阱 文章目录Java SE 085 Java内部类深度剖析及常见使用陷阱1.内部类(Inner Class)2.静态内部类2.1使用规范2.2静.

青风百草 341

非静态内部类

内部类是Java提供的一个常用语法,内部类能提供更好的封装,而且可以直接访问外部类的private成员。在一些特殊场合下使用,可能产生一些陷阱。 一、非静态内部类的构造器 非静态内部类必须寄生在外部类的实例中,没有外部类的对象,就不可能产生非静态的内部类对象。 系统会在编译阶段总会为非静态内部类的构造器增加一个参数,非静态内部类的构造器的第一个形参类型总是外部类。也就是说非静态内部类没有...

iteye_11537的博客 117

No.7 面向对象的陷阱

1.instanceof 运算符的陷阱 instanceof 运算符前面操作数的编译时类型必须是以下三种情况:①与后面的类相同②是后面的父类③是后面的子类。否则 无法通过编译(Incompatible conditional operand types String and Math) 使用该运算符 从 编译、运行两个阶段来考虑 强制转换机制 编译阶段(需要有继承关系...

178

Java内部类的深度解析从匿名类到静态嵌套类的应用与陷阱

匿名内部类和局部内部类在每次实例化时都会生成新的类文件,可能增加类加载开销。在性能敏感的应用中,应优先考虑静态嵌套类,避免在循环或高频调用的方法中创建匿名内部类。静态嵌套类不持有外部类实例的引用,行为上更像一个独立的类,只是命名空间位于另一个类内部。例如,匿名内部类常用于策略模式的快速实现,静态嵌套类常用于实现Builder模式,而成员内部类则常用于迭代器模式的实现。内部类的使用还需要考虑代码的兼容性和可维护性。Java内部类是面向对象编程中一个强大且灵活的特性,它允许在一个类的内部定义另一个类。

builder_ming的博客 404

java 之 面向对象的陷阱

java static 关键字的作用 : static 关键字 是 静态的意思,多个实例的 静态变量 共享同一块 内存空间。静态变量属于类变量。 静态变量,静态方法在加载类的时候 就会 一起加载。 static 可以修改 类,方法,变量,代码块 等。 static 使用的基本规则是 什么? static 可以修饰同步方法, 静态内部类 和 非静态内部类:  静态内部类

tuyf_hs的专栏 376

static native面向对象的陷阱

static 修饰Field,方法,内部类,初始化块,内部枚举类,static作用是把类里面的成员变成静态成员,类成员。 静态方法属于类,被static修饰的成员不属于当个对象,属于类, 例1:public class Test1 {     public static void info(){         System.out.println("静态的info");     }

sinat_29765453的博客 441

深入解析static关键字在面向对象编程中的核心应用与陷阱

在面向对象编程(OOP)中,static关键字是一个基础但关键的概念,它通过类级别的共享机制打破了传统对象封装的界限。从原理上看,static成员随类加载而初始化,具有独立于实例、全局共享的特性,这种设计在工具类实现、资源预加载等场景能显著提升性能。在Java/C++等语言中,合理使用static可以优化内存管理(如避免重复创建对象)和提升执行效率(如无状态方法调用),但同时也需警惕线程安全、内存泄漏等常见陷阱。现代编程实践中,static在工具类封装、单例模式实现、缓存设计等方面仍有广泛应用,而Kotli

weixin_26846533的博客 332

PHP面向对象编程陷阱(90%新手都犯过的错误)

掌握PHP面向对象编程关键技巧,避开90%新手常犯的错误。通过清晰的PHP类定义示例,解析常见陷阱与正确写法,提升代码可维护性与性能。适用于Web开发、模块化设计等场景,助你写出更安全高效的OOP代码,值得收藏。

InstrIsle的博客 984

程序员基本功 07 面向对象的陷阱

1、instaceof运算符的陷阱 instanceof运算符的前一个操作数通常是一个引用类型的变量,后一个操作数通常是一个类,它用于判断前面的对象是否是后面的类或其子类、实现类的实例。 instanceof运算符有一个限制:要么与后面的类相同,要么是后面类的父类、要么是后面类型的子类。 使用null调用instanceof运算符时返回false时非常有用的行为,因为这可以保证第一个操作数所...

NEVERGUVEIP的博客 329
上一篇: 面向对象的陷阱——构造器的陷阱
下一篇: 面向对象的陷阱——native方法的陷阱
Never_Blue
博客等级 码龄10年 5粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值