在Java中,可以将数组分配给对象引用。
class Sample{
public void access(){
int a[]= {1,2,3,4};
Object oRef = a;
}
}
引用数组的引用意味着什么?数组是多个元素,而引用是单个元素。那么这个参考的含义是什么?第二个问题是,既然可以为数组分配引用,有没有办法使用引用来访问数组的元素?
答案 0 :(得分:1)
在开始回答你的问题之前,让我们明白数组是Java中的“对象”。
因此,如果您说int a[]= {1,2,3,4};
,则表示您正在创建类型为int
的数组的对象,并且要引用该对象,您将使用引用a
。现在,让我们回答您的问题:
1)引用引用数组意味着什么?数组是多个元素,而引用是单个元素。那么这个参考的含义是什么?
在上图中,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[]
的超类,它是子类。
所以现在上面的图片将改为:
希望能回答你的问题。
答案 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]);