当前位置: 首页 > news >正文

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

转载于:https://www.cnblogs.com/lanzhi/p/6467081.html

相关文章:

  • HTML5 UI框架Kendo UI Web中如何创建自定义组件(二)
  • WIKI系统及MysQL数据库宕机恢复文档
  • Intellij IDEA快捷键
  • OpenCV学习(38) 人脸识别(3)
  • Android 开发:view的几种布局方式及实践
  • Java深度历险(十)——Java对象序列化与RMI
  • Codeforces Round #215 (Div. 2) 解题报告
  • CGI Internal Server Error
  • Symantec终止售卖SIM产品
  • (11)MATLAB PCA+SVM 人脸识别
  • C++ - 函数模板(function template) 的 重载(overload) 详解 及 代码
  • Windows Phone 8初学者开发—第6部分:设置应用程序的样式
  • VHD_Update_diskpart
  • mysql乱码问题解决办法
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【Linux系统编程】快速查找errno错误码信息
  • eclipse的离线汉化
  • fetch 从初识到应用
  • Flannel解读
  • github从入门到放弃(1)
  • JavaScript函数式编程(一)
  • Java基本数据类型之Number
  • js算法-归并排序(merge_sort)
  • Linux链接文件
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • Vue 重置组件到初始状态
  • webpack入门学习手记(二)
  • 翻译--Thinking in React
  • 我们雇佣了一只大猴子...
  • ​虚拟化系列介绍(十)
  • #{}和${}的区别是什么 -- java面试
  • #define、const、typedef的差别
  • (1) caustics\
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (四)鸿鹄云架构一服务注册中心
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .net core Swagger 过滤部分Api
  • .NET NPOI导出Excel详解
  • .Net Remoting(分离服务程序实现) - Part.3
  • .net 验证控件和javaScript的冲突问题
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • @ConfigurationProperties注解对数据的自动封装
  • @EnableConfigurationProperties注解使用
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [ARC066F]Contest with Drinks Hard
  • [Assignment] C++1