_Jack_Han_
2016-01-17 17:19
public boolean equals(Object obj){ if(this==obj) return ture; if(obj==null) return false; if(getClass()!=obj.getClass()) return false; Dog other=(Dog) obj; if(age!=other.age) return false; return ture; } 这段代码看不懂,能帮我讲下吗?谢谢。 着重问题: 1、进行比较的后者是Dog dog,为什么要用Object obj呢? 2、第六行if(getClass()!=obj.getClass())第一个getClass()前面不用加this吗? 3、由getClass()确定为相同类型后,obj转换成Dog类,代码:Dog other=(Dog) obj;还需要用other来代替obj吗?那么创建Dog other对象的代码隐藏在哪里了呢? 4、第九行if(age!=other.age)前面一个age不用加this或者dog吗? 感谢解答!
刚看完教程 以下内容仅代表个人观点,不保证正确
问题1 equals()方法是所有类的共父类Object中的方法,要重载改方法需保持参数一致,Object中equals原型的参数就是Obeject,不能特化Dog,因为这里的方法是继承来的。
问题2 感觉和问题4是一个问题,this指针用于指向该类,之前的课程中有讲过,当发生属性名和构造函数的参数名重名时,使用“this.属性名=参数名”的方法进行初始化,这里this可以区别局部作用域的参数名。也就是说没有重名现象,写this是多余的
问题3 这个貌似和多态有关,c++里如果接触过的话会更好理解,基类指针可以指向派生类对象,举个例子:假如父亲有两个儿子,这里父亲是基类,儿子是派生类,“父亲”这一名词(不是对象名,是类名)可以代表某个儿子。
if(getClass()!=obj.getClass())只能证明obj类名和Dog类名相同,有可能涉及到多态(obj和Dog不是同一类,一个父亲一个儿子;或者两个都是儿子,老大,老二),所以要进行强制类型转化。
这段代码改为下边这样也是没问题的,这样容易理解:
public boolean equals(Dog obj) { if (this == obj) return true; if (obj == null) return false; if (this.getClass() != obj.getClass()) return false; /*Dog other = (Dog) obj; if (age != other.age) return false; return true;*/ if(age!=obj.age){ return false; }else{ return true; } }
Java入门第二季 升级版
530645 学习 · 6091 问题
相似问题