• Java是如何处理别名(aliasing)的


    什么是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/

  • 相关阅读:
    MySQL语法
    SQL必知必会
    大话设计模式
    软件工程
    myeclipse中git的使用
    提取文件中图片标签
    pandas 分析各地区男女的分布情况
    提取图片标签
    Requwsts+正则表达式爬取猫眼电影Top100
    PyCharm激活码
  • 原文地址:https://www.cnblogs.com/chenpi/p/5503751.html
Copyright © 2020-2023  润新知