Pfeffer 2017-08-03 11:20 采纳率: 50%
浏览 977
已采纳

关于equals的,实在是看不懂

class Cat {
int color, weight, height;

public Cat(int color, int weight, int height) {
this.color = color;
this.weight = weight;
this.height = height;
}

/**
* 这里是重写相等从Object类继承下来的equals()方法,改变这个方法默认的实现,
* 通过我们自己定义的实现来判断决定两个对象在逻辑上是否相等。
* 这里我们定义如果两只猫的color,weight,height都相同,
* 那么我们就认为这两只猫在逻辑上是一模一样的,即这两只猫是“相等”的。
*/
public boolean equals(Object obj){
if (obj==null){
return false;
}
else{
/**
* instanceof是对象运算符。
* 对象运算符用来测定一个对象是否属于某个指定类或指定的子类的实例。
* 对象运算符是一个组合单词instanceof。
* 该运算符是一个双目运算符,其左边的表达式是一个对象,右边的表达式是一个类,
* 如果左边的对象是右边的类创建的对象,则运算结果为true,否则为false。
*/
if (obj instanceof Cat){
Cat c = (Cat)obj;
if (c.color==this.color && c.weight==this.weight && c.height==this.height){
return true;
}
}
}
return false;
}
}

public static void main(String[] args) {
/**
* 这里使用构造方法Cat()在堆内存里面new出了两只猫,
* 这两只猫的color,weight,height都是一样的,
* 但c1和c2却永远不会相等,这是因为c1和c2分别为堆内存里面两只猫的引用对象,
* 里面装着可以找到这两只猫的地址,但由于两只猫在堆内存里面存储在两个不同的空间里面,
* 所以c1和c2分别装着不同的地址,因此c1和c2永远不会相等。
*/
Cat c1 = new Cat(1, 1, 1);
Cat c2 = new Cat(1, 1, 1);
System.out.println("c1==c2的结果是:"+(c1==c2));//false
System.out.println("c1.equals(c2)的结果是:"+c1.equals(c2));//true
}

------------------------------------------------------------------

问题:1.这个程序为什么要判断object obj为空指针呢,我完全不理解,因为明明没有实例化。2.这里的this的作用是什么呢
  • 写回答

2条回答 默认 最新

  • legendCoder 2017-08-04 01:03
    关注

    (1)首先判断object问题:equals方法是object类中的方法,他是判断两个对象是否是统一对象,这里对它进行了重写。
    这里的判空主要是:1.如果一个对象为空了,她就没有和其它对象比较的意义了 2.为空的时候,Cat c = (Cat)obj也会为空,下面获取成员变量的值也会报错。

    (2)c1.equals(c2)中用到的this主要是获取c1中各个成员变量的值。this代表c1(即调用equals方法的那个对象)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥100 求数学坐标画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站