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.cnblogs.com/chenpi/p/5503751.html,如需转载请自行联系原作者


相关文章
|
5月前
|
Java 开发者
【Java异常】什么是异常,Java中如何处理异常?
【Java异常】什么是异常,Java中如何处理异常?
57 0
|
3月前
|
自然语言处理 安全 Java
Java演进问题之Substrate VM处理Java序列化如何解决
Java演进问题之Substrate VM处理Java序列化如何解决
|
3月前
|
安全 前端开发 Java
Java中如何处理跨域请求?
Java中如何处理跨域请求?
|
3月前
|
设计模式 Java API
如何处理Java中的方法过长?
如何处理Java中的方法过长?
|
4月前
|
监控 Java 网络安全
java获取ssh连接时报错com.jcraft.jsch.JSchException: Packet corrupt如何处理?
【6月更文挑战第5天】java获取ssh连接时报错com.jcraft.jsch.JSchException: Packet corrupt如何处理?
577 5
|
3月前
|
缓存 算法 Java
Java中如何处理大数据量的排序?
Java中如何处理大数据量的排序?
|
3月前
|
安全 Java 网络安全
如何处理Java中的SSLException异常?
如何处理Java中的SSLException异常?
|
Java 应用服务中间件
第一季:9SpringMVC中如何解决POST请求中文乱码问题,GET的又如何处理呢【Java面试题】
第一季:9SpringMVC中如何解决POST请求中文乱码问题,GET的又如何处理呢【Java面试题】
65 0
|
Java
Com.Java.Basis 第十三课 《Java中的异常处理》经历前面的十二课的学习:我在思考在Java中报错如何处理
Com.Java.Basis 第十三课 《Java中的异常处理》经历前面的十二课的学习:我在思考在Java中报错如何处理
50 0
|
NoSQL Java 数据库
java接口防重提交如何处理
举一个最简单的例子:日常开发中crud在业务系统中普遍存在,在服务端没有做任何处理,客户端没有做节流、防抖等限流操作时,同一秒一个用户点了两次新增按钮,导致数据库中存在同样两条数据,其结果可想而知,同理修改、删除同样的道理;查询本身具有幂等性,但是在同一秒钟同样的操作,查询多次和一次,有区别吗?区别大了去了,不谈用户体验如何,光是网络开销、流量占用、带给服务器的压力等等,生产中一点小的问题,如何不及时处理,可能会引发灾难性bug。
下一篇
无影云桌面