【问题标题】:Ap Computer Science Java Interfaces and Compare method dilemmaAp计算机科学Java接口和比较方法困境
【发布时间】:2014-05-26 23:59:28
【问题描述】:

我应该编写一个实现Locatable 接口的Cruiser 类。 Cruiser 将具有 x、y 和速度属性。 x、y 和速度是整数。您必须为 Cruiser 类提供 3 个构造函数。 Cruiser 类必须实现Locatable 接口。

一个构造函数必须是默认的。一个构造函数必须是仅 x 和 y 构造函数。一个构造函数必须是 x、y 和 speed 构造函数。您必须提供一个 equals 方法。 equals() 方法应该比较两个 Cruiser 对象的属性。您必须提供一个 toString() 方法。 toString() 应该返回 Cruiser 的 x、y 和速度。

当我编译它时它说“类 Cruiser 是公共的,应该在 Cruiser.java 中声明”

当我这样做时,我的 IDE 会显示“;”正如在公共布尔等于之后所预期的那样。但这没有意义,为什么您需要在方法中使用分号。

这就是我目前所拥有的

 public interface Locatable
 {
 public int getxPos();
 public int getyPos();
 }

 public class Cruiser implements Locatable
 {
 private int xPos, yPos, speed;
 public Cruiser()
 {
 xPos=yPos=speed=0;
 }

 public Cruiser(int x,int y)
 {
 xPos=x;
 yPos=y;
 speed=0;
 }

 public Cruiser(int x, int y, int spd)
 {
 xPos=x;
 yPos=y;
 speed=spd;
 }

 public int getxPos()
 {
 return xPos;
 }

 public int getyPos()
 {
 return yPos;
 }

 public int getSpeed()
 {
 return speed;
 }

 public void compare(Cruiser A, Cruiser B)
 {
 @Override
 public boolean equals(Object obj) 
 {
 if (obj instanceof Cruiser) {
    Cruiser cruiserToCompareTo = (Cruiser)obj;

    if(xPos == cruiserToCompareTo.getXpos() &&
            yPos == cruiserToCompareTo.getYpos() &&
            speed == cruiserToCompareTo.getSpeed())
        return true;            
}
return false;
}
public String toString()
{
String properties = "X position:"+ xPos+ ", Y position:"+yPos+ ",Speed:"+speed;
return properties;
}
} 
}

【问题讨论】:

  • 您能花时间正确对齐您的代码吗?这使我们更容易阅读。在 Eclipse 或 Netbeans 等 IDE 中,您只需单击几下即可完成此操作。

标签: java oop interface constructor compare


【解决方案1】:

这就是 equals 应该比较字段/属性的含义。

public boolean equals(Object obj) {
    if (obj instanceof Point) {
        Point pt = (Point)obj;
        return (x == pt.x) && (y == pt.y);
    }
    return super.equals(obj);
}

本例取自java.awt.Point
这是 Java 的内置类之一。
所以Point 有两个属性xy,并且
在其 equals 方法中,它正在比较它们。

另见:

java.awt.Point.equals

【讨论】:

  • 如何将您的建议纳入我的代码?你也知道如何实现一个接口吗?
  • 1) 从字面上或几乎从字面上结合它(想想你的案例的类比)。 2) 是的,我知道。
  • 这是实现接口的正确方法吗 public interface Locatable { public int getxPos();公共 int getyPos(); } 公共类 Cruiser 实现Locatable {
  • 是的。对我来说似乎是对的。 docs.oracle.com/javase/tutorial/java/IandI/usinginterface.html
  • 我刚刚更新了我的代码,你能检查一下并帮助我吗?它没有运行,当我编译它时它说“类 Cruiser 是公共的,应该在 Cruiser.java 中声明”但是当我创建一个名为 Cruiser.java 的新类并复制代码并将其粘贴到那里时它说“类可定位是public,应在 Locatable.java 中声明”。我不知道该怎么办了,请帮忙!
【解决方案2】:

你有一个带有 x,y,speed 属性的 Cruiser A,你有一个带有 x,y,speed 属性的 Cruiser B。如果 A.x == B.x, A.y == B.y, A.speed == B.speed 全部为真,则 Equals 应返回真。因此,当所有参数相等时,巡洋舰 A 和巡洋舰 B 相等。

编辑:以下代码应输入巡洋舰级

public int getSpeed() {
    return speed;
}

@Override
public boolean equals(Object obj) {
    if (obj instanceof Cruiser) {
        Cruiser cruiserToCompareTo = (Cruiser)obj;

        if(xPos == cruiserToCompareTo.getXpos() &&
                yPos == cruiserToCompareTo.getYpos() &&
                speed == cruiserToCompareTo.getSpeed())
            return true;            
    }
    return false;
}

请:更好地格式化你的代码,并且在 Cruiser-Class 中以与接口中相同的方式命名方法。

编辑 2:关于您的第二个问题: 您需要分离文件 Cruiser.java 和 Locatable.java。代码在这里运行良好

【讨论】:

  • 我该怎么写?我需要更改/删除我的比较方法吗?
  • 我会在每个文件中写什么?还是我只有两个名称不同的相同文件?
  • 我按照你说的做了,但是 Cruiser.java 文件不会运行,因为它说我需要公共 Cruiser() 中的分号。但是,public Cruiser() 是一个默认构造函数,那么为什么它需要一个分号呢?
猜你喜欢
  • 1970-01-01
  • 2014-06-20
  • 2016-06-27
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
相关资源
最近更新 更多