IT业行者,行者无疆
分类:
2011-01-13 16:33:52
当子类的对象来调用父类中的方法时,则执行的是父类只中原有的方法,这和多态不一样,如果子类覆盖掉父类的这个方法时,则调用的是子类的这个方法。
多态:
(1) 前提:把子类对象当成父类对象来看。
(2) 把子类对象当成父类对象来看时:只能调用父类中定义的属性和方法。
(3) 把子类对象当成父类对象来看时:如果子类覆盖了父类中的方法,则调用的 是子类覆盖后的这个方法。但是如果调用属性时是调用父类的属性而并非子类的,所以尽量不要定义父子类同名的属性。
(4) 把父类强制转换成子类时,则调用的是子类中的方法。
把子类对象当成父类对象来看时:只能调用父类中定义的属性和方法。
把子类对象当成父类对象来看时:如果子类覆盖了父类中的方法,则调用的 是子类覆盖后的这个方法。但是如果调用属性时是调用父类的属性而并非子类的,所以尽量不要定义父子类同名的属性。
把父类强制转换成子类时,则调用的是子类中的方法。
类空间、对象空间。
父类空间、子类空间、父类对象空间、子类对象空间。
1--子类覆盖父类的方法(覆写),那么在调用子类中覆写的方法时,
在内存中,子类的方法覆盖了父类的方法(方法的覆盖)。
2--属性的覆盖时,在内存中,子类继承的属性有一个内存块,父类的属性也 有有一个内存快,子类属性在内存中没有覆盖父类的属性(属性的覆盖)。
如果父类指向子类的空间,那么父类只能调用子类继承过去的方法,对于子类自己的方法将无法调用。
如果子类指向子类的空间,那么子类可以调用继承下来的父类的方法和自己的方法。
子类必须覆写父类的方法,才实现多态。
多态的概念比较复杂,有多种意义的多态,一个有趣但不严谨的说法是:继承是子类使用父类的方法,而多态则是父类使用子类的方法。
一般,我们使用多态是为了避免在父类里大量重载引起代码臃肿且难于维护。
静态函数是不支持“多态”的,静态函数根据对象的声明类型调用,非静态函数则根据实际对象类型进行调用。
非静态函数则根据实际对象类型进行调用。
非静态函数根据运行时转换后的实际对象调用。
声明时是子类,转换成父类使用,则调用的是父类方法。但如果子类覆盖父类方法,则调用的是子类方法,此即多态。
声明时是父类,强制转换成子类使用,则调用的是子类方法。子类没有该方法则调用继承自父类的方法。
多态:
1. 子类重写父类
2. 把子类对象当成父类对象看。
静态多态性指的是程序在编译时,系统就能决定调用哪个函数,如重载。
动态多态性指在运行中才能动态确定操作指针所指的对象,主要通过虚函数和重写来实现。
抽象类与接口的区别:
1--接口中所有的方法都必须是抽象的方法,这些方法留给实现接口的类来实现,而抽象类既可以有抽象的方法,也可以有实现的方法。
2--抽象类偏重于属性,接口偏重于行为。
3--抽象类实现接口,不需要显示的声明接口中的抽象方法,不需要完全实现接口中的方法。
抽象类继承抽象类,可以不显示的写出抽象方法,但直到非抽象的子类必须实现所有的抽象方法。
抽象类中可以有静态的方法,而接口中不允许有静态的方法。
抽象类可以继承抽象类和非抽象类,可以实现接口(不需要所有方法),但不可以继承接口
接口可以继承接口,但不可以实现接口。