1.什么是多态?
多态是具有表现多种形态的能力的特征,更专业化的说法:同一个实现接口,使用不同的实例而执行不同的操作。
子类到父类的转换(向上转型)
//将int型常量或变量的值赋给double型变量,可以自动进行类型转换
int i = 5;
double d1 = 5;
//将double型常量或变量的值赋给int型变量,进行强制转换
double d2 = 3.14;
int a = (int)d2;
实际上,在引用数据类型的子类和父类之间也存在着类型转换问题,如以下代码。
Dog dog = new Dog("欧欧","雪纳瑞");//不涉及类型转换
dog.eat();
Pet pet = new Dog("欧欧","雪纳瑞");//子类到父类的转换
pet.eat();//会调用Dog类重写的eat()方法,而不是Pet类的eat()方法
pet.catchingFlyDisc();//编译错误,父类的引用无法调用子类特有的方法
子类转换成父类时的规则:
1.将一个父类的引用指向一个子类对象,称为向上转型,自动进行类型转换
2.此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法,不是父类的方法
3.此时通过父类引用变量无法调用子类特有的方法
2.使用父类作为方法形参实现多态
使用父类作为方法的形参,是Java中实现和使用多态的主要方式之一。
使用父类作为方法形参优势明显,或者说使用多态的优势明显:可以减少代码量,提高代码的可扩展性和可维护性。
3.使用父类作为方法返回值实现多态
使用父类作为方法的返回值,是Java中实现和使用多态的另一种方式。
4.父类到子类的转换(向下转型)
当向上转型发生后,将无法调用子类特有的方法,但是当需要调用子类特有的方法时,可以通过将父类再转换为子类来实现。
将一个指向子类对象的父类引用赋给一个子类的引用,称为向下转型。此时必须进行强制类型转换
5.instanceof运算符
语法:
对象 instanceof 类或接口
该运算符用来判断一个对象是否属于一个类或者实现了一个接口,结果为true或false。在强制类型转换之前通过instanceof运算符检查对象的真实类型,再进行相应的强制类型转换,这样就可以避免类型转换异常,从而提高代码的健壮性。
文章总结
通过多态可以减少类中的代码量,可以提高代码的可扩展性和可维护性。继承多态的基础,没有继承就没有多 态。
把子类转换为父类称为向上转型,自动进性类型转换。把父类转换是为子类称为向下转型必须进行强制类型转 换。
向上转型后可以访问子类特有的方法。必须转换为父类指向的真实子类类型,否则将出现类型转换异常 ClassCastException。
instanceof运算符用于判断一个对象是否属于一个类或实现了一个接口。
instanceof运算符通常和强制类型转换结合使用,先通过instanceof进行类型判断,再进行相应的强制类型转 换。
使用父类作为方法形参和使用父类作为返回值类型是使用多态的常用方式。