• 动手又动脑——继承与多态


    1.为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来?

             因为构造方法是用来初始化类的成员属性的,由于子类继承父类,拥有父类的成员属性,要对这些属性赋值,就要通过父类的构造方法。因此不能反过来。

    2.何为多态?
             面向对象的程序设计语言中,多态大致分为静态多态和动态多态。静态多态又称为编译时多态,具体表现为方法的重载。动态多态又称运行时多态,指利用父类引用子类的对象,并且对子类中已经重写的同名方法进行调用的过程,这个过程中需要动态绑定。比如有一个类base,类中有方法show(...),由它派生出几个子类。当base对它子类的对象进行引用,并调用这个show(...)方法时,如果该子类没有重写show(...)方法,那么会直接调用子类从base类中继承来的show()方法,但如果子类重写了这个方法show(...)(注意参数表不能改变),那么子类中将不在存放那个由父类继承来的show(...),而是存放已经重写的这个show(...)方法,这个时候父类会调用子类中的show(...)方法。而且最重要的一点是,多态是对于方法而言,与属性变量一点关系也没有。换言之

    看下面这个例子:

    应系主任要求我先预测下输出结果:

    Parent.printValue(),myValue=100
    Child.printValue(),myValue=200
    Child.printValue(),myValue=200
    101
    Child.printValue(),myValue=200
    Child.printValue(),myValue=201

    结果我的预测是对的,至于原因上面多态概念解释的差不多了,总之就是父类引用指向子类对象时,调用的方法如果子类未重写就调用父类的,反之相反,对于属性变量而言没有多态一说,所以尽管上面的例子中子类child重新定义了一个重名的属性变量myValue,不过parent的myValue是parent的myValue,child的myValue是child的myValue(就好像你老婆是你老婆,你妈是你爹的老婆一样),两个myValue变量只是一个覆盖了另一个,仅此而已,没有什么其他关系,和多态更是八竿子打不着。除非对父类的引用进行强制转换,比如上面这个例子中main方法中最后两句。

  • 相关阅读:
    常见排序算法基于JS的实现
    PubSub的一种实现
    小结JS中的OOP(下)
    自己的一个LESS工具函数库
    小结JS中的OOP(中)
    小结JS中的OOP(上)
    表单的常用操作
    动手写插件之日历插件
    数组排序,字符串math,replace练习
    C++ Const(常类型)的作用总结
  • 原文地址:https://www.cnblogs.com/messi2017/p/7802245.html
Copyright © 2020-2023  润新知