博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面相对象7——多态
阅读量:6050 次
发布时间:2019-06-20

本文共 2392 字,大约阅读时间需要 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

你可能感兴趣的文章
大数据分页方案
查看>>
一个前端写的php博客系统2--前台展示+后台登录
查看>>
数据库管理平台NetopGO简介
查看>>
Struts2拦截器
查看>>
[LintCode/LeetCode] Combinations
查看>>
PyTips 0x0f - Python 修饰器与 functools
查看>>
[译]剖析勇士如何成为新赛季夺冠热门:基于Spark GraphFrames的金州勇士传球网络分析...
查看>>
Memcache
查看>>
OpenGL ES2 学习教程2——HelloOpenGLES2.0
查看>>
Hexo的安装与配置
查看>>
Xcode中修改变量名、类名及字符串的替换操作
查看>>
scrapy简单学习2—解析简单的spider代码
查看>>
js 事件详解1--事件流
查看>>
[CS101] Operating System and Low Level Fundamental 操作系统及底层基础面试题
查看>>
JavaScript 中的 for 循环
查看>>
SegmentFault D-Day 南京站:开源专场回顾
查看>>
Windows 10 UWP: Hello, World!
查看>>
IOS项目打包除去NSLog和NSAssert处理
查看>>
非变易算法 - STL之算法
查看>>
django 1.8 官方文档翻译:7-3 Django管理文档生成器
查看>>