什么是Java的别名
别名意味着由不同的别名指向相同的位置,可以被更新这些别名可以有不同的类型。
在下面的代码例子中,变量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