如果Object数组是Object,为什么String数组不是String

Object类是Java中每个类的超类。 所以每个类都应该固有Object类的属性或行为。

然后我们可以声明对象数组,如下所示:

Object c = new Object[] {1,2,"22" }; 

然后来到String时为什么下面的声明是错误的:

 String s = new String[]{"s","s"}; 

new String[]{"s","s"}的类型为String[] ,而不是StringT[]不是T的子类(除非T恰好是Object )。

Object[]Object[]的子类型,这就是第一个工作的原因。 实际上,所有数组类型都是Object子类型 ,可能令人惊讶地包括基元数组,如int[] ,即使int不是Object (*)。

您可以使用更具体的类型编写第一个:

 Object[] c = new Object[] {1,2,"22" }; 

您可以将第二个写为以下任何一个:

 String[] s1 = new String[]{"s","s"}; Object[] s2 = new String[]{"s","s"}; Object s3 = new String[]{"s","s"}; 

顺便提一下, s2表明Java中的数组是协变的。 这是有问题的,因为你可以合法地写:

 s2[0] = new Object(); 

由于您无法在String[]存储Object引用,因此在运行时会因ArrayStoreException而失败。

这就是为什么像Josh Bloch这样的作者给出建议“首选列表到数组”的原因之一(参见Effective Java 2nd Ed Item 25),因为像List这样的Java集合不是协变的,因此不会遇到同样的问题。


(*)只是为了增加混淆,原始数组不是Object[]子类型,因为原语不是Object子类型。 例如,编写时会出现编译时错误:

 Object[] illegal = new int[5]; 

有点令人困惑的是, Object[] 一个Object 。 (一方面,这就是Java如何实现零长度数组,并允许数组作为函数返回值)。

因此,将Object[]实例分配给Object类型的引用是有意义的。

但是将String[]实例分配给String[]类型的引用是没有意义的。 (但请注意, String[] 也是一个Object 。)

所以

  1. Object c = new Object[] {1,2,"22" }; 说得通
  2. String s = new String[]{"s","s"}; 没有意义
  3. Object s = new String[]{"s","s"}; 说得通

它的基本Java原则,Everything是一个Object ,因此你可以使用Object引用,例如Object o = new AnyOtherClass()

您可以使用类的引用作为其子类,如List l = new Arraylist()

但String []是一个ArrayArray不是String的祖先

array是对象的集合或原始数据类型的集合,而string是一系列字符。 如你所知,对象是所有其他类的超类,这就是你为什么这样做的原因: Object c = new Object[] {1,2,"22" };

String类不是数组类型的超类…所以你不能像下面那样执行..

 String s = new String[]{"s","s"}; 

希望对你有帮助…

 Object c = new Object[] {1,2,"22" }; 

由于Object的数组仍然是Object ,因此是有效的。 您也可以在声明级别指定cObject的数组,如下所示:

 Object[] c = new Object[] {1,2,"22" }; 

然而,

 String s = new String[]{"s","s"}; 

无效,因为String的数组不是String 。 您需要将数组转换为String ,如下所示:

 String s = String.join(",", new String[]{"s","s"}); 

或者将其存储为数组,如下所示:

 String[] s = new String[]{"s","s"}; 

首先,数组保存堆中值的引用。

其次,Object类是java中每个其他类的母类。 所以对象数组可以包含任何类型的引用值,但是字符串数组只保存字符串数据类型的引用,并且每个引用都引用单独的字符串(string[0]= "a",string[1]="stackOverFlow"...)

第三,字符串是java中的一系列字符。

因此,sting数组不能是字符串,因为它不是指字符序列,而是指位于堆中的字符串类型的对象。