Java 如何处理别名?

原文地址:http://www.programcreek.com/2012/12/how-does-java-handle-aliasing/

别名(Aliasing)意味着可以更新的位置有多个别名,这些别名有不同的类型。

在下面的例子中,a 和 b 分别是两个不同类型 A 和 B 的变量名,B 继承自 A。

B[] b = new B[10];
A[] a = b;

a[0] =  new A();
b[0].methodParent();

在内存中,它们都指向相同的地址。

a 和 b 都指向同一内存地址。 在运行时,存储的实际对象决定要调用哪种方法。

Java 如何处理这种问题?

如果你把这个代码复制到你的 eclipse 中,并没有显示任何编译错误。

class A {
    public void methodParent() {
        System.out.println("method in Parent");
    }
}

class B extends A {
    public void methodParent() {
        System.out.println("override method in Child");
    }

    public void methodChild() {
        System.out.println("method in Child");
    }
}

public class Main {

    public static void main(String[] args) {

        B[] b = new B[10];
        A[] a = b;

        a[0] =  new A();
        b[0].methodParent();
    }
}

但是当你运行时,会报错:

Exception in thread "main" java.lang.ArrayStoreException: aliasingtest.A
    at aliasingtest.Main.main(Main.java:26)

原因是 Java 在运行时处理别名。 在运行时,它知道第一个元素应该是一个 B 对象,而不是 A。

因此,如果更改为:

B[] b = new B[10];
A[] a = b;

a[0] =  new B();
b[0].methodParent();

输出结果为:

override method in Child

results matching ""

    No results matching ""