当前位置: 首页 > news >正文

面向对象高级(多态)

什么是多态

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

public class People {

String name = "父类";

public void run(){
System.out.println("人会跑");
}

}

public class Teacher extends People{

String name = "老师";

@Override
public void run() {
System.out.println("老师跑的比较慢~~~");
}

// 独有功能
public void teach(){
System.out.println("老师教授Java~~~");
}

}

public class Student extends People{
String name = "学生";

@Override
public 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转换为子类类型
子类 变量名 = ( 子类 ) 父类变量 ;
}

关于多态转型问题,我们最终记住一句话:原本是什么类型,才能还原成什么类型

http://www.jsqmd.com/news/604570/

相关文章:

  • 想找国内知名光变UV变色纱线生产厂家?这3家值得关注 - 企业推荐官【官方】
  • 靠谱的厚板吸塑实力厂家 - 企业推荐官【官方】
  • 手把手教你用R-Studio恢复误删文件:从下载到恢复的保姆级避坑指南
  • 告别数据映射困惑:手把手教你配置ADRV9009的JESD204B接口(以BR3109为例)
  • 鼎捷T100程序开发实战:从核心类型到高效开发全解析
  • Windows系统性能优化全景指南:从诊断到长效管理的科学路径
  • 【OpenCode】opencode配置minimax2.7【day2】
  • 语文_中考_古诗词
  • 双编码器在UR5机器人零力拖动中的实现与优化
  • YALMIP求解器设置避坑指南:从`verbose`到`relax`,这些参数设置错了可能让你白算一整天
  • 终极Windows右键菜单优化指南:如何用ContextMenuManager快速清理杂乱菜单
  • CVPR/ICCV跟踪新趋势解读:对比学习如何让MOT模型学会“认人”?
  • 夜光荧光发光纱线生产厂家怎么选?认准正规靠谱源头不踩坑 - 企业推荐官【官方】
  • 从游戏AI到机器人:PPO算法在5个真实项目中的应用实战解析
  • 基于多时间尺度的灵活性资源优化配置 关键词:多时间尺度;模型预测控制;日内滚动优化; 1. 程序
  • 三大国际正规温变变色纱线供应商推荐 - 企业推荐官【官方】
  • 【单片机】51单片机的晶振选择
  • Phi-4-mini-reasoning Chainlit灰度发布:新模型版本小流量验证流程
  • SparkSQL临时表实战:4种高效创建方式与应用场景解析
  • 夜光荧光发光纱线源头厂家:性价比拉满,纺织从业者采购首选 - 企业推荐官【官方】
  • 2026 年废钢龙门剪刀片厂家如何选 —— 高效剪切首选品牌 - 企业推荐官【官方】
  • 电子秤实物量产资料:原理图、PCB文件、BOM及源码HEX全集
  • 3个高效步骤解决语雀文档批量导出难题
  • OpenClaw本地知识库:Qwen3.5-9B解析私有文档图片
  • 避坑指南:Ubuntu20.04下用Python3.8搞定Carla 0.9.13预编译版与ROS Bridge(解决卡死问题)
  • 长治厨卫改造哪个公司设计水平高 - 企业推荐官【官方】
  • 高性价比反光纱线公司哪家专业?3个维度教你甄别靠谱商家 - 企业推荐官【官方】
  • 2026 年重型龙门剪刀片选购要点 —— 耐用抗造才能更放心! - 企业推荐官【官方】
  • 一文带你探秘大厂面试 AI 大模型技术的热门问题
  • 资深反光纱线源头厂家哪家靠谱?3个标准帮你筛选优质供应商 - 企业推荐官【官方】