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

时间:2017-12-31 02:36:33

标签: java arrays dynamic reference static

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

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类型变量,但是,我的困惑可能在于 reference 的概念。当我们说Object x = A时,我们说x引用了数组A。但是,我的困惑在于x[1] = 1。为什么x被认为是Object,即使它引用了一个数组,也是一个错误?我认为[]是一种只能在“数组”类中访问的方法吗?

2 个答案:

答案 0 :(得分:1)

虽然我不会不必要地丢弃类型信息,但您可以使用Array#setInt(Object, int, int)通过int[]访问Object。也就是说,

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

会起作用。

答案 1 :(得分:1)

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

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