Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在采用对象参数的Java方法中,如何访问仅存在于特定类实例中的字段?_Java_Object_Field - Fatal编程技术网

在采用对象参数的Java方法中,如何访问仅存在于特定类实例中的字段?

在采用对象参数的Java方法中,如何访问仅存在于特定类实例中的字段?,java,object,field,Java,Object,Field,-是的,这是一个关于被分配为家庭作业的问题,请求帮助。不,这不是我让你帮我做作业。截止日期是半小时前;我真的不能改变我的意见。你得相信我的话。继续 我知道测试对象类型是不必要的。当我在寻找“instanceof”的详细信息时,我发现了六条线索,其中人们的反应只是告诉原始海报,如果他们必须在处理之前进行测试以找出他们正在处理的对象类型,那么他们是在犯错误。是的,我知道,我愿意遵守惯例。不幸的是,我的教授要求我们重写我们定义的类的equals方法,并且特别需要一个对象类型参数。如果您看到我的代码,您

-是的,这是一个关于被分配为家庭作业的问题,请求帮助。不,这不是我让你帮我做作业。截止日期是半小时前;我真的不能改变我的意见。你得相信我的话。继续

我知道测试对象类型是不必要的。当我在寻找“instanceof”的详细信息时,我发现了六条线索,其中人们的反应只是告诉原始海报,如果他们必须在处理之前进行测试以找出他们正在处理的对象类型,那么他们是在犯错误。是的,我知道,我愿意遵守惯例。不幸的是,我的教授要求我们重写我们定义的类的equals方法,并且特别需要一个对象类型参数。如果您看到我的代码,您可能会更好地理解:

public boolean equals(Course other){
    if(!(other instanceof Course)){
        return false;
    } else if(other.name==this.name && other.days==this.days && 
        other.start==this.start && other.end==this.end){
        return true;
    }
    return false;
}
你也许能理解我的意图。“other”参数应该是对象类型,但如果我将其作为对象保留,并使用name/days/start/end字段,则程序会有一个合适的类型。如果我把它改成当然,它当然不会起任何双关语的作用,但那将是一种完全不同的方法。所需的行为是,除课程实例之外的所有对象使方法返回false,此外,课程实例之间的不匹配数据使其返回false


我很抱歉,对于所有熟悉Java的人来说,看到这样的问题会感到沮丧。

您可以将对象转换为课程:

Course course = (Course)object;

然后对课程对象进行所有比较。显然,在强制转换之前仍要执行instanceof check以避免ClassCastException。

您可以将对象强制转换为课程:

Course course = (Course)object;
然后对课程对象进行所有比较。显然,在强制转换之前仍要进行instanceof检查,以避免出现ClassCastException。

您正在尝试强制转换它:

你在试着投下它:

您的代码:

 public boolean equals(Course other){
     if(!(other instanceof Course)){  <-- other can only be Course here
          return false;
     } else if(other.name==this.name && other.days==this.days && 
         other.start==this.start && other.end==this.end){
         return true;
      }
     return false;
  }
您的代码:

 public boolean equals(Course other){
     if(!(other instanceof Course)){  <-- other can only be Course here
          return false;
     } else if(other.name==this.name && other.days==this.days && 
         other.start==this.start && other.end==this.end){
         return true;
      }
     return false;
  }

如果要重写equals方法,则应使用Object作为参数,因此必须检查对象的类型。通常,您自己的实现如下所示:

@Override
public boolean equals(Object obj) {
    if (obj == this)
        return true;  // object's references are identical
    else if (!(obj instanceof Course))
        return false;

    Course that = (Course) obj;
    return (this.name.equals(that.name)) && (this.days == that.days)
        && (this.start.equals(that.start)) && (this.end.equals(that.end));
}
当然,您也应该重写hashCode,使用相同的有效字段

相反,您使用自己的类型为Course的参数重载了该方法。因此,如果您调用myobject.equalsanotherObject,而另一个Object不属于类型,则永远不会调用equals方法,而是调用Objectequals方法,该方法仅执行以下操作:

重载equals方法还不够的原因是需要重载hashCode,因为hashCode不带参数,因此不能重载

如果您编写自己的布尔equalsObject实现,那么还必须实现int hashCode 这两种方法都应该为hashCode和equals使用相同的有效字段。 如果a.equalsb==true,则以下值也必须为true:a.hashCode==b.hashCode 如果a.hashCode!=b、 hashCode然后是a.equalsb==false 最后一点是您不应仅重载与您自己的类型相等的主要原因:

Course c1 = new Course("myname");
Course c2 = new Course("myname");
c1.equals(c2);                   // true
c1.hashCode() == c2.hashCode();  // false

如果要重写equals方法,则应使用Object作为参数,因此必须检查对象的类型。通常,您自己的实现如下所示:

@Override
public boolean equals(Object obj) {
    if (obj == this)
        return true;  // object's references are identical
    else if (!(obj instanceof Course))
        return false;

    Course that = (Course) obj;
    return (this.name.equals(that.name)) && (this.days == that.days)
        && (this.start.equals(that.start)) && (this.end.equals(that.end));
}
当然,您也应该重写hashCode,使用相同的有效字段

相反,您使用自己的类型为Course的参数重载了该方法。因此,如果您调用myobject.equalsanotherObject,而另一个Object不属于类型,则永远不会调用equals方法,而是调用Objectequals方法,该方法仅执行以下操作:

重载equals方法还不够的原因是需要重载hashCode,因为hashCode不带参数,因此不能重载

如果您编写自己的布尔equalsObject实现,那么还必须实现int hashCode 这两种方法都应该为hashCode和equals使用相同的有效字段。 如果a.equalsb==true,则以下值也必须为true:a.hashCode==b.hashCode 如果a.hashCode!=b、 hashCode然后是a.equalsb==false 最后一点是您不应仅重载与您自己的类型相等的主要原因:

Course c1 = new Course("myname");
Course c2 = new Course("myname");
c1.equals(c2);                   // true
c1.hashCode() == c2.hashCode();  // false

您可能应该在google上搜索重写object.equals java,这样您的赋值就不会有问题了。顺便说一下,这是一个非常好的家庭作业问题的例子。你可能想看看我很久以前写的一个问题。本质上,您必须将对象强制转换为您认为的类型,并在访问其属性之前检查转换是否有效。equals应将对象作为参数。请查收。这将有助于更好地理解这个概念。你可能应该在谷歌上搜索一下覆盖objec的内容
t、 等于java,您的作业就不会有问题了。顺便说一下,这是一个非常好的家庭作业问题的例子。你可能想看看我很久以前写的一个问题。本质上,您必须将对象强制转换为您认为的类型,并在访问其属性之前检查转换是否有效。equals应将对象作为参数。请查收。这将有助于更好地理解这个概念。如果操作数为null,instanceof运算符已经返回false,因此不需要进行null检查。如果操作数为null,instanceof运算符已经返回false,因此不需要进行null检查。