Java中的多态

发布时间:2023年12月24日

什么是多态

  • 多态是在 继承/实现 情况下的一种现象,表现为:对象多态、行为多态。

具体代码体现:
例子,有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方法。

多态的前提

  • 继承/实现关系;存在父类引用子类对象;存在方法重写

多态注意事项

  • 多态是对象、行为的多态,Java中的属性(成员变量)不谈多态。

在这里插入图片描述
例如上图,输出的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) {
}

弊端

  • 多态下不能使用子类的独有功能。

解决方法:需要用到多态下的类型转换

多态下的类型转换

  • 自动类型转换:父类 变量名 = new 子类();
  • 强制类型转换:子类 变量名 = (子类)父类变量
People p = new Teacher();
Teacher t = (Teacher)p;

强制类型转换的一个注意事项

  • 存在继承/实现关系就可以在编译阶段进行强制类型转换,编译阶段不会报错;
  • 运行时,如果发现对象的真实类型与强转后的类型不同,就会报类型转换异常(ClassCastException)的错误出来。
    例如:
    在这里插入图片描述
    在这里插入图片描述
    p1不可以转换为teacher对象,在编译时不会报错,但在运行时会报错。

强转前,Java建议:

  • 使用instanceof关键字,判断当前对象的真实类型,再进行强转
//如果真实,返回true,否则返回false

if (p instanceof Student) {
	Student s2 = (Student) p1;
} else {
	Teacher t2 = (Teacher) p1;
}
文章来源:https://blog.csdn.net/weixin_45427596/article/details/135167764
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。