如何在不覆盖的情况下打印对象字段?
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
我们可以使用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