Java参数传递本质是值传递,对象传引用副本;String/Integer涉及常量池与缓存机制;==与equals需防NPE并配合hashCode使用;重载由编译期决定,重写由运行期绑定且受返回值、异常、权限约束。

盯住“值传递”这个根本前提
Java只有值传递,没有引用传递——这是所有参数相关题的锚点。比如传对象时,实参传的是引用的副本,方法内让这个副本指向新对象(p = new Person("王五")),不影响原引用;但通过副本修改对象属性(p.name = "李四"),原对象会变。答错往往是因为混淆了“传的是什么”和“能改什么”。
String 和 Integer 不是普通类
它们带缓存和常量池机制,必须分场景回答:
- String s = new String("Java"):常量池已有"Java"→堆新建1个;没有→堆+常量池共2个
- Integer a = 127; Integer b = 127; a == b → true(缓存复用);但a = 128; b = 128 → false(新建对象)
== 和 equals() 的坑不在定义,在调用时机
不是“该用哪个”,而是“能不能用”:
- 对象可能为null,直接调
obj.equals(x)抛NPE;应写Objects.equals(obj, x) - 集合里查对象,只重写
equals()不重写hashCode(),HashSet.contains()会失效
重载和重写必须对比着记
不能只背“参数不同”或“方法名相同”。关键差异在:
立即学习“Java免费学习笔记(深入)”;
- 重载:编译期决定,只看参数类型/个数/顺序,返回值和异常无关
- 重写:运行期绑定,方法签名必须一致,且子类返回值范围≤父类、抛出异常范围≤父类、访问权限≥父类


















