什么是多态
同类型的对象,表现出的不同形态
多态的表现形式
父类类型 对象名称=子类对象;
多态的前提
有继承关系
有父类引用指向子类对象
有方法重写
多态调用成员的特点
变量调用:编译看左边,运行也看左边
方法调用:编译看左边,运行看右边
public class test{
public static void main(String[] args) {
Person a=new student();
System.out.println(a.name);//打印person
a.show();//打印student的show方法
}
}
class Person{
public String name="person";
public void show(){
System.out.println("person的show方法");
}
}
class Teacher extends Person {
public String name="teacher";
public void show(){
System.out.println("teacher的show方法");
}
}
class student extends Person {
public String name="student";
public void show(){
System.out.println("student的show方法");
}
}
上述代码,调用成员变量时看(Person a=new student()),编译时看左边的Person类有没有name,有则编译成功,无则报错,,运行时实际获取左边父类中的成员变量
调用成员方法,编译时看左边的Person,父类有show方法则编译成功,没有会报错,运行时实际上运行的是子类中的show方法
多态的优势和劣势
优势:
在多态形态下,右边对象可以实现解耦合,便于扩展和维护,如下代码修改子类即可(student)
Person a=new student();
a.show();
定义方法时,使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性和便利
劣势:
不能调用子类特有的功能
解决方案:变回子类类型即可(student s=(student) a);
加上判断强转减小错误
可简化为if(a instanceof student s){}//意思时a是不是student,是student强转为student类型并赋给student类型的s