Java多态和动态绑定的简单理解

废话不多说,先放上一段测试代码:

		People[] stuff = new People[3];
		RichPeople rich = new RichPeople("Recluse", 20, 1080, 3000);
		stuff[0] = rich;
		stuff[1] = new People("John",18,100);
		stuff[2] = new People("Amos",19,2000);
		rich.addDeposit(100);
		for(People u:stuff)
			System.out.println(u.getName()+" has "+u.getMoney()+" dollers~");

在遍历stuff数组的时候,可以用u既表示People类又表示RichPeople类,一个变量表示多种实际类型,这种现象就是多态(Polymorphism);
在调用方法的时候,Java会自动选择调用的方法,这是动态绑定(Dynamic Binding);

多态表明程序中出现超类对象的任何地方都可以 用子类对象置换。
Java中对象变量是多态的,不能将一个超类的引用赋给子类
在Java的多态中,上面的stuff声明的是People类型,但是在stuff[0]我将他指向了一个RichPeople对象,这样的子类引用指向父类对象的行为是可以的, 因为在不同的子类中重写了不同的父类方法,而每一个子类对象都一定也是一个父类对象;反过来父类引用指向子类对象的操作是不被允许的;
如果指向的类型不匹配会发生ArrayStoreException异常;

总结一下,Java的多态就是指,声明变量时,可以声明为父类A,但是在构造对象,或者说实例化的时候,只能实例化为其任意子类B或者其本身对象A,如果声明为A的父类C则会产生ArrayStoreException异常;

关于动态绑定:
程序绑定是把方法和方法所在的类关联起来;
静态绑定有一些方法,是static, final, private的,或者是构造器,这两种情况是静态绑定的,因为可以确定这些方法所属的类一定是当前的类;
动态绑定有些方法,可能提供了多种不同的输入参数,所以在运行时需要根据具体对象的类型进行绑定,选择最合适的进行调用;

具体的Java方法调用过程和动态绑定过程如下:
Java方法调用过程和动态绑定过程

  附上一篇blog :    java的动态绑定与静态绑定(彻底理解多态与重载)

猜你喜欢

转载自blog.csdn.net/qq_33982232/article/details/82826702