当前位置: 首页 > news >正文

Java参数传递与类型差异详解

  1. 基本类型传递的是数值本身的拷贝
  2. 引用类型传递的是引用地址值的拷贝
  3. 可修改对象属性,不可修改原引用指向

记忆口诀:Java 参数只有值传递


问:为什么修改引用类型属性会影响原对象?

答:

  1. 引用类型传递的是地址值的拷贝
  2. 拷贝地址与原地址指向同一个堆对象
  3. 通过地址修改对象属性,原对象可见
  4. 仅修改地址指向,不会影响原变量

记忆口诀:同地址改属性同生效


问:修改方法内的引用为何不影响原变量?

答:

  1. 方法内引用是原地址的拷贝副本
  2. 修改副本指向,仅改变副本存储值
  3. 原变量的地址值未发生任何修改
  4. 二者是独立变量,指向互不干扰

记忆口诀:改副本不影响原引用

问:什么是 Java 的序列化,如何实现 Java 的序列化?

答:

  1. 序列化是对象转字节流,用于存储与传输
  2. 反序列化可将字节流还原为 Java 对象
  3. 实现 Serializable 标记接口即可支持序列化
  4. 由 Java 原生机制自动完成序列化处理

记忆口诀:对象转流序列化,实现 Serializable


问:Java 序列化中 serialVersionUID 的核心作用是什么?

答:

  1. 作为序列化类的版本唯一校验标识
  2. 序列化与反序列化版本必须一致
  3. 版本不一致会抛出反序列化异常
  4. 显式声明可避免自动生成的版本差异

记忆口诀:版本校验 serialVersionUID


问:类不实现 Serializable 接口会有什么问题?

答:

  1. 序列化时抛出 NotSerializableException
  2. 该类对象无法完成序列化与反序列化
  3. 无法实现对象持久化与网络传输

记忆口诀:无接口无法序列化

问:Java 中的反射是什么意思?

答:

  1. 反射是 Java 运行时的动态操作机制
  2. 运行时可获取任意类的所有结构信息
  3. 可动态调用对象方法、修改属性值
  4. 无需编译期预先知晓类的完整信息

记忆口诀:运行时动态操控类


问:Java 反射获取 Class 对象有哪几种方式?

答:

  1. Class.forName (),传入类全限定名
  2. 类名.class,直接获取类 Class 对象
  3. 实例对象.getClass (),继承自 Object 类

记忆口诀:三法获取 Class 对象


问:反射中 getXxx 与 getDeclaredXxx 的核心区别?

答:

  1. getXxx 仅获取 public 修饰的成员
  2. getDeclaredXxx 获取本类所有成员
  3. getXxx 包含父类的 public 成员
  4. getDeclaredXxx 仅获取当前类成员

记忆口诀:public 用 get,全量 Declared

问:反射的应用场景有哪些?反射有什么优缺点?

答:

  1. Spring、MyBatis 等框架底层核心依赖
  2. JDBC 驱动加载、配置文件解析与 Bean 装载
  3. 优点:运行时动态扩展,程序灵活度高
  4. 缺点:有性能损耗,存在权限安全风险

记忆口诀:框架核心用反射,灵活有风险


问:反射在 Java 框架中的核心作用是什么?

答:

  1. 无需硬编码,动态加载类并实例化对象
  2. 解析配置,自动完成对象属性注入
  3. 实现动态代理、注解解析等高级功能

记忆口诀:框架靠反射提灵活度


问:日常开发为什么不推荐滥用反射?

答:

  1. 反射调用性能远低于普通直接调用
  2. 可绕过权限检查,破坏代码封装性
  3. 编译期无法校验,运行期易出异常

记忆口诀:滥用反射有隐患

问:怎么实现 Java 动态代理?

答:

  1. 主流实现分为 JDK Proxy 和 CGLIB 两种
  2. JDK Proxy 基于接口,依赖 Java 反射机制
  3. CGLIB 基于继承,直接操作字节码生成
  4. 核心是运行时生成代理,扩展目标方法

记忆口诀:JDK 接口 CGLIB 继承


问:JDK Proxy 与 CGLIB 动态代理的核心区别是什么?

答:

  1. JDK 仅能代理实现了接口的类
  2. CGLIB 可代理无接口的普通类
  3. JDK 基于反射,CGLIB 操作字节码
  4. JDK 无额外依赖,CGLIB 需第三方包

记忆口诀:接口 JDK,无接口 CGLIB


问:JDK 动态代理的核心实现步骤是什么?

答:

  1. 定义目标业务接口与实现类
  2. 实现 InvocationHandler,编写增强逻辑
  3. 用 Proxy.newProxyInstance 生成代理对象
  4. 代理对象调用方法,触发增强逻辑

记忆口诀:接口 Handler 生成代理

问:String 为什么要设计为不可变类?

答:

  1. 支持字符串池共享,节省内存提升性能
  2. 天然线程安全,无需额外同步处理
  3. 哈希值可缓存,优化哈希容器性能
  4. 保障数据安全,避免状态被恶意篡改

记忆口诀:不可变安全高效省内存


问:String 的不可变性是如何实现的?

答:

  1. String 类被 final 修饰,无法被继承
  2. 底层 value 数组为 private final 修饰
  3. 无对外修改 value 的公共方法
  4. 内容修改均返回新 String 对象

记忆口诀:final 封装保不可变


问:String 是绝对不可变的吗?

答:

  1. 常规语法层面 String 是不可变的
  2. 可通过反射修改底层 value 数组
  3. 反射修改破坏封装,不推荐使用

