为了账号安全,请及时绑定邮箱和手机立即绑定

请哪位高手来帮我详细讲解一下视频里的equals()方法体,谢谢。

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吗?
  感谢解答!


正在回答

2 回答

刚看完教程  以下内容仅代表个人观点,不保证正确

问题1  equals()方法是所有类的共父类Object中的方法,要重载改方法需保持参数一致,Object中equals原型的参数就是Obeject,不能特化Dog,因为这里的方法是继承来的。

问题2  感觉和问题4是一个问题,this指针用于指向该类,之前的课程中有讲过,当发生属性名和构造函数的参数名重名时,使用“this.属性名=参数名”的方法进行初始化,这里this可以区别局部作用域的参数名。也就是说没有重名现象,写this是多余的

问题3  这个貌似和多态有关,c++里如果接触过的话会更好理解,基类指针可以指向派生类对象,举个例子:假如父亲有两个儿子,这里父亲是基类,儿子是派生类,“父亲”这一名词(不是对象名,是类名)可以代表某个儿子。


if(getClass()!=obj.getClass())只能证明obj类名和Dog类名相同,有可能涉及到多态(obj和Dog不是同一类,一个父亲一个儿子;或者两个都是儿子,老大,老二),所以要进行强制类型转化。

0 回复 有任何疑惑可以回复我~
#1

_Jack_Han_ 提问者

非常感谢!
2016-01-18 回复 有任何疑惑可以回复我~
#2

_Jack_Han_ 提问者

Dog other=(Dog)obj; other对象在哪里声明的呢?
2016-01-18 回复 有任何疑惑可以回复我~
#3

迷之葱二 回复 _Jack_Han_ 提问者

这句话本身就是声明啊
2016-01-19 回复 有任何疑惑可以回复我~
#4

丨阳光灬刺眼丿 回复 _Jack_Han_ 提问者

楼上说的没错 这句话本身就是声明 格式如下: 类名 对象名=(欲强制转换类型) 待转换的对象 其实也可以理解为 类型 变量名;这种声明局部变量的格式,=号后面就是在声明的同时对其进行了初始化
2016-01-19 回复 有任何疑惑可以回复我~
查看1条回复

这段代码改为下边这样也是没问题的,这样容易理解:

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;
		}
	}



0 回复 有任何疑惑可以回复我~
#1

_Jack_Han_ 提问者

非常感谢!
2016-02-21 回复 有任何疑惑可以回复我~
#2

_Jack_Han_ 提问者

非常感谢!!
2016-02-21 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

请哪位高手来帮我详细讲解一下视频里的equals()方法体,谢谢。

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信