谁能给我解释一下数组在 Java 中的真正工作原理。
我对下面的代码感到惊讶:
Object test = new Object[2][2];
Object test2 = new Object[] {
new Object[2],new Object[2]
};
Object test3 = new Object[2][];
((Object[])test3)[0] = new Object[2];
((Object[])test3)[1] = new Object[2];
System.out.println(test instanceof Object[]);
System.out.println(test instanceof Object[][]);
System.out.println(test2 instanceof Object[]);
System.out.println(test2 instanceof Object[][]);
System.out.println(test3 instanceof Object[]);
System.out.println(test3 instanceof Object[][]);
只有test2不是Object[][]的实例
运行时有什么区别?
编辑:我看到了一些答案。 Jon Skeet,请注意我可以做到:
Object[] test4 = (Object [])test;
test4[0] = "blaaa";
test4[1] = "toto";
System.out.println(test4);
测试 instanceof Object[] 返回 true,并且在运行时不会引发异常。根据 Sierra & Bates 的 SCJP 书,测试 IS-A Object[][] 也是一个 Object[]
但是当尝试用“test4[0] = “blaaa”;”重新分配一个新值时,我得到一个异常: 线程“main”中的异常 java.lang.ArrayStoreException: java.lang.String 在 Main.main(Main.java:24)
所以在运行时看来,test 和 test2 都是 IS-A Object[],并且都包含对象数组,但只有一个是 IS-A Object[][]
最佳答案
Test2 仅被声明为一个对象数组。它包含的对象恰好也是数组,但这没有声明。这就是区别。
关于java - java数组是如何真正工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6378611/