记忆口诀:反射可破 String 不可变

问:String、StringBuilder、StringBuffer 的区别是什么?

答:

  1. String 不可变,修改新建对象,后两者可变
  2. String、StringBuffer 线程安全,Builder 非安全
  3. 性能:StringBuilder > StringBuffer > String
  4. 适用场景不同,按需选择对应实现类

记忆口诀:可变安全性能分三类


问:不同业务场景如何选择这三个字符串类?

答:

  1. 少量固定字符串操作,直接使用 String
  2. 单线程频繁拼接,优先选 StringBuilder
  3. 多线程并发操作,必须用 StringBuffer

记忆口诀:单 Builder 多 Buffer 少 String


问:StringBuffer 和 StringBuilder 的核心区别是什么?

答:

  1. StringBuffer 方法加同步锁,线程安全
  2. StringBuilder 无同步处理,非线程安全
  3. 单线程场景下 Builder 性能更优

记忆口诀:Buffer 安全,Builder 更快

问:String str = "i" 与 String str = new String ("i") 一样吗?

答:

  1. 二者不一样,内存分配方式完全不同
  2. 字面量赋值,对象分配在字符串常量池
  3. new String 创建,对象分配在堆内存中
  4. 二者引用地址不同,== 比较结果为 false

记忆口诀:字面量常量池,new 在堆内存


问:为什么相同字面量赋值的 String 用 == 比较为 true?

答:

  1. 字面量赋值优先复用常量池已有对象
  2. 相同字面量共享常量池同一内存地址
  3. 引用地址一致,== 比较结果为 true

记忆口诀:常量池复用同地址


问:日常开发推荐哪种 String 赋值方式?

答:

  1. 优先使用字面量直接赋值的方式
  2. 可复用常量池对象,节省内存开销
  3. 避免 new String 创建多余临时对象

记忆口诀:优先字面量赋值

问:接口和抽象类有什么区别?

答:

  1. 定义关键字:接口用 interface,抽象类用 abstract
  2. 实现关键字:接口 implements,抽象类 extends
  3. 继承规则:单继承抽象类,可多实现接口
  4. 成员修饰符:接口仅 public,抽象类无限制

记忆口诀:接口多实现,抽象单继承


问:接口和抽象类的成员约束有什么不同?

答:

  1. 接口属性默认 public static final,不可修改
  2. 接口方法默认 public abstract,仅定义规范
  3. 抽象类成员修饰符无强制限制
  4. 抽象类可包含带实现的普通方法

记忆口诀:接口限 public,抽象无限制


问:开发中如何选择接口与抽象类?

答:

  1. 定义行为契约规范,优先使用接口
  2. 提取公共代码复用,优先用抽象类
  3. 需多行为扩展,使用接口多实现
  4. 模板方法场景,优先使用抽象类

记忆口诀:契约接口,复用抽象类

http://www.jsqmd.com/news/545911/

相关文章:

  • Uvicorn与Couchbase Analytics Service集成:构建高性能数据分析API的终极指南
  • 实战应用指南:基于快马平台构建可部署的期刊登录系统,即拿即用
  • 终极UEFI固件更新自动化工具:批量更新与管理系统完整指南
  • Java字符串算法终极指南:35种文本处理核心技术详解
  • 终极代码质量保障:freeCodeCamp项目的自动化检测体系解析
  • Elsevier Tracker:科研投稿进度监控的终极浏览器扩展解决方案
  • 3步释放华硕笔记本潜能:G-Helper轻量化控制工具的极致优化指南
  • Foobar2000歌词插件高效配置指南:实现歌词精准匹配与逐字同步
  • 大厂速报:小红书期权涨麻,字节年终暴击,AI赛道卷疯了
  • 如何高效使用PPTist:打造专业演示文稿的实用指南
  • OpCore Simplify:终极指南!让黑苹果配置从8小时缩短到45分钟的自动化神器
  • 3步解锁语音转文字效率工具:免费神器AsrTools让音频处理效率提升10倍
  • SWF逆向工程认证培训师手册:基于JPEXS Free Flash Decompiler的教学指南
  • OpenClaw操作录制功能:基于百川2-13B-4bits实现人类示范学习
  • UEFI网络驱动测试自动化:完整测试脚本示例与实践指南
  • 终极指南:如何用Gemini CLI验证色彩一致性
  • 告别混乱依赖:图解Go-Kratos中的依赖注入(Wire)是如何让微服务代码更清爽的
  • OpenClaw压力测试:Qwen3.5-9B在持续任务中的稳定性优化
  • 用快马AI快速原型设计:9·1免费素材库管理界面十分钟搭建指南
  • 【JavaWeb开发】从零构建前后端交互实战指南
  • 每日算法题 17---205.同构字符串
  • 一文读懂大模型,彻底告别 AI 焦虑 | 零门槛
  • NaViL-9B实战教程:用Python requests封装图文问答API调用函数
  • 终极指南:如何使用 !important 高效覆盖 BootstrapBlazor 组件样式
  • python基于微信小程序的家政服务与互助平台
  • 【Acadrust】Rust 语言的高性能 CAD 库
  • 使用UI-TARS-desktop实现跨应用数据同步:ERP与CRM系统集成
  • Flowable 7.x 实战:手把手教你从数据库里捞出BPMN2.0 XML并优雅展示(Vue3 + Spring Boot)
  • 3 月小结
  • Win10下mitie安装失败:subprocess.CalledProcessError的深度排查与实战修复