博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java是如何处理别名(aliasing)的
阅读量:7016 次
发布时间:2019-06-28

本文共 1079 字,大约阅读时间需要 3 分钟。

什么是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

 

译文链接:

转载于:https://www.cnblogs.com/chenpi/p/5503751.html

你可能感兴趣的文章
常用的Windows命令
查看>>
Spring 教程(二) 体系结构
查看>>
第18条:尽量使用不可变对象
查看>>
点滴积累【other】---HTTP Error 503. The service is unavailable (转载)
查看>>
sqlite数据库查看操作
查看>>
<梦断代码>读后感2
查看>>
android开发第四天xml文件解析
查看>>
[程序员应该知道的]硬盘基本知识(二)
查看>>
快速统计一个数二进制中1的个数
查看>>
IDEA配置spring
查看>>
知识点总结报告 1.25
查看>>
关于autofac的一些具体的用法
查看>>
Mysql 知识(3)
查看>>
稳定方块
查看>>
Git学习的简单笔记
查看>>
9月5日队内互测总结
查看>>
测试的窘境
查看>>
[原创]隐藏用户名出现在Windows XP欢迎画面
查看>>
[SDOI2010]星际竞速——费用流
查看>>
C#开发串口总结,并提炼串口辅助类到公用类库中
查看>>