X
Java后端
·07-21 21:08
Day 103 ✅ 今天做了: 1. 背单词√ 2. 面试题:√ 3. 智能云图库-团队空间管理 总结: 单词复习: 认识:61,模糊:33,忘记:16,顽固:2 问题: 匿名内部类与普通内部类的区别:匿名内部类只能在定义处一次性使用,没办法复用,因为匿名内部类无构造方法,无类名导致的。 匿名内部类没有构造方法也没有可以替代的方法:使用实例初始化块在对象创建时完成字段赋值与初始化逻辑 匿名内部类访问局部变量:要求局部变量为final或事实上是final,因为局部变量在栈中,当用完后会被销毁,但内部类是在堆中,可能内部类还存在,为了能继续引用,JVM 在编译期将变量值拷贝进内部类,并在字节码层面添加合成字段持有该副本。若变量可变,则副本与原始值可能不一致,破坏闭包语义。 什么情况下只能用匿名内部类而无法用 Lambda 表达式?需继承类(含抽象类)、实现多抽象方法接口、内部需定义实例字段或多个方法,或对 this 指向自身实例有强依赖。因为 Lambda 只能针对单抽象方法接口且无状态,this 指向外部类,无法满足这些结构与语义需求。 同一类被不同加载器加载会造成什么问题?同一类被不同类加载器加载会导致JVM视为两个不同类,引发类型不匹配、ClassCastException及逻辑错误。双亲委派模型通过统一委派至父加载器避免此问题,确保类全局唯一性与核心库安全。 Tomcat如何实现不同Web应用间的类库隔离?Tomcat通过为每个Web应用创建独立的WebAppClassLoader,并重写loadCla ss()方法打破Java双亲委派模型,实现类库隔离。其核心是先自加载再委派,让不同应用可各自使用私有版本的依赖,避免版本冲突。 非静态内部类为何不能定义非 final 的静态成员?因为其内部类实例天然绑定外部类实例,而静态成员属于类、与实例无关,两者在设计语义上冲突。Java 为避免“既属类又属实例”的逻辑混乱,直接禁止此类定义,仅允许 static final 编译时常量。仅 static final 编译时常量被允许,因其值在编译期确定并可内联,不触发运行时类加载/初始化矛盾,避免了语义与实现上的不一致。 创建非静态内部类实例时必须依赖外部类实例的原因是什么?非静态内部类对象隐式持有外部类实例引用,创建时必须通过 outerInstance.new Inner(),生命周期与外部实例绑定。
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP