在java中自定义toString()

时间:2013-03-25 12:34:22

标签: java

我正在学习使用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知识漏洞。

13 个答案:

答案 0 :(得分:7)

您的方法public String toString(Point3D p)不会覆盖Object.toString(),这是获取String Object表示的标准方法。

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

String s = "The point is " + pointObject;

将其实施为ay89建议:

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

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

答案 1 :(得分:5)

为什么不使用

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

然后您可以使用System.out.println(point)

答案 2 :(得分: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);

答案 3 :(得分:3)

好的,我自己做了 - 发布问题证明与我Rubber Ducking大致相同。

我需要添加另一种方法:

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

答案 4 :(得分:2)

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

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

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

答案 5 :(得分:1)

您只需使用this代替参数p即可。因此,请将方法更改为public String toString(),并将p更改为函数本身的this

答案 6 :(得分:0)

试试这个

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

答案 7 :(得分:0)

这应该解决它:

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

答案 8 :(得分:0)

这样做

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

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

答案 9 :(得分:0)

此代码:

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

输出这个:

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

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

此外,最近的编译器会自动使用StringBuilder优化此并置。

有关详细信息,请查看此post

我希望它有所帮助

答案 10 :(得分:0)

public String toString() {
    String result = this.x+ "," + this.y + "," + this.z;
    return result;      
}

使用上面的代码。

答案 11 :(得分:0)

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

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

答案 12 :(得分: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();
}