Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的自定义toString()_Java - Fatal编程技术网

java中的自定义toString()

java中的自定义toString(),java,Java,我正在学习使用MichaelErnest的《JavaSE7编程要领》一书进行JavaOCA测试。这是我对以下问题的答案之一的代码: 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) {

我正在学习使用MichaelErnest的《JavaSE7编程要领》一书进行JavaOCA测试。这是我对以下问题的答案之一的代码:

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知识的一个漏洞。

为什么不使用

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

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

您只需使用
this
而不是参数
p
。因此,将您的方法更改为
公共字符串toString()
,并将函数本身中的
p
更改为
this

您需要重写toString()方法。 Java中的所有对象都有一个toString方法(它是对象类上的一个方法)

默认对象实现只返回该对象的hashCode(因此,如果不重写它,也会得到它),但如果重写,则可以对特定于对象的数据执行更有意义的操作

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

public String toString() {
    String result = this.getX() + "," + this.getY() + "," + this.getZ();
    return result;
}
这应该可以解决这个问题:

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

您的方法
publicstringtostring(Point3D p)
未被重写,这是获取
对象的
字符串
表示的标准方法

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

String s=“点是”+pointObject;

按照ay89的建议实施:

@Override
public String toString() { 
    String result = getX() + "," + getY() + "," + getZ(); 
    return result;
} 
请注意注释的用法。如果您在方法上使用它,编译器会警告您其定义有问题。

请这样做

 public String toString() {
        String result = this.getX() + "," + this.getY() + "," + this.getZ();
        return result;
    }
是调用对象的内部引用(在您的案例中为点),因此使用它将使对参数点的需要无效

此代码:

@Override
public String toString() {
    return "{ x: " + x + ", y: " + y + ", z: " + z + " }";
}
将输出以下内容:

{ x: 13, y: 2, z: 10 }
当get方法返回属性时,通过直接使用属性,可以避免方法调用

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

有关更多信息,请查看此

我希望有帮助

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

使用上面的代码。

您的
toString
方法应该是
公共字符串toString()
[不带任何参数],这意味着从对象类重写

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

为了清晰起见,我将使用连接而不是连接:

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

好的,我自己解决了这个问题——贴出的问题证明和我的差不多

我需要添加另一种方法:

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

对于重写/实现的方法,请使用
@Override
注释,该注释会在错误参数化的toString上显示错误

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

在println或字符串连接中,Object.toString是自动调用的,不要显式调用它(表明您知道这一点)


您可以使用this关键字访问toString()方法中对象的属性,从而使该方法无参数。哇!!我想4分钟内回答了10个问题。谢谢大家!!哈哈!当我以为自己是第一个回答问题的人时,有3个人比我先回答了。:)哦,Sonarlint警告我,您应该返回这样的内容,而不必将它们赋给变量,因为这只是浪费内存,所以这可能是一个一行的
return result=getX()+“,+getY()+”,“+getZ()
@Override
public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("Point3D(").append(x).append(", ")
        .append(y).append(", ").append(z).append(")";
    return sb.toString();
}