谈谈多态

概述设计模式

咱们都知道面向对象有四个基本特性:抽象、封装、继承、多态。这四个特性,归纳起来能够这么理解,抽象、封装、继承是多态的基础,多态是抽象、封装、继承的表现。多态,是Java中很是重要的一个部分,因此今天来谈一下多态(Polymorphism)。学习

 

什么是多态spa

不一样类的对象对同一消息做出不一样的响应就叫作多态。就像上课铃响了,上体育课的学生跑到操场上站好,上语文课的学生在教室里坐好同样。设计

 

多态的做用对象

简单讲就是解耦。再详细点讲就是,多态是设计模式的基础,不能说全部的设计模式都使用到了多态,可是23种中的很大一部分,都是基于多态的。继承

 

多态存在的三个条件编译器

一、有继承关系  编译

二、子类重写父类方法  基础

三、父类引用指向子类对象原理

补充一下第二点,既然多态存在必需要有“子类重写父类方法”这一条件,那么如下三种类型的方法是没有办法表现出多态特性的(由于不能被重写):

一、static方法,由于被static修饰的方法是属于类的,而不是属于实例的

二、final方法,由于被final修饰的方法没法被子类重写

三、private方法和protected方法,前者是由于被private修饰的方法对子类不可见,后者是由于尽管被protected修饰的方法能够被子类见到,也能够被子类重写,可是它是没法被外部所引用的,一个不能被外部引用的方法,怎么能谈多态呢

 

多态的分类

一、编译时多态,即方法的重载,从JVM的角度来说,这是一种静态分派(static dispatch)

二、运行时多态,即方法的重写,从JVM的角度来说,这是一种动态分派(dynamic dispatch)

关于这一点,在写到JVM的时候会详细讲到

/*

看到这里我不知道博主JVM角度是否说的正确,可是从编译阶段(编译器角度来讲是正确的)

*/

分析多态问题的几条原则

若是不去理解多态的原理,就从使用的角度来说,以我的的学习、工做这几年的经验,总结出了多态无非就是三句话:

好比咱们有一个父类Father,有一个子类Children

一、向上转型是自动的。即Father f = new Children()是自动的,不须要强转

二、向下转型要强转。即Children c = new Father()是没法编译经过的,必需要Children c = (Children)new Father(),让父类知道它要转成具体哪一个子类

/*

这里的向下转型说的很好。让父类知道它该转换成哪一个子类。(孔子他爹和孔子,可是孔子他爹有好几个儿子,儿子个个能假装成他爹,他爹假装他们时要知道去假装成谁)

*/

三、父类引用指向子类对象,子类重写了父类的方法,调用父类的方法,实际调用的是子类重写了的父类的该方法。即Father f = new Children(),f.toString()实际上调用的是Children中的toString()方法

相关文章
相关标签/搜索