具体代码体现:
例子,有people(父类)、student(子类,继承people)、teacher(子类,继承people)三个类
//对象多态 people既可以指向学生,也可以指向老师
People p1 = new Student();
People p2 = new Teacher();
//方法多态 在不同的对象下表现出不同的特征
p1.run();
p2.run();
方法多态识别技巧:编译看左边,运行看右边
编译看左边:写p1.run()时,run方法会找people里面的run方法;
运行看右边:在实际运行时,run()方法会找右边的teacher里的run方法。
例如上图,输出的p1.name 和 p2.name 都是People中的name(即父类中的name)
//好处1:可以实现解耦合,右边对象可以随时切换,后续业务随之改变
//如只需要修改Student即可
People p1 = new Student();
Student s = new Student();
go(s);
Teacher t = new Teacher();
go(t);
//好处2:使用父类类型的形参,可以接收一切子类对象
public static void go(People p) {
}
解决方法:需要用到多态下的类型转换
People p = new Teacher();
Teacher t = (Teacher)p;
强制类型转换的一个注意事项:
强转前,Java建议:
//如果真实,返回true,否则返回false
if (p instanceof Student) {
Student s2 = (Student) p1;
} else {
Teacher t2 = (Teacher) p1;
}