一、什么是多态
同类型的对象,表现出的不同形态。
二、多态的表现形式
父类类型 对象名称 = 子类对象;
三、多态的前提
1.有继承/实现关系。
2.有父类引用指向子类对象。
例:
Fu f = new Zi ();
↑ ↑ ↑
父类引用 指向 子类对象
3.有方法重写。
四、多态的好处
使用父类型作为参数,可以接受所有子类对象。
体现多态的扩展性与便利。
五、多态调用成员的特点
变量调用:编译看左边,运行也看左边。
方法调用:编译看左边,运行看右边。
六、多态的优势
1.在多态形式下,右边对象可以实现解耦合,便于扩展和维护。
例:
Person p = new Student();
p.work();
上述代码中,当我不想学生工作,想老师工作时,仅需改变创建对象部分修改,而p.work不需修改,即:当业务逻辑发生改变时,后续代码无需修改。
修改后:
Person p=new Teather();
p.work();
2.定义方法的时候,使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利。
例:设Student类继承于Person类
Teacher类继承于Person类
public void work(Person p){
.....
}
Person s=new Student();
Person t=new Teacher();
work(s);//work类可以接收Student类对象
work(t);//work类可以接收Teacher类对象
七、多态弊端与解决方法
7.1.多态弊端:不能使用子类的特有功能
7.2.解决方法:
类型转换
由于多态编译看左边,其中子类特有方法父类没有时,该方法不能直接调用,需要进行类型转换,将父类转为子类。
例:
Student st=(Student)s;
其中s为Person类型,进行强转为Student类型并赋值给st,之后可调用Student类中特有方法
例:st.studentWork();
知识补充:判断对象是不是某一类型
例:判断a是否为Student类型,可用instanceof
使用方法: Boolean b=a instanceof Student;
a instanceof Student返回值类型为Boolean类型,若a为Student类型则返回true反之返回false。
7.3.强制转换能解决什么问题
可以转换成真正的子类类型,从而调用子类独有功能。
转换类型与真实对象类型不一致会报错。
转换时最好用instanceof关键字判断