Java 如果将数组指定给对象引用,那么对象引用指向什么?
在Java中,可以将数组分配给对象引用Java 如果将数组指定给对象引用,那么对象引用指向什么?,java,arrays,reference,Java,Arrays,Reference,在Java中,可以将数组分配给对象引用 class Sample{ public void access(){ int a[]= {1,2,3,4}; Object oRef = a; } } 引用引用数组意味着什么?数组是多个元素,而引用是单个元素。那么,这一引用的含义是什么?第二个问题是,既然可以为数组分配引用,那么有没有办法使用引用访问数组的元素?否您不能使用引用或引用访问数组的元素。 java中的所有东西都是一个对象,除了原语,所以可以有一个objec
class Sample{
public void access(){
int a[]= {1,2,3,4};
Object oRef = a;
}
}
引用引用数组意味着什么?数组是多个元素,而引用是单个元素。那么,这一引用的含义是什么?第二个问题是,既然可以为数组分配引用,那么有没有办法使用引用访问数组的元素?否您不能使用引用
或引用访问数组的元素。
java中的所有东西都是一个对象
,除了原语,所以可以有一个object引用来引用数组
int a[]= {1,2,3,4};
Object oRef = a;
int c[] = (int[])oRef;
System.out.println("element of c:"+c[0]);
但是,您将在层次结构中上升,因此您将失去阵列的所有好处,即。通过指定位置和全部来访问元素
现在,通过使用此引用
您可以访问对象可用的最小方法,即toString().equals()等。一旦您开始通过另一个引用引用实例(没有任何编译错误),另一个引用将成为该范围内该实例的类型。例如
考虑下面的片段
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。因此,实际上,您可以使用REOFA访问A的成员
当使用对象引用引用数组时,会发生类似的情况
您可能想阅读《四人帮设计模式》一书中有关重写、重载以及类型和面向对象概念(如接口等)的讨论。所有数组都被视为对象的实例,因此任何数组都可以通过扩大转换转换为对象值。
使用强制转换的缩小转换可以将此类对象值转换回数组
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[]casting),才可能分配对数组的引用,如下所示:,
将oRef分配给整数数组c[]后,可以访问数组的元素
int a[]= {1,2,3,4};
Object oRef = a;
int c[] = (int[])oRef;
System.out.println("element of c:"+c[0]);
在开始回答您的问题之前,让我们先弄清楚数组在Java中是“对象”。
所以如果你说inta[]={1,2,3,4}
,您正在创建类型为int
array的对象,要引用该对象,您将使用referencea
。现在,让我们来回答你的问题:
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);
}
对于上面的代码片段。
现在,很明显JVM在运行时自己生成这些类。
java中的每个类都是对象的子类型。因此,类型为对象的引用可以引用类型为int[]
我希望这澄清了问题的第一部分。
那么第二部分,
2)是否有方法使用引用访问数组元素?
回答:是的。方法是:
int c[] = (int[])oRef;
编写上述语句时,创建类型为int[]
的引用,并将该引用点指向先前创建的类型为int[]
的对象。通过说(int[])或f
,您只是将typeObject
的引用类型转换为子类int[]
的超类。
因此,现在上图将更改为:
希望这能回答您的两个问题。引用是变量在堆中的地址。当您强制转换到对象
时,您将失去数组的功能。通过显式回溯到int[]
@TimBiegeleisen,可以重新获得oRef。oRef是一个单元素实体,而数组包含多个元素。那么,当一个多元素实体被分配给一个单数实体时,到底发生了什么呢?它是指第一个元素还是指整个数组?请参见以下有关对象和“引用”的示例:。你想解决什么问题?Java中的所有东西都不是对象。例如,int不是对象类型Integer。第二个问题得到了回答。第一个问题不是。我问“一个数组是多个元素,而一个引用是一个元素。那么这个引用的含义是什么?”当一个多元素实体被分配给一个单数实体,也就是在这个例子中的数组和对象引用时,到底发生了什么?你的答案是“为什么”而不是“什么”。