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

Java进阶学习笔记11——多态

什么是多态?

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

同一个对象,在不同时刻表现出来的不同形态。

多态的前提:

要有继承/实现关系

要有方法的重写

要有父类引用指向子类对象。

多态的具体代码体现:

People类:

package cn.ensource.d1_polymorphism;// 父类
public class People {public void run() {System.out.println("人类快跑");}
}

Teacher类:

package cn.ensource.d1_polymorphism;public class Teacher extends People{@Overridepublic void run() {System.out.println("老师快跑!");}
}

 Student类:

package cn.ensource.d1_polymorphism;public class Student extends People{@Overridepublic void run() {System.out.println("学生快跑!");}
}

Test类: 

package cn.ensource.d1_polymorphism;public class Test {public static void main(String[] args) {// 目标:认识对象多态、行为多态// 对象多态People p1 = new Teacher();People p2 = new Student();// 行为多态p1.run();   // 编译看左边,运行看右边,看真实对象的方法p2.run();}
}

多态的一个注意事项:

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

package cn.ensource.d1_polymorphism;public class Test {public static void main(String[] args) {// 目标:认识对象多态、行为多态// 对象多态People p1 = new Teacher();People p2 = new Student();// 行为多态p1.run();   // 编译看左边,运行看右边,看真实对象的方法p2.run();System.out.println(p1.name);   // 识别技巧:编译看左边,运行看左边,变量不讲多态性System.out.println(p2.name);}
}

多态中成员访问特点(记忆):

成员访问特点:

成员变量:编译看父类,运行看父类;

成员方方法:编译看父类,运行看子类;

多态使用的好处:

在多态的形式下,右边对象是解耦合的,更便于扩展和维护。

高内聚、低耦合。

定义方法的时候,使用父类类型的形参,可以接受一切子类对象,扩展性强,更便利。

提高了程序的扩展性,定义方法的时候,使用父类型作为参数,在使用的时候,使用具体的子类型参与操作。

弊端:不能使用子类特有的成员。

package cn.ensource.d2_polymorphism;public class Test {public static void main(String[] args) {// 目标:认识多态的好处//好处一:可以实现解耦合,右边对象可以随时切换,后续业务随机改变
//        People p1 = new Student();People p1 = new Teacher();p1.run();// 好处二: 可以使用父类类型的变量作为形参,可以一切子类对象Student s = new Student();Teacher t = new Teacher();}public static void go(People p) {}
}

多态下,会存在一个问题,怎么解决?

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

package cn.ensource.d2_polymorphism;public class Test {public static void main(String[] args) {// 目标:认识多态的好处//好处一:可以实现解耦合,右边对象可以随时切换,后续业务随机改变
//        People p1 = new Student();People p1 = new Teacher();p1.run();
//        p1.test();   // 无法调用子类的独有功能,因为编译时看左边,人类是没有这个方法的。// 好处二: 可以使用父类类型的变量作为形参,可以一切子类对象Student s = new Student();Teacher t = new Teacher();}public static void go(People p) {}
}

多态下的类型转换问题:

类型转换:

自动类型转换: 父类 变量名 = new 子类();

强制类型转换:子类 变量名 = (子类)父类变量;

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

存在继承/实现关系就可以在编译阶段进行强制类型转换,编译阶段不会报错。

运行时,如果发现对象的真实类型与强制后的类型不同,就会报类型转换异常(ClassCastException)的错误出来。

Exception in thread "main" java.lang.ClassCastException: class cn.ensource.d2_polymorphism.Student cannot be cast to class cn.ensource.d2_polymorphism.Teacher (cn.ensource.d2_polymorphism.Student and cn.ensource.d2_polymorphism.Teacher are in unnamed module of loader 'app')at cn.ensource.d2_polymorphism.Test.main(Test.java:19)

强转前,Java建议:

使用instanceof关键字,判断当前对象的真实类型,再进行强转。

对象回调。

 多态中的成员转型:

向上转型:

父类引用指向子类对象就是向上转型。

向下转型:

格式:子类 对象名 = (子类型)父类引用。

http://www.lryc.cn/news/353436.html

相关文章:

  • 注意力机制篇 | YOLOv8改进之引入用于目标检测的混合局部通道注意力MLCA
  • 百度生成数据库
  • 【SpringBoot】整合百度文字识别
  • Java如何设计一个功能
  • MySQL 字符字段长度设置详解:语法、注意事项和示例
  • 【对角线遍历】python
  • 温度检测小系统兼继电器模块和小风扇
  • [数据结构1.0]计数排序
  • PostgreSQL入门教程
  • 【spring】@ControllerAdvice注解学习
  • 【全开源】赛事报名系统源码(Fastadmin+ThinkPHP和Uniapp)
  • 杰理-耳机进入关机关闭内内置触摸-节省功耗
  • Homebrew安装、 Mac上pyenv的安装与使用,复制黏贴搞定,网上教程看得眼花缭乱的来看看,简单明了一步到胃!!
  • 通过注意力调节实现更好的文本到图像生成对齐
  • Java开发大厂面试第26讲:生产环境如何排查问题和优化 JVM?
  • 计算机科学的先驱者们
  • 哈希双指针
  • 【网络】UDP协议
  • 牛马真的沉默了,入职第一天就干活
  • 解决在cmd里下载的库,但IDLE还是显示不存在的问题
  • 嵌入式全栈开发学习笔记---C语言笔试复习大全23
  • C++函数指针,键值对集合的学习
  • 新人攻略:避开这3大坑,让老员工主动带你飞!
  • 汽车液态电池隔膜的作用
  • 汽车液态电池充电时,充电时的化学反应是怎样的? 电池电量是怎么充满的?
  • Topk问题以及二叉树的三种层序遍历和基本操作
  • 深度学习设计模式之桥接模式
  • 设计模式 17 组合模式 Composite Pattern
  • 【经典论文阅读10】MNS采样——召回双塔模型的最佳拍档
  • 串行低功耗芯片间媒体总线(SLIMbus)介绍