我正在学习使用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知识漏洞。
答案 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();
}