多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

既:使用父类类型来说明变量,并使用子类实例化。

Java实现多态有三个必要条件:继承、重写、向上转型。

继承:在多态中必须存在有继承关系的子类和父类。

重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。

向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。

只有满足了上述三个条件,我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。

对于Java而言,它多态的实现机制遵循一个原则:

当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,

但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。重载和扩展的方法并不能通过父类引用进行调用。

所以对于引用子类的父类类型,在处理该引用时,它适用于继承该父类的所有子类,子类对象的不同,对方法的实现也就不同,执行相同动作产生的行为也就不同。

也就达成了一种引用类型会有多种状态的形式。

多态中的方法调用优先级:

当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,

但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法,但是它仍然要根据继承链中方法调用的优先级来确认方法,该优先级为:

this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。

用多态减少 if/else if 和 switch 分支

if/else if 和 switch 之争

先说可读性,switch和if..else if是半斤八两的写法,可读性差不多,switch显得更整齐,if else可以更灵活。

他们的条件分支数量是一样的。如果分支数目过多,都非常不利于写unit test,都会容易藏入bug,

都是有坏味道的代码。尤其在分支多时,不是你把if换成switch就能解决问题的。

虽然 switch 有 性能方面上来讲 if/else if 和 switch 差别不大 (条件分支小于450个,一般没有这么多的分支)

1、很多人确实不知道 switch 和 if else 之间到底有什么区别,仅仅知道,这两种方式都能实现同一个目的罢了。

2、就是很多人知道,但并不在在乎他们之间的区别,优势和特点,我能实现我想要的功能和结果就行。

关于 if else

只是单纯地一个接一个比较;if…elseif可能每个条件都计算一遍;

而 switch

使用了Binary Tree算法;绝大部分情况下switch会快一点,除非是if-else的第一个条件就判断到了。

编译器编译switch与编译if…else…不同。不管有多少case,都直接跳转,不需逐个比较查询;switch只计算一次值,然后都是test , jmp,

有很多else if的时候,用switch case比较清晰!

switch使用查找表的方式决定了case的条件必须是一个连续的常量。而if-else则可以灵活的多。

所以,只有分支比较少的时候,if效率比switch高,因为switch有跳转表。

多态并不能消灭条件分支语句,只能减少其使用。

另外多用异常减少使用返回码,也能减少if 的使用