5.面向对象_多态
多态定义:某一种事物存在的多种形态。
- 例:动物中猫,狗。
- 猫这个对象对应的类型是猫类型。
- 猫 x = new 猫();
- 同时猫也是动物的一种,也可以把猫称为动物。
- 动物 y = new 猫();
- 动物是猫和狗具体事物中抽取出来的父类型。
- 父类型引用指向子类对象。
1、多态的体现。
父类的引用指向了自己的子类。
父类的引用也可以接收自己的子类对象。
2、多态的前提。
必须是类与类之间有关系,要么继承,要么实现。
通常还有一个前提:存在覆盖。
3、多态的好处。
多态的出现大大的提高程序的扩展性。
4、多态的弊端。
提高了扩展性,但是只能使用父类的引用访问父类中的成员。
5、多态的应用。
Animial a = new cat();//类型提升,向上转型。
//如果想要调用猫的特有方法时,该怎样调用?强制将父类的引用,转成子类类型(向下转型)。cat c = (cat)a;//注意:不能将父类对象转成子类类型。能转换的是父类引用指向了子类对象时,该引用可以被提升,也可以被强制转换。多态自始至终都是子类对象在做着变化。
6、多态的出现代码中的特点(多态使用的注意事项)
多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,否则编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
在多态中成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。
在多态中,静态成员函数和变量的特点:
无论编译和运行,都参考左边。
7、instanceof
通常在两种情况下调用,1、子类是有限的。2、在进行其他比较的时候,要确定它到底是哪一种类型,再调用它特有的方法去比较,这个时候就需要用instanceof判断一下。
if(!obj instanceof Demo) return false//直接抛出异常更为合适。
8、Object类
Object:是所有对象的直接或者间接父类。传说中的上帝。该类中定义肯定是所有对象都具备的功能。
如果自定义类中与父类中有相同的功能,就没有必要重新定义,只要沿袭父类中的功能,建立自己特有的内容即可,这就是覆盖。
equals(Object obj); : (指示其他某个对象是否与此对象“相等”)Java认为所有的对象都具备比较性,都能比较两个对象是否相同。
toString(); :(返回该对象的字符串表示)Java认为所有对象都能变成字符串被打印。
hashCode(); :(返回该对象的哈希码值)。
getClass(); :(返回该Object类的运行时类)