活动地址:CSDN21天学习挑战赛
1. 多态的概念
1.1 概念
多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。
2. 多态的定义及实现
2.1多态的构成条件
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。
那么在继承中要构成多态还有两个条件:
必须通过基类的指针或者引用调用虚函数
被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写
对象的转型(casting)
父类引用指向子类对象,我们称这个过程为向上转型,属于自动类型转换。
向上转型后的父类引用变量只能调用它编译类型的方法,不能调用它运行时类型的方法。这时,我们就需要进行类型的强制转换,我们称之为向下转型!
多态怎么用
A、引用多态
父类的引用可以指向本类的对象;
Fu fu=new Fu();
父类的引用也可以指向子类的对象;
Fu fu =new Zi();
剖析:Fu fu=new Zi();
这句话分为两段,下面这样写会更加明确些
1、Fu fu ; 声明一个变量fu为Fu这个类,
2、fu=new Zi(); 创建一个Zi类对象赋给了fu变量
这句话的作用是得到了一个被Zi类函数覆盖后的Fu类对象:fu
明确:fu是Fu类的,更具体的说是被zi类覆盖后的fu类的对象!从头到尾都是fu类。
进一步结论: 【多态时成员变量、静态方法和非静态方法的特点】
1、fu类原有的变量和静态方法(因为没被zi类覆盖的方法)没有任何变化,所以编译和运行都看fu类。
2、而fu类中的非静态方法(被zi类覆盖)发生了变化,在编译阶段看fu类的(看fu类有没有,有的话编译通过),运行的时候运行的是zi类的代码。
(其实对于静态方法,是不需要对象的。直接用类名调用即可。)
B、方法多态
根据上述创建的两个对象:本类对象和子类对象,同样都是父类的引用,当我们指向不同的对象时,它们调用的方法也是多态的。
创建本类对象时,调用的方法为本类方法;
创建子类对象时,调用的方法为子类重写的方法或者继承的方法;
使用多态的时候要注意:如果我们在子类中编写一个独有的方法(没有继承父类的方法),此时就不能通过父类的引用创建的子类对象来调用该方法!!!(因为fu是Fu对象,他并没有子类的方法)
多态也会涉及到向上转型和向下转型(都是编译时期的转型),而向下转型又可以引出泛型
【
转型:
·向上转型:【自动】父类 父类对象 = 子类实例;
Fu f=new zi();
·向下转型:【强制】子类 子类对象 = (子类)父类实例;
Zi z=(zi)f;
】
多态一般可以分为两种,一个是重写override(运行时多态),一个是重载overload(编译时多态)。