为什么toString()方法在Java中的Array和ArrayList对象之间工作不同


问题内容
    String[] array = {"a","c","b"};
    ArrayList<String> list = new ArrayList<String>();
    list.add("a");
    list.add("b");
    list.add("c");
    System.out.println(array);
    System.out.println(list);

For list [a, b, c]输出,而for
array一些地址输出。当我们想要输出array值时,我们可以Arrays.toString(array);像使用一样使用它们list

我只是想知道为什么我们不能toString()直接调用array以获得值。这样做不是更直观,更方便吗?是什么导致对Array和的不同处理ArrayList


问题答案:

数组和数组列表之间的主要区别在于,数组列表是用Java编写的类,具有自己的实现(包括覆盖的决定toString),而数组是语言规范本身的一部分。JLS
10.7
特别指出:

数组类型的成员都是以下所有:

  • 公众最终场长
  • 公共方法克隆,它覆盖类Object中相同名称的方法,并且不引发任何检查的异常。
  • 所有成员都从Object类继承;不继承的对象的唯一方法是其克隆方法。

换句话说,语言规范防止toString覆盖数组的方法,因此它使用定义的默认实现,Object该默认实现中将打印类名和哈希码。

为什么要做出这个决定是一个可能应该问给语言设计者的问题…