我们可以使用System.out.println
轻松打印数组(虽然数组也是java中的一种对象),但为什么我们不能直接打印对象而不使用覆盖toString()
方法?
例如:
int array[]=new int(2);
array[0]=10;
System.out.println(array[0]); //it works
Object obj=new Object();
System.out.println(obj); //it shows the classname and some value i don't know
答案 0 :(得分:1)
"它显示了我不知道的类名和一些价值"
嗯,这是Object
实例的打印方式,以及Object
类的实例(即不是Object
的子类),你不能这样做覆盖toString
。
对于Object
的自定义子类,您必须自己决定如何希望对象的String表示形式(通过覆盖toString
)。 Java并不是为你决定的。
答案 1 :(得分:1)
您希望从object
获得哪些信息。它的主要信息是class
名称及其hashCode()
,这是您{{1}时获得的信息}}。这就是为什么如果我们想要打印有关System.out.println(obj);
的特定信息,我们会在我们自己的类中覆盖object
toString()
类。 Object
的默认行为是打印toString()
类名{@ 1}}的十六进制表示。
PS: - 此外,数组也被视为Object
,打印时也会显示hashCode()
,Object
除外,这是因为hashCode()
具有打印功能其内容与char[]
,println(char[])
等其他数组不同。
答案 2 :(得分:0)
您使用的打印数组示例仅打印int。您在索引0处请求值,然后将返回的int打印到控制台。您的示例相当于创建自己的对象并打印您调用的方法的结果。例如:
class A {
public String getValue()
return "my text";
}
}
A a = new A();
system.out.println(a.getValue());
要回答您的问题,system.out.println是一个方法,它将获取一个对象并使用标准方法从给定对象中提取文本。如果Object没有这样做,您仍然需要创建自己的toString()等效方法,以便打印出来自对象的信息。
如果你想让toString()打印出一个对象中包含的所有信息,你最终会得到一堆真正无用的信息。
答案 3 :(得分:0)
Object 是java中每个其他类的超类。它包含一个方法 hashCode(),它返回一个32位整数值,其值取决于类实例的内容。它还包含另一个方法 toString(),它返回对象的字符串表示形式。 toString()方法的默认实现返回前缀为classname的哈希码...,如下所示:
的类名@的hashCode 强>
当我们将对象的引用传递给System.out.println()时,通常会打印对象的字符串表示。
我们可以通过覆盖 toString()实例类中的方法。
答案 4 :(得分:0)
如果您正在寻找第三方课程实例的内容,或者您的课程但又不想覆盖toString,那么您可能会出于某些调试目的而这样做。当然,你可以做到这一点而无需修改任何东西您需要使用Reflection并定义一些迭代所有字段的静态实用程序toString方法。
很奇怪为什么在接受的答案中省略了。您可以在覆盖类的同时使用此功能,第三方类的区别在于您必须明确忽略非公共访问修饰符。
看看这个已回答的问题:Printing all variables value from a class