将父类的引用指向子类对象,引用在调用方法时,可根据子类对象的类型调用正确的方法,这就是多态。
1. 子类对象会从继承树的最下方开始查询,调用最先找到的方法,所以如果子类覆盖了该方法,调用的是自己的方法。
如果覆盖的方法仍需父类的方法,可以在子类的重写方法中增加super.method(),当然这个不需要再子类方法的第一行,构造 函数中才要求在第一行调用super(),不要混淆。
2. 但是以上的方法,针对的是父类中已经声明过的方法,正确的方法指的是子类中覆盖的方法。
3. 如果是子类另外增加的方法,通过父类引用的无法调用的,因为编译器是根据引用类型来判断有哪些方法可以调用,父类中没 有该方法。
4. 将父类的引用指向子类对象,如果再将这个引用赋给另一个子类引用,会报错。
Father father = new Son();
Son son = father; //报错,不兼容的类型,无法将Father转换成Son