1.多态的基本体现:
父类的引用指向了自己的子类对象eg: Animal c = new cat();
父类的引用也可以接受自己的子类对象。
2.多态的前提:
必须是类与类之间有继承或实现关系,
通常存在覆盖,但体现多态性的覆盖代码必须和父类中的代码功能一致
3.多态的好处:
多态的出现提高了程序的扩展性;
找到对象的共同所属类型,通过操作所有类型;简化对象的操作类型;
4.多态的弊端:
但是只能使用父类的引用访问父类中的成员;
5.多态的转型
Animal a = new Cat();类型提升,向上转型,把cat这个类型转换到动物的这种类型!
如果想要调用Cat的特有类型时,该如何操作:此时Cat类型已经向上转型为Animal,
此时强制类型转换 :cat C = (Cat)a;叫做向下转型,将本来是父类Animal 类型的a转换成子类,转换的结果是子类对象
但是不能强制将Animal转换成Cat:
不能将父类对象转换成子类类型;能转换的是父类引用指向自己的子类对象时,该引用可以被提升,也可以被强制转换
规律:多态自始至终都是子类对象在做着变化;
instanceof关键字,判断是不是这个对象是不是这个类型的;
eg a instanceof cat ,判断a这个对象是不是指向cat这个类
6.多态的规律
1,成员变量。
编译时:参考引用型变量所属的类中的是否有调用的成员变量,有,编译通过,没有,编译失败。
运行时:参考引用型变量所属的类中的是否有调用的成员变量,并运行该所属类中的成员变量。
简单说:编译和运行都参考等号的左边。
2,成员函数(非静态)。
编译时:参考引用型变量所属的类中的是否有调用的函数,有,编译通过,没有,编译失败。也就是说对象调用的方法必须是父类的方法。
运行时:参考的是对象所属的类中是否有调用的函数,如果该函数是父类特有的,那就调用父类的方法,如果是子类特有的,
那就调用子类
简单说:编译看左边,运行看右边。
因为成员函数存在覆盖特性。
3,静态函数。
编译时:参考引用型变量所属的类中的是否有调用的静态方法。
运行时:参考引用型变量所属的类中的是否有调用的静态方法。
简单说,编译和运行都看左边。
个人认为静态的方法也好,静态成员变量也好,在多态中没有任何意义,因为静态的成员在优先于对象,他属于这个类,
而继承的关系在new对象的时候才确立的,所以静态成员跟多态没有任何关系,所以什么引用就调用什么方法,
这种调用静态成员的方法当然也不是标准的,
其实对于静态方法,是不需要对象的。直接用类名调用即可。