zoukankan      html  css  js  c++  java
  • Java对象引用处理机制

    翻译人员: 铁锚

    翻译时间: 2013年11月13日

    原文链接: How does Java handle aliasing?


    什么是Java的引用别名机制

    Java的引用别名机制(原文为Aliasing,别名,即Java中的多态)意味着多个引用变量可以定位到同一个实际物理对象,而这些引用变量可以是不同的类型.
    下面的代码中,S类继承P类, pp 和 ss 分别是P类型 和 S类型的两个数组变量名.
    public class TestPolyMorphism {
        public static class P{
        public void print(String message){
            System.out.println("P-->"+message);
        }
        }
        public static class S extends P{
        public void print(String message){
            System.out.println("S-->"+message);
        }
        }
        public static void main(String[] args) {
        S[] ss = new S[10];
        P[] pp = ss;
        ss[0] = new S();
        pp[0].print("你好");
        // !!运行时错误,不能将父类对象,赋给子类数组;
        //pp[1] = new P();//java.lang.ArrayStoreException
        }
    }

    在内存中,pp和ss都指向了同样的内存地址.(我们可以说,指针pp,指针ss;或者说pp引用,ss引用.)

    图1
    pp和ss指向了同一个物理地址,在实际运行过程中,多态特性根据真实的对象类型决定调用父类还是子类的具体方法,而不是根据引用变量的类型.

    Java 如何处理引用别名机制
    如果将下列代码拷贝到eclipse中,将不会有什么编译期错误:
    package think;
    
    
    public class TestPolyMorphism {
        public static class P{
        public void print(String message){
            System.out.println("P-->"+message);
        }
        }
        public static class S extends P{
        public void print(String message){
            System.out.println("S-->"+message);
        }
        public void paint(String message){
            System.out.println("S-->执行一些绘画操作-->"+message);
        }
        }
        public static void main(String[] args) {
        S[] arr = new S[10];
        P[] pp = arr;
        arr[0] = new S();
        pp[0].print("你好");
        pp[1] = new P(); // !!运行时错误,不能将父类对象,赋给子类数组;java.lang.ArrayStoreException
        }
    }

    但在运行期将会显示如下错误:
    Exception in thread "main" java.lang.ArrayStoreException: think.TestPolyMorphism$P
        at think.TestPolyMorphism.main(TestPolyMorphism.java:22)
    原因是Java在运行时才处理别名引用,在程序运行过程中,虚拟机发现 数组pp的第一个元素是 SS类型的对象,而不是PP类型的。
    因此,只有修改为正确的代码,才可以正常运行:
    S[] arr = new S[10];
    P[] pp = arr;
    pp[1] = new S();
    pp[1].print("你好");
    输出没有错误:
    S-->你好

    相关文章:
    1. Linux Process Programming – fork()
    2. 图说Java —— 理解Java机制最受欢迎的8幅图
    3. Why do we need Generic Types in Java?
    4. Overriding and overloading in Java with examples

  • 相关阅读:
    前端 JavaScript&Dom
    前端 css续
    前端 初级篇(CSS)
    前端 初级篇(HTML)
    堡垒机
    Python操作RabbitMQ
    常用到代码片段
    关于文件上传功能的思考
    JS正则表达式将url转成json格式
    一行代码解决各种IE兼容问题,IE6,IE7,IE8,IE9,IE10
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6467081.html
Copyright © 2011-2022 走看看