为什么即使它引用数组,x也被认为是一个对象?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么即使它引用数组,x也被认为是一个对象?相关的知识,希望对你有一定的参考价值。

有人可以帮我理解这段代码吗?

int[] A = new int[2];
Object x = A; // All references are Objects
A[0] = 0;     // Static type of A is array...
x[1] = 1;   // But static type of x is not an array: ERROR

根据Oracle Java SE站点:

在Java编程语言中,数组是对象(§4.3.1),是动态创建的,可以分配给Object类型的变量(§4.3.2)。可以在数组上调用Object类的所有方法。

我知道数组可以分配给Object类型变量,但是,我的困惑可能在于引用的概念。当我们说Object x = A时,我们说x引用了数组A。但是,我的困惑在于x[1] = 1。为什么x被认为是Object是错误的,即使它引用了一个数组?我认为[]是一种只能在“数组”类中访问的方法吗?

答案

虽然我不会不必要地扔掉类型信息,但你可以使用Array#setInt(Object, int, int)通过int[]访问Object。那是,

Array.setInt(x, 1, 1); // x[1] = 1;

会工作。

另一答案

arrays are objects - 这意味着任何类型(引用或基元)的数组都是Object类的子类。

  • 通过使用子类的父引用实例可以访问。因此,语句Object x = A;在语法上是正确的。
  • 通过使用Child引用可以访问子相关的方法/实现。因此,语句A[0] = 0;在语法上是正确的。
  • 通过使用父引用,无法访问子相关的方法/实现。因此,语句x[1] = 1;在语法上是不正确的。

以上是关于为什么即使它引用数组,x也被认为是一个对象?的主要内容,如果未能解决你的问题,请参考以下文章

即使在删除原始属性后,通过引用复制到第二个属性的对象仍然存在?

PHP 标头位置即使在输出缓冲区内也被发送?

PHP类知识----值传递和引用传递

两个空对象(空数组)为什么不相等

第6章 数组

javascript-引用类型--Object类型