继承与多态——动手又动脑
1.首先,第一次执行完源代码后
了解到当调用一个子类的构造方法时,它会依次调用父类的构造函数。以下是原因:当一个类继承了其它类时,在它的构造函数(constructor)中super()
必须被首先调用,如果super()
没有被调用,则编译器将在构造函数(constructor)的第一行插入对super()
的调用。这就是为什么当创建一个子类的对象时会调用父类的构造函数(constructor)的原因。
通过super调用基类构造方法时,必须是子类构造方法中的第一个语句。否则就会报错
构造一个对象,先调用其构造方法,来初始化其成员函数和成员变量。
子类拥有父的成员变量和成员方法,如果不调用,则从父类继承而来的成员变量和成员方法得不到正确的初始化。
不能反过来调用也是这个原因,因为父类根本不知道子类有什么变量而且这样一来子类也得不到初始化的父类变量,导致程序运行出错!
2.
代码:
1 /* 2 信1705-1 杨瑞 20173610 3 */ 4 package dongshouyoudongnao; 5 class A 6 { 7 public void display() { 8 System.out.println("A方法"); 9 } 10 } 11 class B extends A 12 { 13 public void display() { 14 super.display(); 15 System.out.println("B方法"); 16 } 17 } 18 public class Fruit 19 { 20 public static void main(String[] args) { 21 B b=new B(); 22 b.display(); 23 } 24 }
![](https://img2018.cnblogs.com/blog/1438583/201811/1438583-20181101215130767-1904761896.png)
子类对象可以直接赋给基类变量。
基类对象要赋给子类对象变量,必须执行类型转换。
4.
第一个创建一个Parent对象,调用的是父类的方法,第二个创建一个Child对象,调用的是子类的方法,第三个将子类child的值赋给了parent,调用的是子类的方法,第四个parent.myValue++是对父类中的变量进行自加运算,而parent.printValue()实际上调用的还是子类的方法,第五个((Child)parent).myValue++是将parent对象强制转化成Child,所以指向的是Child类中的变量,进行自加运算之后输出。
当子类和父类拥有同样的方法,对象是子类型的,就调用子类型的方法;对象是父类型的,就调用夫类型的方法。
如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。
5.
多态依赖于类型和实现的分离,多用来把接口和实现分离。
使用多态最大的好处是:
当要修改程序并扩充系统时,需要修改的地方较少,对其它部分代码的影响较小!千万不要小看这两个“较”字,程序规模越大,其优势就越突出。