一起Talk Android吧(第十二回:Java中的多态)
来源:互联网 发布:怎么样才能做好淘宝店 编辑:程序博客网 时间:2024/04/27 18:18
各位看官们,大家好,上一回中咱们说的是Java中继承的例子,这一回咱们说的例子是Java中的多态。闲话休提, 言归正转。让我们一起Talk Android吧!
看官们,我们今天介绍的内容是面向对象知识中的精华:多态。多态体现为子类对象向父类对象的转换,以及通过父类对象调用子类对象的方法。这么说肯定是很抽象的,还和以前一样,我们通过伪代码来演示多态。
class A{ permission type valA; permission func1() { //do something } };class B extends A{ permission type valB; permission func1() { //do something }; permission func2() { //do something } };A objA = new A(); B objB = new B(); objA.func1(); // call the func1 of A objB.func1(); // call the func1 of BobjA = objB; // change the type of class, but can't do this: objB = objA;objA.func1(); // call the func1 of BobjA.func2(); // can't call the func2 of B
上面的代码中,类B继承于类A,它除了继承到类A的成员变量和成员函数外,它还定义了自己的成员变量valB和成员函数func2。不过它也定义了一个成员函数func1
,从继承的角度看,它已经从类A继承了成员函数func1
,它自己再定义一个func1,是不是就有两个成员函数func1了呢?不是这样的,它只有一个成员函数func1。按照Java中的语法规则来看,如果类A中的func1
是抽象函数,那么类B的这种做法叫作实现;如果类A中的func1
不是抽象方法,那么类B的这种做法叫重写或者覆写(覆盖)
。在我们的伪代码中,显然是类B重写了类A中的func1
方法。重写使的我们可以使用类A的对象objA调用类B中的方法func1
,这便是多态。
从伪代码中我们也可以看到,如果没有重写方法的话,类A的对象是不能调用类B中的方法func2。
关于重写,需要注意的是子类和父类的中函数原型必须完全一致,这样才能算作子类重写了父类的方法,如果函数原型不一致,那么就不是重写了,那是什么呢?这时有看官说:重载。没错,就是重载。这是一种跨类的函数重载
。这种函数重载跨越了类的继承体系结构,比起在同一个类中重载来说,这种跨类的重载不容易发现。看来刚才回答的看官有一双雪亮的眼睛呀,哈哈。
我们继续看上面的伪代码,类B的对象objB可以转换为类A的对象objA,这也是一种多态,反之则不可以。不过如果如果类A的对象是从类B的对象转换过来的,那么它还可以再转换回原来的类型。也就是说:如果先执行objA = objB
后,那么就可以执行objB = objA
。
类型的转换容易发生错误,因此我建议大家在转换前使用instanceof关键字,它可以判断某个对象的类型。它的用法如下:
object instanceof ClassName;
如果object的类型属于ClassName的类型,那么它返回true,否则返回false。我们结合上面的伪代码再写以下伪代码:
A objA = new A(); B objB = new B(); objA instanceof A; //it return true objB instanceof B; //it return trueobjA instanceof B; //it return false objB instanceof A; //it return false objA = objB; // change the type of classobjA instanceof A; //it return true objA instanceof B; //it return true
从上面的伪代码中可以看到,通过instance关键字可以判断出某个对象的类型,进而为不同类型对象的转换创造出安全的前提条件。当然了,它只适用于Class类型,其它基本的类型(比如int),是不适用的。
看官们,多态是面对对象知识中比较重要而且难理解的知识,希望大家结合我们提供的伪代码来思考,这样会容易理解一些,而且可以把抽象的知识转换具体的知识,在以后写代码的时候也会使用到。
各位看官,关于Java中多态的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!
- 一起Talk Android吧(第十二回:Java中的多态)
- 一起talk Vim吧(第十二回:Vim逍遥刀法)
- 一起Talk Android吧(第十一回:Java中的继承)
- 一起Talk Android吧(第三十二回:Android中的Activity四)
- 一起Talk Android吧(第四十二回:Android中的Fragment七-动态加载)
- 一起Talk Android吧(第五十二回:Android中的Fragment交互续)
- 一起Talk Android吧(第二回:Java版Hello World)
- 一起Talk Android吧(第二十二回:Java常用类之文件操作二)
- 一起talk C栗子吧(第十二回:C语言实例--单链表一)
- 一起Talk Android吧(第十回:Java中的封装:二)
- 一起talk Vim吧(第二回:Vim变脸)
- 一起talk GCC吧(第二回:GCC使用)
- 一起Talk Android吧(第五回:Java中的程序结构)
- 一起Talk Android吧(第六回:Java中的函数)
- 一起Talk Android吧(第十四回:Java中的异常)
- 一起talk C栗子吧(第一百五十二回:C语言实例--计算机中的大小端)
- 一起talk C栗子吧(第一百七十二回:C语言实例--关闭终端中的回显功能三)
- 一起talk Vim吧(第二十二回:Vim大结局)
- 数组那些不为菜鸟所知的秘密(一)
- Android之从特定目录读取和写入数据
- TensorFlow 实战(一)—— 交叉熵(cross entropy)的定义
- 彻底解决Spring MVC 中文乱码 问题
- EF中查看上下文执行的Sql语句
- 一起Talk Android吧(第十二回:Java中的多态)
- [BZOJ4771][七彩树][可持久化线段树在线转离线+LCA+Set]
- Mac系统终端命令行不执行命令 总出现command not found解决方法
- 查看liunx 的问题
- VSCode Markdown PDF 导出成PDF报 phantomjs binary does not exist 错误的解决办法
- 设计模式之简单工厂模式
- sql语句基础学习(不涉及多表查询)
- 6 MapReduce之 InputFormat和OutputFormat
- 单词缩写一般习惯