如果将数组分配给对象引用,那么对象引用指向什么?

时间:2015-11-27 05:24:43

标签: java arrays reference

在Java中,可以将数组分配给对象引用。

class Sample{
     public void access(){
     int a[]= {1,2,3,4};
     Object oRef = a;
  }
}

引用数组的引用意味着什么?数组是多个元素,而引用是单个元素。那么这个参考的含义是什么?第二个问题是,既然可以为数组分配引用,有没有办法使用引用来访问数组的元素?

4 个答案:

答案 0 :(得分:1)

在开始回答你的问题之前,让我们明白数组是Java中的“对象”。 因此,如果您说int a[]= {1,2,3,4};,则表示您正在创建类型为int的数组的对象,并且要引用该对象,您将使用引用a。现在,让我们回答您的问题:

1)引用引用数组意味着什么?数组是多个元素,而引用是单个元素。那么这个参考的含义是什么?

enter image description here

在上图中,a是一个参考,它存储在堆栈中,而实际的数组,即。 a引用的对象存储在堆上。 每个数组类型都有一个类,因此有一个int[]类。如果你很好奇,这里的代码片段将证明我的上述陈述:

public static void main(String[] args)
{
    test(int[].class);
}

static void test(Class clazz)
{
    System.out.println(clazz.getName());
    System.out.println(clazz.getSuperclass());
    for(Class face : clazz.getInterfaces())
        System.out.println(face);
}

Credits上述代码段。 现在,很明显JVM在运行时自己创建了这些类。 java中的每个类都是Object类的子类型。因此,Object类型的引用可以引用类型int[]的实例 我希望这清楚问题的第一部分。 现在,第二部分,

2)有没有办法使用引用来访问数组的元素?

答案:是的确实如此。方式是:

int c[] = (int[])oRef;

当您编写上述语句时,您将创建类型为int[]的引用,并将该引用指向先前创建的类型为int[]的对象。通过说(int[])oRef,您只需将Object类型的引用类型转换为类int[]的超类,它是子类。 所以现在上面的图片将改为:

enter image description here

希望能回答你的问题。

答案 1 :(得分:0)

不能使用引用oRef访问数组的元素。 除了基元之外,java中的所有内容都是object,所以是的,您可以使用对象引用来引用数组。

但是你正在升级,所以你将失去阵列i的所有好处,例如。通过指定位置和所有内容来访问elements

现在通过使用此reference,您可以访问对象的最小可用方法,即toString()。equals()等。

答案 2 :(得分:0)

一旦你开始通过另一个引用引用一个实例(没有任何编译错误),那另一个引用将成为该范围内该实例的类型。例如, 请考虑以下代码段

class B extends A{}

Class Test{

B instance = new B(); //line 3
A refOfA = (A) instance; //line 4
}

现在在第3行,实例是B类的实例,实例的类型是B. 在第4行,实例仍然是B类的实例,但现在是对A的类型转换,并且该实例的引用类型变为A.所以实际上,您可以使用refOfA访问A的成员。

当您使用对象引用引用数组时,会发生类似的事情。

您可能希望阅读关于覆盖,重载以及有关类型和面向对象概念(如界面等)的讨论,这些概念来自Gang Of Four Design Patterns一书。

答案 3 :(得分:0)

所有数组都被视为Object的实例,因此任何数组都可以通过扩展转换转换为Object值。 使用强制转换缩小转换可以将此类对象值转换回数组。

For example:
Object o = new int[] {1,2,3};  // Widening conversion from array to Object
int[] a = (int[]) o;           // Narrowing conversion back to array 

对于第二个问题,只有在将对象分配回数组(使用int []强制转换)时,才可以为数组赋值,如下所示, 将oRef赋值给整数数组c []后,可以访问数组的元素。

int a[]= {1,2,3,4};
Object oRef = a;
int c[] = (int[])oRef;
System.out.println("element of c:"+c[0]);