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