zoukankan      html  css  js  c++  java
  • Java对象引用处理机制

      广州疯狂软件学院拥有三大课程体系包括:java课程,android课程,ios课程,本文主要讲述Java对象引用处理机制,更多java知识,android知识,ios知识,疯狂软件官网持续更新中。

      什么是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引用。)

      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-->你好

      广州疯狂软件让学生掌握主流的、前沿Java web开发技术,熟练使用Struts,、Hibernet、Sping,掌握Ajax和Webservice技术。通过各种全真企业项目训练熟悉企业软件开发流程,能够独立设计开发Web应用程序,具有直接进入企业工作的能力。疯狂软件培训www点fkjava点org专注于高端软件编程培训,技术知识沉淀深厚的老师,让你感受Java的魅力,激发你对于编程的热爱,通过短短几个月的时间,让你在半年的时间内掌握8-10万的代码量,掌握Java核心技术,迅速成为技能型的现代化高端人才,迅速获得高薪就业!

  • 相关阅读:
    lua版本的一个状态机
    unity getcomponentsinchildren 翻船
    dotween tips
    ulua c#调用lua中模拟的类成员函数
    洗牌算法
    unity的一些tips
    用Unity写一个12306验证器的恶搞图生成软件
    好久没写Blog了
    蛋疼的时候写三消游戏(十三)
    用DropBox分享Unity3D的Web应用
  • 原文地址:https://www.cnblogs.com/gojava/p/3441454.html
Copyright © 2011-2022 走看看