在Java中是否可以覆盖Objects数组的'toString'?

时间:2012-04-24 09:54:47

标签: java arrays string tostring

Java中是否可以覆盖Objects数组的toString?

例如,让我们说我创建了一个简单的类User(由于这是一个普遍的问题,它并不重要。一旦客户端创建了User[]数组并且客户端使用System.out.print(array),它是否有可能无法打印数组的地址,而是自定义toString()

PS:我当然不能在我的课程中覆盖toString(),因为它与单个实例相关。

7 个答案:

答案 0 :(得分:17)

没有。当然你可以创建一个静态方法User.toString(User []),但它不会被隐式调用。

答案 1 :(得分:9)

您可以使用Arrays.toString(Object[] a);来调用数组中每个对象的toString()方法。

修改(来自评论):

我理解你正在努力实现的目标,但Java目前还不支持。

在Java中,数组是动态创建的对象,可以分配给Object类型的变量。可以在数组上调用Object类的所有方法。见JLS Ch10

当您在对象上调用toString()时,它会返回一个“文本表示”该对象的字符串。因为数组是Object的一个实例,所以你只能获得类的名称,@和十六进制值。见Object#toString

Arrays.toString()方法返回数组的等价物作为列表,迭代结束并在列表中的每个对象上调用toString()

因此,虽然你无法做System.out.println(userList);,但你可以做System.out.println(Arrays.toString(userList);,这基本上可以实现同样的目的。

答案 2 :(得分:4)

您可以创建一个包含该数组的单独类,并覆盖toString()

我认为最简单的解决方案是扩展ArrayList类,然后覆盖toString()(例如,UserArrayList)。

答案 3 :(得分:3)

您可以执行此操作的唯一方法是重新编译Object.toString()并添加instanceof子句。

我曾要求更改Project Coin以更面向对象的方式处理数组。我觉得初学者在数组,数组和其他常用的7个辅助类中学习所需的所有功能太过分了。

我认为最终得出的结论是,使数组正确地面向对象是一项非常重要的任务,将被推回到Java 9或更高版本。

答案 4 :(得分:3)

试试这个

User[] array = new User[2];
System.out.println(Arrays.asList(array));
如果您使用自定义user.toString()方法

,则

粗略

答案 5 :(得分:0)

你做不到。声明数组时,Java实际上会创建一个Array类型的隐藏对象。它是一种特殊的类(例如,它支持索引访问[]运算符),普通代码无法直接访问它。

如果要覆盖toString(),则必须扩展此类。但你不能这样做,因为它是隐藏的。

我认为这样做很好。如果可以扩展Array类,那么可以在那里添加各种方法。当其他人管理这些代码时,他们会看到数组上的自定义方法,它们是“WTF ......这是C ++还是什么?”。

答案 6 :(得分:0)

好吧,您可以尝试将Object.toString的所有调用包裹在AspectJ advice左右,并返回所需的数组输出。但是,我不认为这是一个很好的解决方案:)