第一次听说这句话实在学习设计模式的时候,当时很不理解,自己在重构机房验收的时候又听师傅提起,想比这个是很重要,所以就试着了解学习,现在不深刻,只是浅浅的认识,以后还有机会体会!
什么叫父类引用指向子类对象
父类:Anima;子类:Cat、Dog
Animal A=new Cat()
A就是所说的定义的父类引用,可以指向实例化的Cat子类对象。这也就是向上转型。
比如Animal类有个Eat()方法,子类Cat,Dog,重写父类Animal的Eat()方法
看一个例子
Animal [] Animals={new Cat(),new Dog()}; ‘声明一个数组,包括了实例化的Cat和Dog。
foreach(Animal Anm in Animals) ‘当用循环调用时
{
Anm.Eat(); ‘现在调用子类的方法可以写成这样
}
其中Anm.Eat()在运行时就分别指的是new Cat ()和new Dog()两个子类对象实例的Eat方法。
这样在调用子类对象的时候就不必写成Cat.Eat()和Dog.Eat()用Anm.Eat就可以调用是有实例化的子类的方法。如果现在又增加了子类Pig,在数据中增加newPig()后在数组中的Anm.Eat()方法就直接的调用的Pig的Eat()方法,无需改动。
看到子类继承父类就想到了多态,重写是多态的一种
重写:即子类继承了父类/接口的方法之后对该方法进行重新的实现。
重载:是在一个类中对同一个方法以不同的参数进行区别,然后定义不同的实现方法
重写
父类中的方法可以被子类进行重写,这样在调用父类的方法时实际上是调用的是子类的重写过的方法。父类可以由多个子类继承然后重写方法,这样定义的父类引用就可以调用不同子类对象的方法,实现多态。
那么多态又是怎么实现的呢?
动态链接
父类中的方法没有被子类进行重写时父类的引用可以调用父类中的该方法,但是如果方法被子类的对象重写那么父类引用就是调用的子类的方法,这就是动态链接。
注意
父类引用只能够调用在父类中也进行了定义的属性和方法,而子类进行扩展的在父类中没有进行定义的父类引用是不可以调用。
小结:
对知识的学习是需要一个过程的,我们不能期待一下子就懂了、通了,每次遇见的时候都去再次的学习,每次都会有不同方面的体会,越来越感受到二八定律和米老师常说的“不会了就挂起来,以后再解决”的含义!