Java中是否可以覆盖Objects数组的toString?
例如,让我们说我创建了一个简单的类User
(由于这是一个普遍的问题,它并不重要。一旦客户端创建了User[]
数组并且客户端使用System.out.print(array)
,它是否有可能无法打印数组的地址,而是自定义toString()
?
PS:我当然不能在我的课程中覆盖toString()
,因为它与单个实例相关。
答案 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)