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