如果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[]
,而不是String
。 T[]
不是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
。)
所以
-
Object c = new Object[] {1,2,"22" };
说得通 -
String s = new String[]{"s","s"};
没有意义 -
Object s = new String[]{"s","s"};
说得通
它的基本Java原则,Everything是一个Object
,因此你可以使用Object引用,例如Object o = new AnyOtherClass()
您可以使用类的引用作为其子类,如List l = new Arraylist()
但String []是一个Array
而Array
不是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
,因此是有效的。 您也可以在声明级别指定c
是Object
的数组,如下所示:
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数组不能是字符串,因为它不是指字符序列,而是指位于堆中的字符串类型的对象。