在Java中是否可以覆盖';toString';对于对象数组?

在Java中是否可以覆盖';toString';对于对象数组?,java,arrays,string,tostring,Java,Arrays,String,Tostring,在Java中是否可以覆盖对象数组的toString 例如,假设我创建了一个简单的类,User(它是哪个类并不重要,因为这是一个一般性问题)。一旦客户端创建了用户[]数组,并且客户端使用系统输出打印(数组),它是否可能不打印数组的地址,而是打印自定义的toString() PS:当然我不能在我的类中重写toString(),因为它与单个实例相关。您可以创建一个包含数组的单独类,并重写toString() 我认为最简单的解决方案是扩展ArrayList类,只需重写toString()(例如,User

在Java中是否可以覆盖对象数组的toString

例如,假设我创建了一个简单的类,
User
(它是哪个类并不重要,因为这是一个一般性问题)。一旦客户端创建了
用户[]
数组,并且客户端使用
系统输出打印(数组)
,它是否可能不打印数组的地址,而是打印自定义的
toString()


PS:当然我不能在我的类中重写
toString()
,因为它与单个实例相关。

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


我认为最简单的解决方案是扩展
ArrayList
类,只需重写
toString()
(例如,
UserArrayList
)。

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

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

编辑(来自评论):

我理解您试图实现的目标,但Java目前不支持这一点

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

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

该方法以列表的形式返回数组的等价项,对列表中的每个对象迭代并调用
toString()


因此,虽然您无法执行
System.out.println(userList)
您可以执行
System.out.println(Arrays.toString(userList);
这基本上实现了相同的功能。

唯一的方法是重新编译
Object.toString()
并添加
instanceof
子句

我曾要求对ProjectCoin进行更改,以便以更面向对象的方式处理数组。我觉得初学者要学习Array、Array和其他7个常用的帮助器类中所需的所有功能太难了


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

您不能这样做。当您声明数组时,Java实际上创建了一个类型为array的隐藏对象。它是一种特殊的类(例如,它支持index access[]操作符)普通代码无法直接访问的

如果要重写toString(),则必须扩展该类,但不能这样做,因为它是隐藏的


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

好吧,您可以尝试使用around将所有对
对象的调用包装起来,并返回所需的数组输出。但是,我认为这不是一个好的解决方案:)

试试这个

User[] array = new User[2];
System.out.println(Arrays.asList(array));

当然,如果您自定义了
user.toString()
method

类似
java.util.Arrays.toString(array)
,请注意
Object[].toString()
不会返回数组的“地址”。它返回数组。OP没有使用ArrayList,他使用的是数组。我不想使用静态方法进行打印,我试图实现没有参数的toString()。明白。这就是为什么我回答的第一个词是“否”。我仍然不明白这是如何实现我想要的,假设我有一些类,我希望这个类“支持”数组类型的“toString()。例如:创建类[]数组=新类[3],一旦执行System.out.println(数组),该类将有一个toString()用于该类。