1. 多态的概述
- 什么是多态
- 同一个对象,在不同时刻表现出来的不同形态
- 多态的前提
- 要有继承或实现关系
- 要有方法的重写
- 要有父类引用指向子类对象
- 代码演示
class Animal { public void eat(){ System.out.println("动物吃饭"); } } class Cat extends Animal { @Override public void eat() { System.out.println("猫吃鱼"); } } public class Test1Polymorphic { /* 多态的前提: 1. 要有(继承 \ 实现)关系 2. 要有方法重写 3. 要有父类引用, 指向子类对象 */ public static void main(String[] args) { // 当前事物, 是一只猫 Cat c = new Cat(); // 当前事物, 是一只动物 Animal a = new Cat(); a.eat(); } }
2 .多态中的成员访问特点
- 成员访问特点
- 成员变量
- 编译看父类,运行看父类
- 成员方法
- 编译看父类,运行看子类
- 代码演示
class Fu { int num = 10; public void method(){ System.out.println("Fu.. method"); } } class Zi extends Fu { int num = 20; public void method(){ System.out.println("Zi.. method"); } } public class Test2Polymorpic { /* 多态的成员访问特点: 成员变量: 编译看左边 (父类), 运行看左边 (父类) 成员方法: 编译看左边 (父类), 运行看右边 (子类) */ public static void main(String[] args) { Fu f = new Zi(); System.out.println(f.num); f.method(); } }
3. 多态的好处和弊端
- 好处
- 提高程序的扩展性。定义方法时候,使用父类型作为参数,在使用的时候,使用具体的子类型
参与操作
- 弊端
- 不能使用子类的特有成员
4. 多态中的转型
- 向上转型
- 父类引用指向子类对象就是向上转型
- 向下转型
- 格式:子类型 对象名 = (子类型)父类引用;
- 代码演示
Zi z = (Zi) f;
5. 多态中转型存在的风险和解决方案 (应用)
- 风险
- 如果被转的引用类型变量,对应的实际类型和目标类型不是同一种类型,那么在转换的时候就会出现
ClassCastException
解决方案
- 关键字
- instanceof
- 使用格式
- 变量名 instanceof 类型
- 通俗的理解:判断关键字左边的变量,是否是右边的类型,返回boolean类型结果
if(a instanceof Dog){ Dog dog = (Dog) a; dog.watchHome(); }
6. 多态的实用价值
多态在面向对象编程中有着广泛的使用价值,主要表现在以下方面:
可替换性:多态允许子类对象替换父类对象,并且可以调用覆盖了父类方法的子类方法。这样可以极大地增加代码的可复用性和可扩展性。
灵活性:通过多态,一个超类对象可以调用子类对象的方法,从而使代码更加灵活和易于扩展。程序员只需要引用超类对象而不是具体的子类对象,就能够避免对代码进行大量修改的情况。
统一性:通过多态性,所有继承自父类的子类都能以相同的方式处理,从而增强了代码的可维护性和可读性。例如,在Java的集合框架中,所有实现了List接口的类都能够使用相同的方法对列表进行操作。
可扩展性:通过多态,我们可以很容易地扩展应用程序的功能。例如,我们可以创建新的子类,并覆盖它们的父类方法,从而为应用程序添加新的功能,而无需改变现有的代码。
多态是面向对象编程中非常重要的概念,它可以使软件系统更加灵活和可扩展,同时还可以提高代码的可读性、可维护性和可复用性,从而降低软件开发的成本。