2019年07月17日(星期三)  农历:己亥年六月十五

作者:三年。分类: JAVA

 什么是Java的引用别名机制

Java的引用别名机制(原文为Aliasing,别名,即Java中的多态)意味着多个引用变量可以定位到同一个实际物理对象,而这些引用变量可以是不同的类型。

下面的代码中,S类继承P类, pp 和 ss 分别是P类型 和 S类型的两个数组变量名。

[java]

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中,将不会有什么编译期错误:

[java]

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

}

}

但在运行期将会显示如下错误:

[plain]

Exception in thread "main" java.lang.ArrayStoreException: think.TestPolyMorphism$P

at think.TestPolyMorphism.main(TestPolyMorphism.java:22)

原因是Java在运行时才处理别名引用,在程序运行过程中,虚拟机发现 数组pp的第一个元素是 SS类型的对象,而不是PP类型的。

因此,只有修改为正确的代码,才可以正常运行:

[java]

S[] arr = new S[10];

P[] pp = arr;

pp[1] = new S();

pp[1].print("你好");

输出没有错误:

[plain] view plaincopy在CODE上查看代码片派生到我的代码片

S-->你好

温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,谢谢合作!

已有 0/1465 人参与

发表评论:



手Q扫描加入Java初学者群