英文:
Why is it common practice to override the method toString() in java to print the instance variables of the class?
问题
因为我一直在学习,甚至一些集成开发环境(IDE)中都内嵌了这个功能,可以重写 toString()
方法以打印出类的所有实例变量。
在 object.java
中定义的原始 toString()
如下:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
而通常的做法是将其重写为:
public String toString() {
return "className{" + "var1=" + var1 + ", var2=" + var2 + '}';
}
为什么我们不保留 toString()
方法的原始功能,并创建一个新的方法(使用不同的名称)来实现这个功能呢?
英文:
As I've been learning and even some IDEs have it embeded in it, to override the toString()
method to print out all instance variables of the class.
The original toString()
defined in object.java
is defined as follows:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
And it's common practice to override it as:
public String toString() {
return "className{" +"var1="+var1+", var2="+var2+'}';
}
Why don't we keep the original functionality of the toString()
method and create a new method (with a different name) with this functionality?
答案1
得分: 0
我们可以这样做。但是,那些对你的子类及其myNewToString方法一无所知的其他类,如何知道如何打印出textually represents以简洁但信息丰富的方式表示任意子类的字符串?
toString方法被设计成可以被重写以实现这一点。是的,它确实有默认行为,但并不是非常有用。它的作者希望你去重写它。将其重写以返回通常做法更加有用,但你并非必须如此。一个EmailAddress类的toString方法可以返回:
public String toString() {
return "EmailAddress{localPart = " + localPart + ", domainName = " + domainName + "}";
}
但通常返回类似这样的内容会更有用:
public String toString() {
return localPart + "@" + domainName;
}
英文:
We could. But how will other classes, that know absolutely nothing about your subclasses with your myNewToString method, know how to print a string that textually represents, in a concise but informative way, arbitrary subclasses?
The toString method was designed to be overridden to do that. Yes, it does have default behavior but it's not very useful. Its authors wanted you to override it. Overriding it to return what's commonly practiced is more useful, but you don't have to do that. A toString method for an EmailAddress class can return
public String toString() {
return "EmailAddress{localPart = " + localPart + ", domainName = " + domainName + "}";
}
but it's usually more useful to return something like
public String toString() {
return localPart + "@" + domainName;
}
答案2
得分: 0
重写toString()的原因是,每当编译器将一个非String类型的对象添加到字符串中时,都会隐式调用toString()。因此,如果你有以下代码:
MyObject o = new MyObject();
C = "Hello " + o;
那么编译器将调用o.toString(),以便获得一个可以连接到"Hello "的字符串。
值得注意的是,在调用o的toString()之前,它会检查o是否为null。如果o为null,则会生成字符串"null"。
观点:toString()方法通常只应用于调试(打印/日志)的目的,在大多数情况下不应作为正常程序流程的一部分。
英文:
The reason to override toString() is that toString() is called implicit by the compiler every time an object which is not of type String, is added to a string.
So if you have
MyObject o=new MyObject();
C="Hello " + o;
Then the compiler will call o.toString() in order to get a string it can concat to "Hello "
And I should note that it checks if o is null before calling toString() on o. And if o is null, it just generate the string "null"
Opinion: The toString() method should in general and in most cases only be used for debugging (Print/Log) and not as part of the normal program flow.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论