【问题标题】:References and Casting参考和铸造
【发布时间】:2015-04-06 20:22:24
【问题描述】:

我很难理解我认为 Java 中的一个基本问题。 下面给出的答案是第 3 行倾向于类转换异常。我可以看到最初 a1 指向对象 A 的数组。但是在第 1 行上,a 没有设置为指向对象 b 的数组吗?因此,如果 a1 指向 a,它现在不应该也指向 b吗?

来自Enthuware的解释:-

程序运行时会在标记为 3 的行抛出 java.lang.ClassCastException。

编译期间允许使用 //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 {}

【问题讨论】:

标签: java reference pass-by-reference pass-by-value


【解决方案1】:

因此,如果 a1 指向 a,它现在不应该也指向 b吗?

没有。

变量保存值并且完全独立于其他变量。如果您更改了一个变量的值,您只会影响该变量。

【讨论】:

  • 感谢您的回答。你们俩都很有帮助,但我认为 David SN 的解释扩展了我不清楚的点。
【解决方案2】:

如果有多个变量引用同一个对象,则可以使用任何引用来更改对象,但引用的更改只会影响该引用。

在您的示例中, 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 */

【讨论】:

    猜你喜欢
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多