码迷,mamicode.com
首页 > 编程语言 > 详细

【Simple Java】Java是如何处理别名(aliasing)的

时间:2016-05-18 01:37:37      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:

什么是Java别名(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是如何处理别名问题的

如果你拷贝以下代码到你的浏览器,会发现没有编译错误,

package simplejava;

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 Q20 {

    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: simplejava.A
    at simplejava.Q20.main(Q20.java:24)

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

因此,如果代码改成如下所示将会运行成功:

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

结果打印:

override method in Child

 

译文链接:http://www.programcreek.com/2012/12/how-does-java-handle-aliasing/

【Simple Java】Java是如何处理别名(aliasing)的

标签:

原文地址:http://www.cnblogs.com/chenpi/p/5503751.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!