面相对象7——多态

。Java引用变量类型

       。。编译时类型:由声明变量时使用的类型决定

       。。运行时类型:由实际赋给该变量的对象决定

。当编译时类型和运行时类型不一致,则可能出现所谓的多态(Polymorphism)

多态性

。示例

package test;

import javax.security.auth.Subject;

class BaseClass{
   public int book=6;
   public void base()
   {
      System.out.println("父类普通方法");
   }
   public void test()
   {
      System.out.println("父类被覆盖的方法");
   }
}
public class Test extends BaseClass{
   public String book="book1";
   public void test()
   {
      System.out.println("子类的覆盖父类的方法");
   }
   public void sub()
   {
      System.out.println("子类普通方法");
   }

   /**
    * @description:main方法
    * @param args
    */
   public static void main(String[] args) {
      /*编译时类型与运行时类型相同*/
      BaseClass bc=new BaseClass();
      System.out.println(bc.book);
      bc.base();//父类的base方法
      bc.test();//父类test方法
      System.out.println("---------------");

      /*编译时类型与运行时类型相同*/
      Test test=new Test();
      System.out.println(test.book);
      test.base();//父类的base方法
      test.test();//子类的test方法
      System.out.println("---------------");

      /*编译时类型(BaseClass)与运行时类型(Test)不同,发生多态*/
      BaseClass ploymophicBc=new Test();
      System.out.println(ploymophicBc.book);//访问父类对象的实例变量
      ploymophicBc.base();
      ploymophicBc.test();//执行Test中的test方法,发生多态
      ((Test) ploymophicBc).sub();//BaseClass没有提供sub方法,进行强转
   }
}

。结果

。分析

  。。bc和ploymophicBc同样是BaseClass类型,调用同一个方法test(),但在运行时所呈现的结果不同

  。。这种相同类型的变量、调用同一个方法时呈现出来多种不同的行为特征,即为多态

  。。执行ploymophicBc.sub();时,虽然该引用变量含有sub方法,但其编译时类型BaseClass,则无法调用Test当中的sub方法。

引用变量的强制类型转换

。引用类型就之间的转换只能在具有继承关系的两个类型之间。

  。。如上实例当中,若要把一个父类实例转换成子类实例,则该对象必须实际上为父类实例才可以(即编译类型为父类类型(BaseClass),运行时类型为子类(Test))。否则抛出ClassCastException异常

instanceof运算符

。强制类型转换之前,通过instanceof运算符判断能否转换,从而避免ClassCastException异常,进而使程序更加健壮

。引用变量类型 instanceof 类(接口):判断前面的对象是否是后面的类或其子类的实例;如果是返回true,否则返回false

。注意:instanceof前面的操作数的编译时类型与后面的类要么是相同类型,要么与后面的类具有父子继承关系,否则会发生编译错误

。举个例子

  。。实例

package test;

public class InstanceofTest {
    public static void main(String[] args) {
        //hello的编译类型为Object,Object是所有类的父类
        Object hello="hello";
        System.out.println("字符串是否是Object的实例:"+(hello instanceof Object));
        System.out.println("字符串是否是String类的实例:"+(hello instanceof String));
        System.out.println("字符串hello是否是Math类的实例:"+(hello instanceof Math));
        System.out.println("字符串hello是否是Comparable接口的实例:"+(hello instanceof Comparable));//String实现了Comparable接口
    }

}

  。。结果

posted @ 2018-06-27 11:46  Demetris  阅读(293)  评论(0编辑  收藏  举报