3

我正在学习使用 Michael Ernest 的“Java SE7 Programming Essentials”一书进行 java OCA 测试。这是我对以下问题的答案之一的代码:

public class Point3D {
    int x, y, z;

    public void setX(int x) {
        this.x = x;
    }

    public int getX() {
        return this.x;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getY() {
        return this.y;
    }

    public void setZ(int z) {
        this.z = z;
    }

    public int getZ() {
        return this.z;
    }

    public String toString(Point3D p) {
        String result = p.getX() + "," + p.getY() + "," + p.getZ();
        return result;
    }

    public static void main(String args[]) {
        Point3D point = new Point3D();
        point.setX(5);
        point.setY(12);
        point.setZ(13);
        System.out.println(point.toString(point));
    }
}

我的代码有效,但在最后一行,我认为我的代码以一种奇怪的方式制作,难道不应该有一种方法来制作point.toString()而不是point.toString(point)返回该点的字符串表示形式吗?谁能向我解释如何解决它?

我确定这是一个简单的答案,只是试图理解它,因为我怀疑它指向我的 Java 知识中的一个漏洞。

4

13 回答 13

8

您的方法public String toString(Point3D p)不是重写的,这是Object.toString()获取.StringObject

重写它的要点是允许 的任何子类Object将对象的适当表示形式提供为String. Java API 在很多情况下都使用这种方法,主要是在需要将 anObject转换为 aString时(例如在做System.out.println(object),或执行字符串连接时:

String s = "The point is " + pointObject;

按照ay89的建议实施它:

@Override
public String toString() { 
    String result = getX() + "," + getY() + "," + getZ(); 
    return result;
} 

请注意注解的使用@Override。如果你在你的方法中使用它,编译器会警告你它的定义有问题。

于 2013-03-25T12:37:32.073 回答
5

你为什么不使用

public String toString() {
    String result = getX() + "," + getY() + "," + getZ();
    return result;      
}

那么你可以使用System.out.println(point)

于 2013-03-25T12:36:08.660 回答
3

为了清楚起见,我将使用String.format而不是串联:

public String toString() {
    return String.format("(%d, %d, %d)", x, y, z);      
}

使用此方法,您可以更改输出的外观,而无需代码读者进行太多“心理重建”。例如,如果您决定将输出更改为,例如,{x=1, y=2, z=3}您可以简单地重写格式行,如下所示:

return String.format("{x=%d, y=%d, z=%d}", x, y, z);
于 2013-03-25T12:39:11.170 回答
3

好的,我自己解决了这个问题 - 事实证明,发布这个问题与我的橡胶闪避非常相似。

我需要添加另一种方法:

public String toString() {
    String result = this.getX() + "," + this.getY() + "," + this.getZ();
    return result;      
}
于 2013-03-25T12:39:14.973 回答
2

您需要覆盖 toString() 方法。Java 中的所有对象都有一个 toString 方法(它是 Object 类的一个方法)。

默认的 Object 实现只返回该对象的 hashCode (因此,如果您不覆盖它,这也是您将得到的),但如果您覆盖,您可以对特定于您的对象的数据做一些更有意义的事情。

@Override  
public String toString() {
   return this.getX() + "," + this.getY() + "," + this.getZ(); 
}
于 2013-03-25T12:36:50.883 回答
1

您可以简单地使用this代替参数p。因此,将您的方法public String toString()更改pthis并将函数本身更改为。

于 2013-03-25T12:36:38.583 回答
0

对于覆盖/实现的方法,请使用@Override注释,这会给您错误参数化的 toString 错误。

此外,在 toString 中不使用 getter 更有意义。

在 println 或 String 连接中, Object.toString 被自动调用,不要显式调用它(以表明你知道这一点)。

@Override
public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("Point3D(").append(x).append(", ")
        .append(y).append(", ").append(z).append(")";
    return sb.toString();
}
于 2013-03-25T12:40:30.407 回答
0

你的toString方法应该是public String toString()[没有任何参数],这意味着从 Object 类中重写

如果你这样做,你可以这样做:System.out.println(point);

于 2013-03-25T12:39:00.380 回答
0

尝试这个

public String toString() {
    String result = this.getX() + "," + this.getY() + "," + this.getZ();
    return result;
}
于 2013-03-25T12:36:51.747 回答
0

这应该解决它:

public String toString() {
String result = this.getX() + "," + this.getY() + "," + this.getZ();
return result;      
}
于 2013-03-25T12:37:19.707 回答
0

这样做

 public String toString() {
        String result = this.getX() + "," + this.getY() + "," + this.getZ();
        return result;
    }

是对调用对象的内部引用(在您的情况下为点),因此使用它将使对参数点的需要无效

于 2013-03-25T12:37:33.707 回答
0

这段代码:

@Override
public String toString() {
    return "{ x: " + x + ", y: " + y + ", z: " + z + " }";
}

会输出这个:

{ x: 13, y: 2, z: 10 }

当您的 get 方法返回属性时,通过直接使用属性,您可以节省方法调用。

此外,最近的编译器将自动优化这种连接StringBuilder

有关更多信息,请查看此帖子

我希望它有帮助

于 2013-03-25T12:37:54.467 回答
0
public String toString() {
    String result = this.x+ "," + this.y + "," + this.z;
    return result;      
}

使用上面的代码。

于 2013-03-25T12:38:37.980 回答