引用和铸造

问题描述:

我很努力去理解我认为Java中的一个基本问题。 下面的答案是第3行倾向于类抛出异常。我可以看到最初的a1指向对象A的数组。但是在第1行没有设置指向对象b的数组?因此,如果a1指向一个应该现在不是也指向b?从Enthuware引用和铸造

说明: -

程序将在该行抛出java.lang.ClassCastException标记3运行时。

第1行将在编译期间被允许,因为赋值是从子类引用到超类引用完成的。 因为超类引用被分配给子类引用变量,所以需要在行// 2中进行强制转换。并且这在运行时工作,因为a引用的对象实际上是一个B数组。 现在,行// 3处的转换告诉编译器不要担心,我是一名优秀的程序员,我知道我是什么做和超级类引用(a1)引用的对象实际上是在运行时的类B。所以没有编译时错误。但在运行时,这种失败,因为实际的对象不是B的阵列,但A.

public static void main(String args[]) { 

    A[] a, a1; 
    B[] b; 
    a = new A[10]; 
    a1 = a; 
    b = new B[20]; 
    a = b;   //line 1 
    b = (B[]) a; //line 2 
    b = (B[]) a1; //line 3 

    } 

} 

class A { 
} 

class B extends A {} 
+0

http://*.com/questions/ 1750106/how-can-i-use-pointers-in-java – chancea 2015-02-06 16:16:44

如果有多个变量引用相同的对象,则可以使用任何引用完成对象中的更改,但引用中的更改仅影响该引用。

在您的示例中,a和a1引用相同的数组。如果修改引用的对象(A的数组),则使用a或a1时它是相同的,因为它们引用同一对象。

A[] a, a1; 
a = new A[10]; 
a1 = a; 
/* You can use a or a1 to modify the object with the same results. */ 
a[0] = new A(); /* Equivalent to a1[0] = new A() */ 

如果修改变量以引用另一个对象,则其他引用保持不变。

A[] a, a1; 
a = new A[10]; 
a1 = a; 
a = new A[15]; /* a1 still references the first array and a the new one */ 

当您使用对象引用作为函数参数时会发生类似的情况。

做出了榜样,比法给出:

public static void uselessMethod(A[] a) { 
    /* a is a local variable that makes reference to the object, 
     modify the reference only has effect inside this method, 
     but modify the array has effects outside the method */ 
    a = null; 
} 

如果你拨打上面的方法,你参考不改:

A[] a = new A[10]; 
uselessMethod(a); 
System.out.println(a.length); /* This will print 10 */ 

的数组,因此,如果A1是指向应该现在不也点到B?

变量保持的值,是完全独立于其他变量。如果您更改一个变量的值,则只会影响该变量。

+0

感谢您的回答。你们两位都很有帮助,但我认为David SN的解释扩大了我不清楚的几点。 – user4702831 2015-02-06 17:20:38