美文网首页
摘掉她朦胧的面纱,撕掉她模糊的纱衣,剩下的...

摘掉她朦胧的面纱,撕掉她模糊的纱衣,剩下的...

作者: 威哥爱编程 | 来源:发表于2016-08-30 09:27 被阅读23次

    【威哥说】王健林一句话,刷爆了朋友圈。“先定一个能达到的小目标,比方说我先挣它一个亿”。好吧,也许我们没有那样的霸气,至少我们可以实现这样“先定一个能达到的小目标,比方说学会多态”。

    【插播】昨天威哥直播效果不错,很多小伙伴都积极提问,希望大家学有所成,下周一小白老师继续直播关于APP那些你还不懂的故事。希望大家前来学习。

    【正文】今天带大家深入理解面向对象的三大特征之一多态。

    多态:同一事物的多种形态。

    首先咱们举几个例子来说明多态的概念。话说威哥儿子leo比较喜欢小动物,所以家里养了小猫,小狗和乌龟。咱们学了继承关系,所以如果有分析的话需要四个类:

    共同的父类:Pet(宠物)

    abstract class Pet{

    abstract void run();

    }

    针对小狗我们会有一个狗类,来继承宠物类,并重写run的方法:

    class Dog extends Pet{

    void run() {

    }

    }

    此时我们根据之前面向对象知识,如果说创建一个狗类的话写法是:

    Dogd = new Dog();

    也就是声明一个狗类型的变量,并通过构造方法完成初始化,现在我们可以说有一只小狗叫做d;现在看着迎面跑来的这个小狗,威哥笑着对leo说:“leo,你的小宠物跑来了”。注意这里的重点,你的小宠物跑过来了,你的小宠物,对,你没看错,是小宠物,那么咱们这个现实生活中的逻辑在代码里同样是通的,具体表现为:

    Pet d = new Dog();

    也就是说,我们有一只狗,我们也可以叫做小宠物,专业叫法叫做:

    父类引用指向子类对象

    那有人说这个怎么跟多态能扯上关系,简单点理解就是一个对象,多种形态,左边是一种宠物形态,右边是一个狗形态,这不就是多态么。

    理解了多态的概念,那么咱们看看在程序中多态具体体现在那些方面:

    1、对象的多态性:

    我们看看对象的多态性如何引申出来。

    现在我们要调用的话就是,在测试类中直接定义run方法,传入Dog类型的参数,然后在主方法中创建Dog对象,直接调用run方法,传入dog,具体代码如下:

    public static void main(String[] args) {

    Dog dog = new Dog();

    run(dog);

    }

    public static void run(Dog dog){

    dog.run();

    }

    现在我又多了一个猪类:

    猪类:

    class Pig extends Pet{

    void run() {

    }

    }

    此时猪受宠了,leo又想看猪蠢萌的跑法了,那么此时又得定义

    public static void main(String[] args) {

    Dog dog = new Dog();

    run(dog);

    Pig pig = new Pig();

    run(pig);

    }

    public static void run(Dog dog){

    dog.run();

    }

    public static void run(Pig pig){

    pig.run();

    }

    然后在main方法中创建Pig对象,然后调用run方法将pig对象传入进去。

    哎,此时咱们帅气的leo小男神看了龟兔赛跑,又想看乌龟跑了,那么此时得创建一个乌龟类:

    乌龟类:

    class Tutle extends Pet{

    void run() {

    }

    }

    同样的,需要调用的话,又得写一个方法,传入乌龟的参数类型,具体如下:

    public static void main(String[] args) {

    Dog dog = new Dog();

    run(dog);

    Pig pig = new Pig();

    run(pig);

    Tutle tutle = new Tutle();

    run(tutle);

    }

    public static void run(Dog dog){

    dog.run();

    }

    public static void run(Pig pig){

    pig.run();

    }

    public static void run(Tutle tutle){

    tutle.run();

    }

    此时我们发现run方法是大量的重复,而且处理都是直接调用run方法,那么咱们之前也说了父类引用能指向子类对象,那么咱们就可以直接来个升级版:

    public static void run(Pet pet){

    pet.run();

    }

    此时,不管你传入狗还是猪还是乌龟,都可以直接调用抽取出来的run方法,因为我们说了无论是狗,乌龟,还是猪都属于宠物类型,都可以直接

    public static void main(String[] args) {

    Dog dog = new Dog();

    run(dog);

    Pig pig = new Pig();

    run(pig);

    Tutle tutle = new Tutle();

    run(tutle);

    }

    此时结构就很明朗了,那么此时我们显而易见的是我们可以总结出扩展的好处了:

    a) 提升了代码的复用性;

    并且,我们还有一点就是,如果后边leo又准备买一只兔子,那么我们可以直接使用run方法,创建兔子对象传入即可,所以,此处还有第二个好处:

    b) 提高了代码的扩展性,前面定义的结构利于后边使用。

    当然,针对接口也是一样的,上面的父类指父类结构,包括父类和父类接口。

    2、方法的多态性

    方法的多态性包括方法的重载,方法的重写等。同样也是一个事物多种形态的体现。

    此处我们简单跟大家总结一下重载和重写的概念:

    重载:同一类中,方法名相同,参数列表不同,返回值类型不能作为重载的判断条件

    重写:子父类中,方法名相同,参数列表相同,返回值相同,子类重写的权限要不小于父类方法的权限,子类中抛出的异常不能大于父类中抛出的异常。

    相关文章

      网友评论

          本文标题:摘掉她朦胧的面纱,撕掉她模糊的纱衣,剩下的...

          本文链接:https://www.haomeiwen.com/subject/xjyfettx.html