分配给单个Object的字符串数组实例

时间:2014-02-15 14:00:59

标签: java arrays string object

我遇到了这个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,但这是一个错误。

感谢所有人。

2 个答案:

答案 0 :(得分:1)

他们都编译,所以他们都是正确的,从Java 6开始。

  

湾对象myarr2 = new 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。 String myarr3 [] = new String [3];

这是有效的,但根据此文档不鼓励:

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

答案 1 :(得分:0)

你的第二个print语句发出错误的原因是因为编译器不知道myarr2实际上是什么,只是知道它是Object。例如,你可能有:

Object myarr2 = rand() ? new String[3] : new Dog();

即。 myarr2也可能是其他一些完全不相关的对象。

因此,您不能将myarr2索引为数组。当然,这可以通过演员来解决:

System.out.println(((String[])myarr2)[0]);