我对多态的理解就是:完成某个任务,不同对象去做出现不同状态。
如何去实现这个效果,利用动态绑定加重写方法。
什么是动态绑定呢?与其相对应的是静态绑定。静态绑定的意思是编译时就已经知道要执行哪一个方法了,十分确定。而动态是在执行时候才知道。如图:
dog是animal的子类,对eat方法进行了重写。这个时候在main里实例化调用eat方法,其实后台编译的是Animal的eat()方法,而运行的是dog的eat方法。这里就发生了动态绑定。
以此类推,如果再有cat子类,bird子类.....只要实例化时,引用变量(animal)是父类类型,但是在堆里创建了一个子类Dog对象,就会触发动态绑定。实现的方法就会是子类里重写的方法。
用一个简单的话说白了就是:
调用普通方法:看骨子里真实 Dog; 访问变量、静态方法:只看外表 Animal。
那么问题来了。这个代码里还有子类自己的方法,父类是看不到的,那我这个引用变量可以访问子类独有的dark方法么?
答案是不行。因为编译阶段只看了Animal类,处理器不知道dark()方法,我们的结局方法是向下转型。代码如下:
Animal animal = new Dog(); Dog dog = (Dog) animal;
我一开始觉得这个代码就和有毛病似的,先是dog对象向上转型成Animal,又给向下转型成dog,为啥不一开始就直接创建Dog对象呢?实际上在现实中很有可能Animal有一大堆的子类,方法重写了一大堆,你也不知道返回值是啥类型的了。
if(a instanceof Dog){ Dog d = (Dog) a; //这时候向下转型就有意义了! d.dark(); }通过instanceof关键字证明是dog子类,然后对应向下转型就好了,就可以使用dog独有的方法了。
最后,什么无法实现多态。
第一构造方法不行,因为不能发生重写。
第二,静态方法不行,静态方法绑定在类里,编译什么执行什么,不能重写。
第三,final修饰的方法,和final修饰的类里的方法。final的作用就是禁止重写。
如果有问题,大佬一定要指出来救救小白谢谢大家。