在 Java 中是否可以覆盖 Objects 数组的 toString ?
例如,假设我创建了一个简单的类,User
(它是哪个类并不重要,因为这是一个普遍的问题)。是否有可能,一旦客户端创建了一个User[]
数组并且客户端使用了System.out.print(array)
,它就不会打印数组的地址而是自定义的toString()
?
PS:当然我不能只toString()
在我的类中覆盖,因为它与单个实例有关。
不。当然你可以创建一个静态方法 User.toString(User[]),但它不会被隐式调用。
您可以使用Arrays.toString(Object[] a);
which 将调用toString()
数组中每个对象的方法。
编辑(来自评论):
我了解您要实现的目标,但 Java 目前不支持。
在 Java 中,数组是动态创建的对象,可以分配给 Object 类型的变量。Object 类的所有方法都可以在数组上调用。见JLS Ch10
当您调用toString()
一个对象时,它会返回一个“以文本方式表示”该对象的字符串。因为数组是 Object 的一个实例,所以你只能得到类的名称、@ 和一个十六进制值。见对象#toString
Arrays.toString ()方法将数组的等价物作为列表返回,该列表被迭代并toString()
在列表中的每个对象上调用。
因此,虽然您将无法做到,但System.out.println(userList);
您可以做System.out.println(Arrays.toString(userList);
这将基本上实现相同的目标。
您可以创建一个包含数组的单独类,并覆盖toString()
.
我认为最简单的解决方案是扩展ArrayList
类,然后覆盖toString()
(例如,UserArrayList
)。
您可以这样做的唯一方法是重新编译Object.toString()
和添加instanceof
子句。
我曾要求对 Project Coin 进行更改,以便以更面向对象的方式处理数组。我觉得初学者在 Array、Arrays 和其他 7 个常用的辅助类中学习所需的所有功能太多了。
我认为最终得出的结论是,使数组正确面向对象是一项不平凡的任务,它将被推回 Java 9 或更高版本。
Try this
User[] array = new User[2];
System.out.println(Arrays.asList(array));
of course if you have customized user.toString()
method
You cannot do that. When you declare an array, then Java in fact creates a hidden object of type Array. It is a special kind of class (for example, it supports the index access [] operator) which normal code cannot directly access.
If you wanted to override toString(), you would have to extend this class. But you cannot do it, since it is hidden.
I think it is good to be it this way. If one could extend the Array class, then one could add all kinds of methods there. And when someone else manages this code, they see custom methods on arrays and they are "WTF... Is this C++ or what?".