什么是多态
- 多态是在继承/实现情况下的一种现象,表现为:对象多态、行为多态
对象多态:举个栗子,比如一个人,他可以是一个老师,也可以是一个歌手,也可以是一个丈夫......
行为多态:举个栗子,比如都是人来唱歌,有的人唱的很好听,有的五音不全,或者说都是去上学,有的是学霸,而有的是学渣......
代码演示:
首先创建类:
public class People { //人类public String name = "people";public void run(){ //跑步System.out.println("人会跑步");}
}public class Student extends People{ //学生类,继承人类public String name = "student";@Overridepublic void run() { //跑步System.out.println("学生跑的贼快~");}
}public class Teacher extends People{ //老师类,继承人类public String name = "teacher";@Overridepublic void run() { //跑步System.out.println("老师跑的气喘吁吁~");}
}
Test:
public class Test {public static void main(String[] args) {People s = new Student(); //对象多态,人可以是学生,人的范围比学生大,学生继承自人,学生也是人s.run(); //学生跑步People t = new Teacher(); //同理学生t.run(); //老师跑步}
}
运行结果:
多态的前提
- 有继承/实现关系,存在父类引用子类对象,存在方法重写
多态注意事项
- 多态强调对象和行为多态性,类中的属性(成员变量)不谈多态
- 对于方法/行为,编译看左边,运行看右边,即编译看父类,实际运行看子类
- 对于成员变量/属性,编译看左边,运行仍看左边,即编译看父类,实际运行也是父类的
- 这里的左边右边是指对象定义时赋值=号的左边右边
举例:
仍然是刚才的人类、学生类、老师类 ,输出他们的name:
public class Test2 {public static void main(String[] args) {People s = new Student();System.out.println(s.name); //编译看左边,运行看左边People t = new Teacher();System.out.println(t.name);}
}
结果:
使用多态的好处
- 在多态形式下,右边对象是解耦合的,更便于维护和拓展
- 定义方法时,使用父类类型的形参,可以接收一切子类对象,拓展性更强、更便利
解耦合:右边对象随时切换,后续业务随时改变
多态的存在的问题
- 无法直接调用子类独有功能
多态下的类型转换
类型转换
- 自动类型转换:父类 变量名 = new 子类(); 例如 People p = new Teacher
- 强制类型转换:子类 变量名 = (子类) 父类变量;例如 Teacher t = (Teacher)p;
强制类型转换的注意事项
- 存在继承/实现关系就可以在编译阶段进行强制类型转换,编译阶段不会报错
- 运行时,如果发现对象的真实类型与强转后的类型不同,就会报类型转换异常(ClassCastException)的错误,即只能强制转换成多态定义时指向的子类
示例:
- 因此,强转前建议使用instanceof关键字,判断当前对象的真实类型,再进行强转
示例: