动手又动脑——继承与多态
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方法中最后两句。