如何打印对象字段而不覆盖?

时间:2015-07-05 10:46:47

标签: java arrays object reflection

我们可以使用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

5 个答案:

答案 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