Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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 equals()覆盖帮助_Java_Equals_Overriding - Fatal编程技术网

需要基本java equals()覆盖帮助

需要基本java equals()覆盖帮助,java,equals,overriding,Java,Equals,Overriding,我目前正在用java编写一个简单的行程序。没有实际的GUI,因此它完全基于文本 我们需要有一个点类和一个线类,其中包括点对象 我遇到的问题涉及point类的equals方法。考虑到每个点只有两个正的int值,一个x和一个y,我在这里遇到了问题,我担心我在比较线条时会遇到问题,这涉及到比较点、int宽度和字符串颜色 这就是我的point类的equals方法的代码 @Override public boolean equals(Point that) { if(this==that)

我目前正在用java编写一个简单的行程序。没有实际的GUI,因此它完全基于文本

我们需要有一个点类和一个线类,其中包括点对象

我遇到的问题涉及point类的equals方法。考虑到每个点只有两个正的int值,一个x和一个y,我在这里遇到了问题,我担心我在比较线条时会遇到问题,这涉及到比较点、int宽度和字符串颜色

这就是我的point类的equals方法的代码

@Override
public boolean equals(Point that) {
    if(this==that)
        return true;
    //if
    if(this.x==that.getX() && this.y==that.getY())
        return true;
    return false;
}

任何帮助都将不胜感激。

签名需要包含对象,而不是点。然后,您需要进行明显的检查,以确保对象实际上是一个点,并且它是非空的

除此之外,正如你所说的,我认为这个方法没有任何问题,它是自反的,对称的,一致的,传递的。如果你的类使用了double,那么我会说在比较它们的时候加上一个delta值——但很明显,用int这不是问题


但间接的问题是,您确实应该重写hashcode,以便以相同的方式进行操作,否则在将点添加到使用
hashcode()
的集合时,您可能会遇到奇怪的问题(根据约定,他们应该以相同的方式比较对象)。

签名需要包含对象,不是重点。然后,您需要进行明显的检查,以确保对象实际上是一个点,并且它是非空的

除此之外,正如你所说的,我认为这个方法没有任何问题,它是自反的,对称的,一致的,传递的。如果你的类使用了double,那么我会说在比较它们的时候加上一个delta值——但很明显,用int这不是问题


但间接的问题是,您确实应该重写hashcode,以便以相同的方式进行操作,否则在将点添加到使用
hashcode()
的集合时,您可能会遇到奇怪的问题(根据约定,它们应该以相同的方式比较对象)。

对于一个简单的类,仅包含两个整数,以下hashCode和equals方法适用:

/*
 * (non-Javadoc)
 * 
 * @see java.lang.Object#hashCode()
 */
@Override
public int hashCode()
{
    final int prime = 31;
    int result = 1;
    result = prime * result + x;
    result = prime * result + y;
    return result;
}

/*
 * (non-Javadoc)
 * 
 * @see java.lang.Object#equals(java.lang.Object)
 */
@Override
public boolean equals(Object obj)
{
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Point other = (Point) obj;
    if (x != other.x)
        return false;
    if (y != other.y)
        return false;
    return true;
}

对于仅包含两个整数的简单类,以下hashCode和equals方法是合适的:

/*
 * (non-Javadoc)
 * 
 * @see java.lang.Object#hashCode()
 */
@Override
public int hashCode()
{
    final int prime = 31;
    int result = 1;
    result = prime * result + x;
    result = prime * result + y;
    return result;
}

/*
 * (non-Javadoc)
 * 
 * @see java.lang.Object#equals(java.lang.Object)
 */
@Override
public boolean equals(Object obj)
{
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Point other = (Point) obj;
    if (x != other.x)
        return false;
    if (y != other.y)
        return false;
    return true;
}

你展示了Line类的equals方法,但我认为一条线不能等于一个点。直线可以包含一个点。你是说点等于方法吗?

你展示了Line类等于方法,但我认为一条线不能等于一个点。直线可以包含一个点。你是说Point equals方法吗?

你的问题似乎是关于性能和Object.equals()方法。您应该阅读以下内容:


您的类应该重写hashCode()方法。

您的问题似乎与性能和Object.equals()方法有关。您应该阅读以下内容:


您的类应该重写hashCode()方法。

查看Object.equals()方法的定义。特别要注意参数的类型。equals()的任何重写必须具有对象参数

public boolean equals(Object that) { ... }

请看Object.equals()方法的定义。特别要注意参数的类型。equals()的任何重写必须具有对象参数

public boolean equals(Object that) { ... }
让我试试这个:

@Override
public boolean equals(Object o) 
{
    //Cast the object o to Point instance
    if(!(o instanceof Point))
        return false;
    Point obj = (Point)o;
    if(obj==null)
        return false;//Checking if null
    else if.....//test properties using cast object obj
}
让我试试这个:

@Override
public boolean equals(Object o) 
{
    //Cast the object o to Point instance
    if(!(o instanceof Point))
        return false;
    Point obj = (Point)o;
    if(obj==null)
        return false;//Checking if null
    else if.....//test properties using cast object obj
}

问题到底是什么?另外,该代码显然来自Point类,而不是Line类。我不明白您的问题是什么,实际上…
.equals()
接受一个对象。您需要确保对象不是空的,并且类型正确。很抱歉,它的措辞太糟糕了。我想我已经把一切都搞定了。问题到底是什么?另外,该代码显然来自Point类,而不是Line类。我不明白您的问题是什么,实际上…
.equals()
接受一个对象。您需要确保对象不是空的,并且类型正确。很抱歉,它的措辞太糟糕了。我想我已经把一切都安排好了。谢谢你。我想知道为什么IDE告诉我它不是覆盖等式。另一件我不明白的事情是如何/为什么需要/编辑hashcode。没问题-请参阅此处以获得深入的解释:如果要比较的对象为null,则问题中的方法将抛出null指针异常。一定要检查空值。谢谢。我想知道为什么IDE告诉我它不是覆盖等式。另一件我不明白的事情是如何/为什么需要/编辑hashcode。没问题-请参阅此处以获得深入的解释:如果要比较的对象为null,则问题中的方法将抛出null指针异常。确保检查是否为空。重载?你是说超负荷?超负荷?你是说超控吗?