天天看点

什么是多态为什么要用多态多态存在的三个必要条件多态怎么用

目录

什么是多态

为什么要用多态

多态存在的三个必要条件

多态怎么用

   A、引用多态

   B、方法多态

什么是多态

多态就是一个对象变量可以指向多种实际类型的现象,同一个事件发生在不同的对象上会产生不同的结果。   

多态也叫后期(动态)绑定(在运行时根据对象的类型进行绑定)

前期绑定:非面向对象编程,编译器会产生对一个具体函数的调用,运行时调用代码的绝对地址。c语言的调用就是前期绑定,而java除了static和final方法,其他都是后期(动态)绑定,换一个角度来说:多态不能作用于static和final

后期绑定:直到向对象发送消息时,才能确定被调用的代码

为什么要用多态

好处:使用多态可以消除类型之间的耦合关系

           通过分离做什么和怎么做,从另一角度将接口和实现分离开来。

弊端:不能用子类方法,可用转型的方法解决(下面会有说到)

多态存在的三个必要条件

  • 继承
  • 重写
  • 父类引用指向子类对象:fu p=new zi();

多态怎么用

      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(编译时多态)。

什么是多态为什么要用多态多态存在的三个必要条件多态怎么用
什么是多态为什么要用多态多态存在的三个必要条件多态怎么用

继续阅读