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