加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java数组如何真正起作用

发布时间:2020-12-15 02:02:54 所属栏目:Java 来源:网络整理
导读:有人可以解释一下阵列在 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[]
有人可以解释一下阵列在 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);

test instanceof Object []返回true,并且在转换时没有在运行时引发异常.根据SCJP的Sierra& amp; Bates,测试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指的是两个元素的数组.它的类型只是Object [] – 所以这些元素可以引用任何对象.特别是,您可以写:

// Valid
Object[] foo = (Object[]) test2;
foo[0] = "hello";

而那不适用于测试:

// Invalid - test isn't just an Object[],it's an Object[][]
Object[] foo = (Object[]) test;
test[0] = "hello";

因为测试所引用的数组的元素类型是Object []而不是Object.数组“知道”每个元素应为null或对Object []的引用,因此VM将阻止它存储字符串.

您可以将测试转换为Object [],就像将String []转换为Object []一样 – 这就是所谓的数组协方差,在我看来允许它是错误的.正如我们所见,VM必须在执行时检查商店.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读