面相对象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接口
    }

}

  。。结果

转载于:https://www.cnblogs.com/Demetris/p/9233214.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值