2017-04-08 42 views
-1

问题:等于的对象?

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

LandTract类

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

} 

DemoTract类

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






    } 


} 

对象等于永远是假的,有什么不对吗?

+1

另外,tractArea不应该采取任何说法:它应该返回LandTract的区域。你的平等方法应该只有一个参数:它应该比较LandTract(即'this')与另一个。它应该返回一个布尔值,而不是一个字符串。最后,平等方法的要点是将'this'的宽度和高度与其他LandTract的宽度和高度进行比较。 equals()不会这样做(嗯,如果你是averrode,那么它会这样做)。 –

+1

'LandTract'需要重写'Object#equals(Object obj)',它返回'boolean'。目前'zt.equals(lt)'使用'Object'的'.equals(...)'方法,它只是检查'LandTract' *引用*(不记得确切的词)之间的相等性。 –

+0

你是什么意思“同等大小”?尺寸必须相同,还是只有区域?如果问题是检查这些区域是否相等,那么使用“equals”方法是不好的做法。只有当两个对象的所有公共可用特性(通过某种定义)相同时,“equals”才是真实的,并且这里的长度是公开可用的。在这里,我想你只需要'zt.tractArea()== lt.tractArea()',或者可以与一个epsilon进行比较以避免浮点精度问题。 – ajb

回答

1

为了正确检查对象的平等,你需要重写从java.lang.Objectequals(Object obj)hashcode()方法来检查对象的平等,如下图所示:

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

在你main()方法,您现在可以检查的平等使用这两种方法equals()LandTrack对象如下图所示:

System.out.println(lt1.equals(lt2)); 

一个更重要的这里的一点是,当你正在使用doublewidthlength,您可能会遇到舍入问题(有关更多详细信息,请参阅here),如果必须避免这些问题,则可能需要考虑使用BigDecimal

+0

这个问题在很多方面都是错误的,但我不禁要发表评论 - 你的解决方案不是很正确 - 如果这个区域可以是相同的话。this.width x this.length == landTract.width x landTract.length which并不意味着这两个对象具有相同的值:-) – D00de

+0

另外,更改System.out.println(lt1.equals(lt1,lt2));到System.out.println(lt1.equals(lt2)); :-) – D00de

+0

很棒的地方,更新了 – developer