9.2 JAVA如何处理别名

什么是Java的别名

别名意味着由不同的别名指向相同的位置,可以被更新这些别名可以有不同的类型。

在下面的代码例子中,变量a和b代表两个不同的类型A和B。B继承了A。

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

在内存里面,它们指向相同的位置。

image.png

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容