关于Java中的动态多态


-----------------------------------------------------------------------------------------题记


关于动态多态的一些测试和个人的理解。


-----------------------------------------------------------------------------------------代码(附详细注释)

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";
	
}


Java 中,有两种类型的多态:静态多态(也称为编译时多态或早期绑定)和动态多态(运行时多态或晚期绑定)。 **静态多态(编译时多态)**: 静态多态主要是通过函数重载(Overload)来实现的,即在一个类中创建两个或更多的同名方法,它们的参数列表不同(包括参数类型、数量或顺序)。在编译阶段,Java 编译器会根据方法的调用信息(传入的实际参数类型)选择最匹配的方法进行编译,这在代码执行前就已经确定。例如: ```java public class Example { public void print(int num) { System.out.println("Integer value: " + num); } public void print(String str) { System.out.println("String value: " + str); } } Example obj = new Example(); obj.print(5); // 静态多态调用的是 int 的 print() 方法 ``` **动态多态(运行时多态或晚期绑定)**: 动态多态是通过方法重写(Override)和继承机制来实现的。如果一个子类覆盖了父类的方法,那么当父类引用指向子类对象时,调用该方法将执行子类版本。这是通过 Java 虚拟机 (JVM) 在运行时确定调用的具体方法。示例如下: ```java class Parent { public void show() { System.out.println("Parent method"); } } class Child extends Parent { @Override public void show() { System.out.println("Child method"); } } Parent parent = new Child(); // 创建 Child 对象,但引用为 Parent 类型 parent.show(); // 动态多态调用的是 Child 类的 show() 方法 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值