如何在不覆盖的情况下打印对象字段?

How to print object fields without override?

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

"it shows the classname and some value i don't know"

好吧,这就是 Object 实例的打印方式,对于 Object class 的实例(即不是 Object 的子 class 实例) 你不能覆盖 toString.

对于 Object 的自定义子 class,您必须自己决定对象的字符串表示形式(通过覆盖 toString)。 Java 不替你决定。

您希望从 object 中获得什么信息。它的主要信息是 class 名称和 hashCode(),这是您在 hashCode() 时获得的信息=13=]。这就是为什么如果我们想要打印一些关于 object 的特定信息,我们会在我们自己的 class 中覆盖 Object class 的 toString()toString() 的默认行为是打印 Object class name @ hashCode() 的十六进制表示。

PS :- 数组也被视为 Object ,它们在打印时也会给你 hashCode() ,除了 char[] ,这是因为 println(char[]) 具有打印其内容的功能,这与 int[]byte[] 等其他数组不同

您使用的打印数组示例仅打印了一个 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() 打印出对象中包含的所有信息,您最终会得到一堆非常无用的信息。

Object 是 java.It 中所有其他 class 的超级 class 包含一个方法 hashCode() 其中 returns 一个 32 位整数值,其值取决于 class 实例的内容。它还包含另一个方法 toString() 其中 returns 对象的字符串表示形式。 toString() 方法的默认实现 returns 以 class 名称为前缀的哈希码......即如下所示:
classname@hashCode
当我们将对象的引用传递给 System.out.println() 时,通常会打印对象的字符串表示形式。
我们可以通过覆盖 toString() 来更改实例的字符串表示形式实例 class 中的 方法。

如果您正在寻找第 3 方 类 实例的内容,或者您​​的 类 但不想覆盖 toString,您这样做可能是出于某些调试目的。当然你可以在不修改任何东西的情况下做到这一点。您需要使用 Reflection 并定义一些静态实用程序 toString 方法来迭代所有字段。

很奇怪为什么在接受的答案中省略了这一点。您也可以在 类 中覆盖时使用此功能,第 3 方 类 的区别在于您必须显式忽略非 public 访问修饰符。
看看这个已回答的问题:Printing all variables value from a class