Java对象引用处理机制

简介: 翻译人员: 铁锚 翻译时间: 2013年11月13日 原文链接: How does Java handle aliasing? 什么是Java的引用别名机制 Java的引用别名机制(原文为Aliasing,别名,即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

目录
相关文章
|
1月前
|
Java
Java并发编程中的锁机制
【2月更文挑战第22天】 在Java并发编程中,锁机制是一种重要的同步手段,用于保证多个线程在访问共享资源时的安全性。本文将介绍Java锁机制的基本概念、种类以及使用方法,帮助读者深入理解并发编程中的锁机制。
|
1月前
|
Java 程序员
Java中的异常处理机制
【2月更文挑战第22天】在Java编程中,异常处理是一个重要的概念。它允许程序员在程序执行过程中遇到错误时,对错误进行处理,而不是让程序崩溃。本文将介绍Java中的异常处理机制,包括异常的分类、如何捕获和处理异常以及自定义异常等内容。
18 1
C4.
|
1月前
|
缓存 Java
Java的Integer对象
Java的Integer对象
C4.
13 0
|
24天前
|
Java
java8中List对象转另一个List对象
java8中List对象转另一个List对象
36 0
|
29天前
|
开发框架 Java API
java反射机制的原理与简单使用
java反射机制的原理与简单使用
17 1
|
1天前
|
Java
Java基础之对象的引用
Java基础之对象的引用
5 0
|
5天前
|
Java
Java中如何克隆一个对象?
【4月更文挑战第13天】
14 0
|
6天前
|
Java API 数据库
深入解析:使用JPA进行Java对象关系映射的实践与应用
【4月更文挑战第17天】Java Persistence API (JPA) 是Java EE中的ORM规范,简化数据库操作,让开发者以面向对象方式处理数据,提高效率和代码可读性。它定义了Java对象与数据库表的映射,通过@Entity等注解标记实体类,如User类映射到users表。JPA提供持久化上下文和EntityManager,管理对象生命周期,支持Criteria API和JPQL进行数据库查询。同时,JPA包含事务管理功能,保证数据一致性。使用JPA能降低开发复杂性,但需根据项目需求灵活应用,结合框架如Spring Data JPA,进一步提升开发便捷性。
|
11天前
|
存储 Java 编译器
对象的交响曲:深入理解Java面向对象的绝妙之处
对象的交响曲:深入理解Java面向对象的绝妙之处
45 0
对象的交响曲:深入理解Java面向对象的绝妙之处
|
16天前
|
Java
在Java中,多态性允许不同类的对象对同一消息做出响应
【4月更文挑战第7天】在Java中,多态性允许不同类的对象对同一消息做出响应
17 2

热门文章

最新文章