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引用.)
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
Java对象引用处理机制的更多相关文章
- 「轉」Java的内存机制
0.参考资料: http://www.j2megame.org/index.php/content/view/2246/125.html 1.Java的内存机制 Java 把内存划分成两种:一种是栈内 ...
- Java GC回收机制
优秀Java程序员必须了解的GC工作原理 一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只 ...
- 成为JavaGC专家(1)—深入浅出Java垃圾回收机制
转载自:http://www.importnew.com/1993.html 对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解GC ...
- Java内存回收机制
在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的,降低了Java程序员的学习难度,避免了像C/C++直接操作内存的危险.但是,也正 ...
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
一.Java的反射机制 每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图: 其中
- Java 动态代理机制分析及扩展
Java 动态代理机制分析及扩展,第 1 部分 王 忠平, 软件工程师, IBM 何 平, 软件工程师, IBM 简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟 ...
- [转]Java 动态代理机制分析及扩展
引言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执 ...
- java 垃圾回收机制 引用类型
Java语言的一个重要特性是引入了自动的内存管理机制,使得开发人员不用自己来管理应用中的内存.C/C++开发人员需要通过malloc/free 和new/delete等函数来显式的分配和释放内存.这对 ...
- 转:成为JavaGC专家Part I — 深入浅出Java垃圾回收机制
文章来自于:http://www.importnew.com/1993.html 对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解 ...
随机推荐
- ACM Least Common Multiple
The least common multiple (LCM) of a set of positive integers is the smallest positive integer which ...
- Lucene总结
数据的分类 结构化数据:有固定类型或者有固定长度的数据 例如:数据库中的数据(mysql,oracle等), 元数据(就是windows中的数据) 结构化数据搜索方法: 数据库中数据通过sql语句可以 ...
- 【Android应用开发】RecycleView API 翻译 (文档翻译)
. RecyclerView extends ViewGroupimplements ScrollingView NestedScrollingChild java.lang.Object ↳ ...
- 粗浅看Struts2和Hibernate框架
----------------------------------------------------------------------------------------------[版权申明: ...
- md编辑器测试
markdown 这是一个代码 print
- Spring中配置DataSource的六种方式
第一种:beans.xml <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource ...
- ajax中xmlhttp.readyState和xmlhttp.status的值及解释
xmlhttp.readyState的值及解释: 0:请求未初始化(还没有调用 open()). 1:请求已经建立,但是还没有发送(还没有调用 send()). 2:请求已发送,正在处理中(通常现在可 ...
- Android-Tab
SmartTabLayout 我的地址:https://github.com/kongqw/Android-Tab 开源地址:https://github.com/ogaclejapan/SmartT ...
- Android Studio突然不显示logcat日志
参考文章:http://blog.csdn.net/victor_e_n_01185/article/details/52818809 有时候,AS出现没有log的情况.一般您换了模拟器,或者使用真机 ...
- MT8127:如何让system分区可读写(MTK安卓6.0)
Android 系统默认情况下,system 分区是只读 mount 的,因为无法进行往里写数据的,可 以用 adb 命令 adb remount 重新 mount 一下. 也可以通过在板子上,输入以 ...