我遇到了这个Java问题:
以下哪个声明为假:

a. Object[] myarr1 = new String[3];
b. Object myarr2 = new String[3];
c. String[] myarr3 = new String[3];
d. String myarr3[] = new String[3];


我认为似乎b是答案。但是,在我在Eclipse中检查时,b中的声明实际上是正确的!
此外,我尝试了以下方法:

A. Object[] myarr1 = new String[]{"a1","b1","c1"};
B. Object myarr2 = new String[]{"a2","b2","c2"};
C. String[] myarr3 = new String[]{"a3","b3","c3"};


并打印出每个数组的内容,以通过将Object分配给String数组来研究其实际含义。

System.out.println(myarr1[0]); //print "a1"
System.out.println(myarr2[0]); //error
System.out.println(myarr3[0]); //print "a3"
System.out.println(myarr1); //print address of myarr1
System.out.println(myarr2); //print address of myarr2
System.out.println(myarr3); //print address of myarr3


看起来myarr1和myarr3的行为类似于普通的String数组,而myarr2则不同。调试以查看myarr2的内容后发现,myarr2的内容和结构似乎与myarr1和myarr3相同。

有人可以向我解释这个意义吗?使用声明b或B时,我们在做什么。myarr2的结构是什么?如何访问它的元素或将其转换为String数组?我尝试了(String [])myarr2,但这是一个错误。

谢谢大家。

最佳答案

从Java 6开始,它们都进行了编译,因此都是正确的。


  b。对象myarr2 =新的String [3];


这行得通,因为使用new运算符创建的所有内容都是Java中的对象。您可以稍后将其强制转换回其真实类型,例如,这些将按预期工作:

Object myarr2 = new String[] { "first", "second" };
String[] real = (String[]) myarr2;
real[1] = "hello";
System.out.println(real[1]);                // will output "hello"
System.out.println(((String[])myarr2)[1]);  // will output "hello"



  d。字符串myarr3 [] =新的String [3];


这是有效的,但不建议使用此文档:

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html

10-06 07:22