class C {
int i;
String j;
public C(int i, String j) {this.i = i; this.j = j;}
// #1
public boolean equals(Object o) {
if (null == o) return false;
if (o instanceof C) {
C c = (C) o;
return this.i == c.i && this.j.equals(c.j);
}
return false;
}
/* // #2
public boolean equals(C o) {
if (null == o) return false;
return this.i == o.i && this.j.equals(o.j);
} */
}
class Ce extends C {
int a;
public Ce(int i, String j, int a) {
super(i, j);
this.a = a;
}
/* // #3
public boolean equals(Object o) {
if (null == o) return false;
if (o instanceof Ce) {
Ce c = (Ce) o;
return this.i == c.i && this.j.equals(c.j) && this.a == c.a;
}
return false;
} */
/* // #4
public boolean equals(Ce o) {
if (null == o) return false;
return this.i == o.i && this.j.equals(o.j) && this.a = o.a;
} */
}
class Cn {
int i;
String j;
public Cn(int i, String j) {this.i = i; this.j = j;}
}
public class Test {
public static void main(String[] args) {
C o1 = new C(1, "o1");
Ce o2 = new Ce(1, "o1", 2);
Cn o3 = new Cn(1, "o1");
System.out.println(o1.equals(o2));
System.out.println(o2.equals(o1));
System.out.println(o1.equals(o3));
}
}
代码#1是马士兵讲重写 equals() 方法时的例程,我当时想按代码#2的方法重写equals方法是否同样成立而且跟简洁呢?因为类型检查的任务推给传参去完成了,#2的方法并不是重写Object类的方法,而是重载,当要比较的对象是本类及其子类实例时会调用这个方法,如果不是则会调用Object类的equals方法(比较引用是否相同,更严苛),这在初步实验中是没有问题的。
但是,当子类照类似的写法 #4 “重写”equals的时候,错误就出现了,原因仍是在于它是重载而非重写。子类重写的意图是不能与父类对象equals,但是#4的写法会在要比较父类对象时“意外地”调用父类的equals方法从而返回true。只有#1和#3的写法才能符合要求。
这条弯路的教训是:看似笨拙的逻辑其实较少歧义,比较健壮,不要一味追求“精巧”的优美,毕竟在实际应用之前测出一个反例是十分困难的。
分享到:
相关推荐
他的故事提醒我们,每个人都会遇到人生的弯路,有亲人陪伴是一种幸福,即使无人相伴,这些挫折也会成为人生宝贵的财富,值得我们珍视和从中汲取力量。 总的来说,这篇“初中语文文摘情感父爱让我把弯路拉直”讲述的...
通过学习和借鉴模板,可以避免在文书撰写上走弯路。 4. **高含金量中英文面试模板**:面试是保研过程中的一大挑战,尤其是英文面试,对于测试学生的语言能力和逻辑思维能力具有极高要求。这些模板可能包含了常见...
这篇文章虽然标题为“初中语文文摘文苑钟情那盆叶子花”,但其核心内容并非涉及具体的IT知识点,而是讲述了一段关于养护叶子花的生活经历和从中获得的人生感悟。不过,我们可以从这段故事中提取出一些与管理和成长...
教师的指导和学长的经验分享,能帮助新生快速适应大学学习模式,避免走弯路。自主学习和独立思考的能力尤其关键,这不仅体现在专业课程上,也包括对其他领域的探索。然而,时间管理是许多新生面临的挑战,容易因过度...
至少也是照猫画虎画了一段时间之后吧,我本人是在某一个领域画虎画了上万行代码的时候才慢慢有自己思路的。就像写作文,要有自己思路总是一般来说要经过几个阶段,首先学习词汇,然后学习造句,然后大量阅读别人的...
作者们通过分享自己的故事,强调了早期规划和反思的重要性,他们希望自己的经验和教训能帮助后来者避免一些弯路,更从容地面对职业生涯的起起伏伏。例如,书中提到如果在研一或更早的时候有前辈分享经验,可能会让...
作为初学者,正确地入门至关重要,避免走弯路和浪费时间。本文将提供一条有效的学习路径,帮助你顺利入门。 首先,不要急于求成。直接学习VC++可能会遇到困难,因为它涉及的知识面广泛,包括C++语言本身和Windows ...
创业培训不仅仅是理论知识的传授,还包括实战经验的分享,使创业者在实际运营中少走弯路。 此外,黄石市还实施了税收减免政策和小额贷款支持,降低了大学生创业的初期成本。这些财政援助措施为创业者提供了必要的...
在接下来的一段日子里,我将会结合电子工程师之家举办的主题周活动 写一点自己的想法。尽可能从实用的角度去讲述。希望能够帮助更多的初学者更上一层楼。而关于这个主 题周的最大主题我想了这样的一个名字“从单片机...
特别是向学长学姐请教,可以借鉴他们的经验,避免走弯路。即便只能与同班同学交流,也能从彼此的探讨中获益良多。 再者,面对困难要有勇于挑战的精神。复杂问题往往能激发深入研究的热情,但同时要注意保持良好的...
我们应该感谢老师的批评,因为它促使我们自我反思,避免走弯路。对于学习有困难的同学,老师的额外辅导更是无价的礼物。我们要通过努力学习,提高成绩,来表达对老师的感恩之情。 此外,感恩也是对身边所有人和事的...
2. **长沙湾道时装街**:深水埗区的长沙湾道时装街也是一个知名的批发中心,尤其是黄竹街至钦州街一段。这里不仅吸引本地批发商,还吸引了不少国内外游客,成为了一个具有本土特色的购物热点。 3. **恒福商业大厦**...
"真正快乐的人是那种走弯路时也不忘享受风景的人",这提醒我们即使面对困难,也要保持乐观的心态,欣赏生活中的美好。"把脾气拿出来,叫本能;把脾气压回去,叫本事",这教导我们在处理人际关系时要控制情绪,展现出...
5. 多和同事交流:通过与同事的交流,可以获取宝贵的社会经验和职场智慧,避免在成长过程中走弯路。 实习不仅是学习专业技能的过程,更是锻炼个人品质和社会技能的重要阶段。通过这次实习,作者认识到理论与实践相...
而假如你真的因为我的书而重新燃起实践的热情,从而开始一段操作系统旅程,我将会感到非常高兴。 不过我得坦白,在写作《自己动手写操作系统》的时候,我并不敢期待它能引起多少反响,一方面因为操作系统并不是时尚...
而假如你真的因为我的书而重新燃起实践的热情,从而开始一段操作系统旅程,我将会感到非常高兴。 不过我得坦白,在写作《自己动手写操作系统》的时候,我并不敢期待它能引起多少反响,一方面因为操作系统并不是时尚...
《六个为什么》是针对考研学子的重要参考资料,它深入剖析了六个关键问题,旨在帮助考生深化对学科理解,提升应试能力。...这份资料对于每一个考研学子来说,都是一份宝贵的指南,值得认真研读和实践。
通过阅读这个文件,我们可以了解到源代码的适用场景、依赖环境以及可能遇到的问题和解决方案,从而避免在学习过程中走弯路。 至于【明小子旁注源代码】这部分,我们可以期待看到的是一份包含丰富注释的代码库,可能...
在准备2020年妇产科主治医师考试的初期阶段,考生需要注意一系列关键的复习策略,以确保高效学习并避免走弯路。首先,理解考试的覆盖范围至关重要。妇产科主治医师考试的设计旨在全面考察考生的专业知识,因此,复习...