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

来源:9-9 Java 中的 Object 类 Ⅱ

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


写回答 关注

2回答

  • 丨阳光灬刺眼丿
    2016-01-17 21:13:34
    已采纳

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

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

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

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


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

    丨阳光灬刺眼... 回复_Jack_...

    楼上说的没错 这句话本身就是声明 格式如下: 类名 对象名=(欲强制转换类型) 待转换的对象 其实也可以理解为 类型 变量名;这种声明局部变量的格式,=号后面就是在声明的同时对其进行了初始化

    2016-01-19 21:22:59

    共 4 条回复 >

  • Mark1985
    2016-02-21 09:05:31

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

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



    _Jack_...

    非常感谢!!

    2016-02-21 23:02:08

    共 2 条回复 >

Java入门第二季 升级版

课程升级!以终为始告别枯燥,在开发和重构中体会Java面向对象编程的奥妙

530645 学习 · 6091 问题

查看课程

相似问题