Java中如何在类方法内访问调用该方法的对象(如c1.equals(c2)中的c1)
Combination类的equals与toString方法修正及问题解答
核心知识点
在类的实例方法中,调用方法的当前对象(比如c1.equals(c2)里的c1)可以直接访问自身成员变量,或用this关键字明确指代。例如直接写code等价于this.code,都指向当前对象的code数组。
修正后的完整代码
public class Combination { private int[] code; // 构造器:先初始化数组再赋值,避免空指针异常 public Combination(int first, int second, int third) { code = new int[3]; code[0] = first; code[1] = second; code[2] = third; } // 重写equals方法,符合Java规范 @Override public boolean equals(Object obj) { // 判断是否为同一个对象 if (this == obj) { return true; } // 处理null和类型不匹配的情况 if (obj == null || getClass() != obj.getClass()) { return false; } // 类型转换后比较数组内容 Combination other = (Combination) obj; return code[0] == other.code[0] && code[1] == other.code[1] && code[2] == other.code[2]; } // 重写toString方法 @Override public String toString() { return code[0] + ":" + code[1] + ":" + code[2]; } }
关键错误修复说明
构造器空指针问题
原代码未初始化code数组,直接给code[0]赋值会触发NullPointerException,必须先执行code = new int[3];创建数组实例。equals方法的正确实现
- 参数类型需为
Object:原方法参数是Combination,属于重载而非重写Object类的equals,不符合Java规范,需改为Object obj并添加@Override注解。 - 当前对象访问:
this指代调用方法的对象(如c1.equals(c2)中的c1),this == obj可快速判断是否为同一对象。 - 数组内容比较:数组是引用类型,
==比较内存地址,需逐个对比元素内容(若数组长度不固定,可使用Arrays.equals(code, other.code)简化)。
- 参数类型需为
toString方法的递归问题
原代码错误递归调用toString()会导致栈溢出,直接访问当前对象的code数组元素拼接字符串即可。
内容的提问来源于stack exchange,提问作者antoine boucher
相关产品推荐
相关产品推荐

