Object类是Java中每个类的超类。因此,每个类都应该固有Object类的属性或行为。
然后我们可以声明对象数组,如下所示:
Object c = new Object[] {1,2,"22" };
然后来到String时为什么下面的声明是错误的:
String s = new String[]{"s","s"};
答案 0 :(得分:22)
new String[]{"s","s"}
的类型为String[]
,而不是String
。 T[]
不是T
的子类(除非T
恰好是Object
)。
Object[]
是Object
的子类型,这就是第一个工作的原因。事实上,所有数组类型都是subtype of 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();
在运行时因ArrayStoreException
而失败,因为您无法在Object
中存储String[]
个引用。
这就是为什么喜欢Josh Bloch的作者给出建议“首选列表到数组”的原因之一(参见 Effective Java 2nd Ed 第25项),因为像List
这样的Java集合是不协变,所以不要遭遇同样的问题。
(*)只是为了增加混淆,原始数组不是Object[]
的子类型,因为原语不是Object
的子类型。例如,编写时会出现编译时错误:
Object[] illegal = new int[5];
答案 1 :(得分:3)
有点令人困惑的是,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"};
有道理答案 2 :(得分:1)
它的基本Java原则,Everything是Object
,因此您可以使用Object引用来完成所有内容
Object o = new AnyOtherClass()
您可以使用类的引用作为其子类
List l = new Arraylist()
但String []是Array
而Array
不是String
答案 3 :(得分:1)
array是对象或原始数据类型集合的集合,而string是一系列字符。如你所知,对象是所有其他类的超级类,这就是你为什么这样做的原因:
Object c = new Object[] {1,2,"22" };
String类不是数组类型的超类......所以你不能像下面那样执行..
String s = new String[]{"s","s"};
希望这会对你有所帮助......
答案 4 :(得分:0)
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"};
答案 5 :(得分:0)
首先,数组保存堆中值的引用。
其次,Object类是java中每个其他类的母类。
所以对象数组可以包含任何类型的引用值,但是字符串数组只保存字符串数据类型的引用,并且每个引用都引用单独的字符串(string[0]= "a",string[1]="stackOverFlow"...)
。
第三,字符串是java中的一系列字符。
所以,sting数组不能是一个字符串,因为它不是指字符序列,而是指位于堆中的字符串类型的对象。