Java 物体的等同性?

Java 物体的等同性?,java,object,Java,Object,问题: 创建一个具有两个字段的LandTract类:一个字段用于该地块的长度,另一个字段用于宽度。该类应该有一个返回域面积的方法,以及一个equals方法和一个toString方法。在一个程序中演示该类,该程序要求用户输入两块土地的尺寸。该程序应显示每一块土地的面积,并指出这些土地的大小是否相等 土地等级 public class LandTract { private double width, length; public LandTract(do

问题:

创建一个具有两个字段的LandTract类:一个字段用于该地块的长度,另一个字段用于宽度。该类应该有一个返回域面积的方法,以及一个equals方法和一个toString方法。在一个程序中演示该类,该程序要求用户输入两块土地的尺寸。该程序应显示每一块土地的面积,并指出这些土地的大小是否相等

土地等级

public class LandTract {

    private double width,
            length;

    public LandTract(double width, double length) {
        this.width = width;
        this.length = length;
    }

    public double getLength() {
        return length;
    }

    public LandTract(double length) {
        this.length = length;
    }


    public double tractArea(double width, double length) {
        return width * length;

    }

    public String equal(LandTract zt, LandTract lt){

        String dec;
        if(zt.equals(lt)){
           dec ="yes";
        }else dec="NO";

        return dec;
    }

    public String toString(){
        return "Area is " + width*length;
    }

}
降级类

import java.util.Scanner;

public class DemoTract {

    public static void main(String[] args) {


        Scanner scan = new Scanner(System.in);

        System.out.println("Please Enter First Tract Width");
        double width=scan.nextDouble();
        System.out.println("Please Eter First Trach Length ?");
        double length=scan.nextDouble();

        LandTract  lt1 = new LandTract(width,length);

        System.out.println("Please Enter Secont Tract Width");
        double width2=scan.nextDouble();
        System.out.println("Please Enter Secoinf Tract Length");
        double length2 = scan.nextDouble();

        LandTract lt2 = new LandTract(width2,length2);

        System.out.println("First Tract " + lt1);
        System.out.println("Secon Tract "+ lt2);
        System.out.println(lt2.equal(lt1, lt2));






    }


}

object equal总是false,我怎么了?

为了正确检查对象的相等性,您需要覆盖
equals(object obj)
hashcode()
方法,从
java.lang.object
检查对象的相等性,如下所示:

public class LandTract {

    //add your existing code here

    @Override
    public boolean equals(Object object){

        boolean areObjectsEqual = false;

        if(object instanceof LandTract){
           LandTract landTract = (LandTract)object;
            //check the condition on how this & passed objects are equal
           if(this.width == landTract.width && this.length == landTract.length) {
             areObjectsEqual = true;
           } 
        } 
        return areObjectsEqual;
    }

    @Override
    public int hashCode() {
      return Double.valueOf(this.width+this.length).hashCode();
    }
}
System.out.println(lt1.equals(lt2));
main()
方法中,现在可以使用
equals()
方法检查两个
LandTrack
对象的相等性,如下所示:

public class LandTract {

    //add your existing code here

    @Override
    public boolean equals(Object object){

        boolean areObjectsEqual = false;

        if(object instanceof LandTract){
           LandTract landTract = (LandTract)object;
            //check the condition on how this & passed objects are equal
           if(this.width == landTract.width && this.length == landTract.length) {
             areObjectsEqual = true;
           } 
        } 
        return areObjectsEqual;
    }

    @Override
    public int hashCode() {
      return Double.valueOf(this.width+this.length).hashCode();
    }
}
System.out.println(lt1.equals(lt2));

这里更重要的一点是,当您使用<代码>双<代码> > <代码>宽度>代码>和<代码>长度>代码>时,您可能会面临四舍五入的问题(寻找更多的细节),如果您必须避免使用这些问题,您可能需要考虑使用。tractArea不应该接受任何参数:它应该返回陆地的面积。您的等效方法应该采用一个参数:它应该将地块(即

this
)与另一个地块进行比较。它应该返回一个布尔值,而不是字符串。最后,相等法的要点是将
地块的宽度和高度与其他地块的宽度和高度进行比较。equals()不会这样做(如果你是Averod并让它这样做的话,它会这样做)。
LandTract
需要覆盖
Object\equals(Object obj)
,它返回一个
布尔值。目前
zt.equals(lt)
正在使用
Object
.equals(…)
方法,该方法只是检查
LandTract
参考之间的相等性(不记得确切的术语)。你说的“相等大小”是什么意思?尺寸必须相同,还是仅限于面积?如果问题是检查面积是否相等,那么使用
equals
方法进行检查不是一种好的做法<仅当两个对象的所有公共可用特征(根据某些定义)相同,并且此处的长度是公共可用的时,code>equals
才应为真。在这里,我认为您只需要
zt.tractArea()==lt.tractArea()
,或者与epsilon比较以避免浮点精度问题。这个问题在很多方面都是错误的,但是我不能帮助评论-你的解决方案不太正确-如果this.width x this.length==landTract.width x landTract.length,那么区域可以是相同的,这并不意味着这两个对象上的属性值相同:-)另外,更改System.out.println(lt1.equals(lt1,lt2));to System.out.println(lt1.equals(lt2));:-)很棒的地点,非常感谢你。我明白了。太好了,如果这有帮助的话,你可以接受我的答案