Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果将数组指定给对象引用,那么对象引用指向什么?_Java_Arrays_Reference - Fatal编程技术网

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

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

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的对象,要引用该对象,您将使用reference
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);
}
对于上面的代码片段。 现在,很明显JVM在运行时自己生成这些类。 java中的每个类都是
对象的子类型。因此,类型为
对象的引用可以引用类型为
int[]
我希望这澄清了问题的第一部分。 那么第二部分,

2)是否有方法使用引用访问数组元素?

回答:是的。方法是:

int c[] = (int[])oRef;
编写上述语句时,创建类型为
int[]
的引用,并将该引用点指向先前创建的类型为
int[]
的对象。通过说
(int[])或f
,您只是将type
Object
的引用类型转换为子类
int[]
的超类。 因此,现在上图将更改为:


希望这能回答您的两个问题。

引用是变量在堆中的地址。当您强制转换到
对象
时,您将失去数组的功能。通过显式回溯到
int[]
@TimBiegeleisen,可以重新获得oRef。oRef是一个单元素实体,而数组包含多个元素。那么,当一个多元素实体被分配给一个单数实体时,到底发生了什么呢?它是指第一个元素还是指整个数组?请参见以下有关对象和“引用”的示例:。你想解决什么问题?Java中的所有东西都不是对象。例如,int不是对象类型Integer。第二个问题得到了回答。第一个问题不是。我问“一个数组是多个元素,而一个引用是一个元素。那么这个引用的含义是什么?”当一个多元素实体被分配给一个单数实体,也就是在这个例子中的数组和对象引用时,到底发生了什么?你的答案是“为什么”而不是“什么”。