为什么这种类型的转换(数组到Object)可能在Java中以及x引用什么?(我仍然可以访问数组元素“s1”,“s2”,“s3”到x)。使用数组到Object转换的位置在哪里?
String[] array = {"s1","s2","s3"};
Object x = array;
答案 0 :(得分:4)
这是可能的,因为Array
是Object
。当你进行这种扩展转换时,你告诉Java“这是一个Object
,你不需要知道任何其他的事情。”您将无法再访问数组元素,因为普通Object
不支持元素访问。但是,您可以强制 x
返回数组,这样您就可以再次访问其元素:
String[] array = {"s1","s2","s3"};
Object x = array;
// These will print out the same memory address,
// because they point to the same object in memory
System.out.println(array);
System.out.println(x);
// This doesn't compile, because x is **only** an Object:
//System.out.println(x[0]);
// Cast x to a String[] (or Object[]) to access its elements.
String[] theSameArray = (String[]) x;
System.out.println(theSameArray[0]); // prints s1
System.out.println(((Object[]) x)[0]); // prints s1
答案 1 :(得分:2)
这称为扩展参考转换(JLS Section 5.1.5)。 x
仍然引用数组,但Java只知道x
为Object
。
您无法直接通过x
访问数组元素,除非您先将其转换回String[]
。
答案 2 :(得分:1)
Java中的每个数组类型最终都是一种Object
。这里没有转换;它只是将子类型值分配给超类型变量的常用功能。
答案 3 :(得分:0)
数组是Object
的类。如果你将Object
转换为String[]:
(String[])x
你会得到你想要的东西;)
答案 4 :(得分:0)
其他答案指出数组扩展Object
。回答你的上一个问题:
使用数组到对象的转换在哪里?
这很少使用,但一个用例与varargs有关。考虑这种方法:
static void count(Object... objects) {
System.out.println("There are " + objects.length + " object(s).");
}
为了将单个数组参数视为varags的元素,您需要转换为Object
:
String[] strings = {"s1", "s2", "s3"};
count(strings); //There are 3 object(s).
count((Object)strings); //There are 1 object(s).
这是因为varargs参数首先是一个数组,所以当它不明确时,编译器会以这种方式处理数组参数。向Object
的向上转换告诉编译器。
答案 5 :(得分:0)
在你的代码中x是一个指向String数组的指针,该数组命名数组。
所以你在数组中改变的东西也会发生在x上,但它似乎没用,因为Object是String []的超类,所以无论你在哪里使用Object都可以使用String []。