什么是多态多态是在继承/实现情况下的一种现象表现为对象多态、行为多态。public class People {String name 父类;public void run(){System.out.println(人会跑);}}public class Teacher extends People{String name 老师;Overridepublic void run() {System.out.println(老师跑的比较慢~~~);}// 独有功能public void teach(){System.out.println(老师教授Java~~~);}}public class Student extends People{String name 学生;Overridepublic void run() {System.out.println(学生跑的飞快~~~);}// 独有功能public void study(){System.out.println(学生好好学习~~~);}}public class Test1 {public static void main(String[] args) {// 目标认识多态People p1 new Teacher();System.out.println(p1.name); // 识别技巧: 编译看左边, 运行看右边p1.run(); // 识别技巧: 编译看左边, 运行看右边People p2 new Student();System.out.println(p2.name); // 识别技巧: 编译看左边, 运行看右边p2.run(); // 识别技巧: 编译看左边, 运行看右边}}注意:多态的前提: 有继承/实现关系存在父类引用子类对象存在方法重写。多态的一个注意事项: 多态是对象、行为的多态Java中的属性(成员变量)不谈多态。多态的好处在多态形式下右边的对象是解耦合的更便于扩展和维护。p1指向Student对象run方法执行的就是Student对象的业务假如p1指向Teacher对象 run方法执行的自然是Teacher对象的业务右边对象可以随时切换后续业务随机改变。定义方法时使用父类类型作为形参可以接收一切子类对象扩展性更强更便利。public class Test2 {public static void main(String[] args) {// 目标掌握使用多态的好处// 好处1:可以实现解耦合右边对象可以随时切换后续业务随机改变People p1 new Student();p1.run();System.out.println();Teacher t new Teacher();go(t);Student s new Student();go(s);}// 好处2:可以使用父类类型的变量作为形参可以接收一切子类对象。// 参数People p既可以接收Student对象也能接收Teacher对象。public static void go(People p){System.out.println(开始------------------------);p.run();System.out.println(结束------------------------);}}类型转换在多态形式下不能调用子类特有的方法比如在Teacher类中多了一个teach方法在Student类中多了一个study方法这两个方法在多态形式下是不能直接调用的。多态形式下不能直接调用子类特有方法但是转型后是可以调用的。这里所说的转型就是把父类变量转换为子类类型。public class Test2 {public static void main(String[] args) {// 目标掌握使用多态的好处// 好处1:可以实现解耦合右边对象可以随时切换后续业务随机改变People p1 new Student();p1.run();// p1.study(); // 多态形式下不能调用子类特有的方法// 想要调用就需要强制类型转换Student s1 (Student) p1;s1.study();//强制类型转换可能存在的问题:编译阶段有继承或实现关系就可以强制, 但是运行时可能会出现类型转换异常// Teacher t1 (Teacher) p1; // 运行时: ClassCastException 类型转换异常System.out.println();Teacher t2 new Teacher();go(t2);Student s2 new Student();go(s2);}//好处2:可以使用父类类型的变量作为形参可以接收一切子类对象。public static void go(People p){System.out.println(开始------------------------);p.run();System.out.println(结束------------------------);}}强转前Java建议使用instanceof关键字判断当前对象的真实类型再进行强转p instanceof Student 判断当前对象是否真实类型或者子类格式如下//如果p接收的是子类对象if ( 父类变量 instanceof 子类 ) {//则可以将p转换为子类类型子类 变量名 ( 子类 ) 父类变量 ;}关于多态转型问题我们最终记住一句话原本是什么类型才能还原成什么类型