为什么这种类型的转换(数组到对象)在 Java 中是可能的,x 指的是什么?(我仍然可以通过 x 访问数组元素“s1”、“s2”、“s3”)。数组到对象的转换在哪里使用?
String[] array = {"s1","s2","s3"};
Object x = array;
为什么这种类型的转换(数组到对象)在 Java 中是可能的,x 指的是什么?(我仍然可以通过 x 访问数组元素“s1”、“s2”、“s3”)。数组到对象的转换在哪里使用?
String[] array = {"s1","s2","s3"};
Object x = array;
这是可能的,因为anArray
是Object
. 当您进行这种扩大转换时,您告诉 Java “这是一个Object
并且您不需要知道关于它的任何其他信息。” 您将无法再访问数组元素,因为 plainObject
不支持元素访问。但是,您可以转换 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
这称为扩大参考转换(JLS 第 5.1.5 节)。 x
仍然指的是数组,但 Java 只x
知道Object
.
x
除非您将其转换回第一个,否则您无法直接访问数组元素String[]
。
Java 中的每个数组类型最终都是一种Object
. 这里没有转换;这只是将子类型值分配给超类型变量的通常能力。
其他答案指出数组扩展Object
。要回答您的最后一个问题:
数组到对象的转换在哪里使用?
这很少使用,但一个用例与varargs相关。考虑这种方法:
static void count(Object... objects) {
System.out.println("There are " + objects.length + " object(s).");
}
为了将单个数组参数视为可变参数的元素,您需要强制转换为Object
:
String[] strings = {"s1", "s2", "s3"};
count(strings); //There are 3 object(s).
count((Object)strings); //There are 1 object(s).
这是因为 varargs 参数首先是一个数组,所以当它不明确时,编译器会以这种方式处理数组参数。向上转型Object
告诉编译器否则。
在您的代码中 x 是一个指向名称数组的字符串数组的指针。
所以你在数组中所做的任何改变也会发生在 x 上,但这似乎是无用的,因为 Object 是 String[] 的超类,所以无论你应该使用 Object,你都可以使用 String[]。