Java 物体的等同性?
问题: 创建一个具有两个字段的LandTract类:一个字段用于该地块的长度,另一个字段用于宽度。该类应该有一个返回域面积的方法,以及一个equals方法和一个toString方法。在一个程序中演示该类,该程序要求用户输入两块土地的尺寸。该程序应显示每一块土地的面积,并指出这些土地的大小是否相等 土地等级Java 物体的等同性?,java,object,Java,Object,问题: 创建一个具有两个字段的LandTract类:一个字段用于该地块的长度,另一个字段用于宽度。该类应该有一个返回域面积的方法,以及一个equals方法和一个toString方法。在一个程序中演示该类,该程序要求用户输入两块土地的尺寸。该程序应显示每一块土地的面积,并指出这些土地的大小是否相等 土地等级 public class LandTract { private double width, length; public LandTract(do
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));:-)很棒的地点,非常感谢你。我明白了。太好了,如果这有帮助的话,你可以接受我的答案