面向对象的三大特性为封装、继承、多态。
我们学习一下最后一个特性-------多态。
他能使同一个操作当作用于不同的对象时,产生不同的执行结果。使用多态可以提高代码的可维护性和可扩展性。
实现多态
1.子类到父类的转换(向上转型)
语法格式如下:
<父类型><引用变量名>=new <子类型>();
举例:
//把int型常量或变量的值赋给double型变量,可以自动进行类型转换
int i=8;
double d1=i;
//把double型常量或变量的值赋给int型变量,必须进行强制类型转换
double d2=3.14;
int a=(int)d2;
向上转型的规则:
- 将一个父类的引用指向一个子类对象被称为向上转型,系统会自动进行类型转换。
- 通过父类引用变量调用的方法是子类重写或继承的子类方法,不是父类的方法。
- 通过父类引用变量无法调用子类特有的方法。
那么,实现多态有哪些形式呢?
- 使用父类作为方法形式参数实现多态
- 使用父类作为方法返回值实现多态
小结
实现多态的三个条件如下:
- 继承的存在(继承是多态的基础,没有继承就没有多态)
- 子类重写父类的方法(多态下调用子类重写后的方法)
- 父类引用变量指向子类对象(向上转型)
2.父类到子类的转换(向下转型)
语法格式如下:
<子类型><引用变量名>=(<子类型>)<父类型的引用变量>;
instanceof运算符
通过父类到子类的向下转换可以实现多态,即执行不同子类中定义的特有的方法。但事实上,父类对象的应用可能指向某一个子类对象,如果 在向下转型时没有转换为真实的子类类型,就会出现转换异常。
那么,如何通过代码避免这种异常的发生呢?Java提供了instanceof运算符来进行类型的判断。具有的语法如下。
语法:
对象 instanceof 类或接口
该运算符用来判断一个对象是否属于一个类或实现了一个接口,结果为true或false。在强制类型转换之前通过instanceof运算符检查对象的真实类型,再进行强制类型转换,这样就可以避免类型转换异常,从而提高代码的健壮性。
多态的优势
- 可替换性:多态对已存在的代码具有可替换性
- 可扩充性:多态对代码具有可扩充性。增有新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新增子类更容易获得多态功能。
- 灵活性:在多态在应用中,体现了灵活多样的操作,提高了使用效率。
- 简化性:多态简化了应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出。