-----------------------------------------------------------------------------------------题记
关于动态多态的一些测试和个人的理解。
-----------------------------------------------------------------------------------------代码(附详细注释)
package polymorphic.dynamic;
public class Father {
public String name = "Father";
public static void main(String[] args) {
/*
* 动态多态:
*
* 指在调用方法后,在运行的时候才能决定到底是调用父类的方法还是子类的方法,
*
* 若子类没有重写父类的方法,则调用父类的方法,
*
* 若子类重写父类的方法,则调用子类的方法。
*/
//----------------动态多态(【子对象】的【父引用】强转【子引用】 --代码片段1)----------------
/*
* 多态的作用:把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
*
* eg:马和牛都继承动物(即都属于动物),那么有:
*
* 动物 animal1 = new 牛();
*
* 动物 animal2 = new 马();
*
* 若有参数列表,如:public void function(动物 animal){},
*
* 那么animal1和animal2都可以放入该参数列表,因为牛和马都是动物。
*
* 另,new不同类的对象的原因就是要使用其中的不同的成员方法和成员变量(因为子类可能发生方法的重写),
*
* 所以有animal1.run(),则调用牛重写的的run()(若牛类重写run()),而animal2.run(),调用马重写的run()(若马类重写run()),
*
* 即,同一个类中的方法(都是由父类继承过来的方法)表现出来不同的状态(功能),这就是动态多态。
*
*/
Father father1 = new Son();
//由多态产生强转
/*
* 在使用过程中将其进行强转的原因:该引用是对父类的成员变量和成员方法的引用,故无法引用子类扩展的成员变量或者方法。
*/
Son son1 = (Son) father1;
System.out.println(son1.name);
//----------------运行异常1(【父对象】的【父引用】强转【子引用】 --代码片段2)----------------
Father father2 = new Father();
/*
* father2是对Father类的引用,son2是对Son类的引用,
*
* son2可以引用到更多的成员方法和成员变量(子类扩展的成员方法和成员变量),
*
* 而son2即将所指向的对象(即father2所指向的对象)是不能满足其引用所能够调用的全部成员方法和成员变量。
*/
Son son2 = (Son) father2;
//----------------运行异常2(【子对象间】的【子引用】相互强转 --代码片段3)----------------
Father father3 = new Daughter();
/*
* 同理,daughter和son相对父类扩展的成员变量或方法可能不一样,故无法相互引用。
*/
Son son3 = (Son) father3;
}
}
class Son extends Father {
public String name = "son";
}
class Daughter extends Father {
public String name = "daughter";
}