不是重写,而是重载;因为重写要求子类方法与父类方法签名完全一致,而将equals参数类型改为myclass导致签名变化,违反了object中public boolean equals(object obj)的约定,无法实现多态和契约保障。

不算,这是方法重载,不是重写。
为什么不是重写?
Java 中重写(override)要求子类方法与父类被重写方法的签名完全一致,包括方法名、参数列表(类型、个数、顺序)和返回类型。Object 类中 equals 的声明是:
public boolean equals(Object obj)如果你把参数类型写成 MyClass,例如:
public boolean equals(MyClass other)那么参数类型从 Object 变成了具体子类类型,方法签名已改变——JVM 会把它当作一个全新的、与父类无关的普通方法,即重载(overload)。编译器不会报错,但运行时调用 obj.equals(another) 时,若 obj 是 MyClass 实例,实际执行的仍是继承自 Object 的 equals(Object)(除非你同时保留了正确重写的版本),逻辑上等于没重写。
必须用 Object 作参数类型
这是强制要求,原因有三:
- 确保多态性:任何对象(如
String、Integer或其他子类实例)都能作为实参传入,满足泛型集合、框架等对equals的通用调用约定 - 避免隐式类型转换陷阱:用具体类型会导致子类调用时可能匹配到错误的重载版本,破坏对称性等契约
- 编译器可校验:加上
@Override注解后,如果参数不是,编译直接失败,帮你及早发现问题
正确写法的关键点
标准重写结构应包含以下步骤:
- 先用
if (this == obj) return true; 处理自反性与引用相同的情况 - 再用
if (obj == null) return false;满足非空性 - 用
if (!(obj instanceof MyClass)) return false;或if (getClass() != obj.getClass())判断类型(推荐instanceof,支持继承;若需严格同类比较则用getClass()) - 安全强转后,逐个比较关键字段(注意 null 安全、浮点数特殊处理、数组用
Arrays.equals等)
常见错误后果
若误用 MyClass 作参数:
-
new MyClass().equals(new Object())编译不通过(找不到匹配方法) -
HashMap、HashSet等容器无法识别你的“相等逻辑”,仍按地址比较,导致去重、查找失效 - 违反 equals 契约(如对称性),例如
a.equals(b)为 true,但b.equals(a)因类型不匹配而调用 Object 版本返回 false
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











