Java-多态

继承是多态的前提条件,没有继承就没有多态。

多态就是指对象的多种形态

复制代码
//学生形态
Studen s=new Student();
//人的形态
Person p=new Student();

多态的表现形式:

复制代码
父类对象 对象名称=子类对象;

多态的前提:

1.有继承关系、实现关系

2.有父类引用指向子类对象

3.有方法重写

多态的好处:

使用父类型作为参数,可以接收所有子类对象,体现了多态的拓展性与便利

多态调用成员的特点:

1.变量调用:编译看左边,运行也看左边。

也就是编译过不过,看左边的类里面是否有所调用的成员变量,运行时也是用左边的类的成员变量。(在子类的对象中,会把父类的成员变量也继承下的。)

2.方法调用:编译看左边,运行看右边。

也就是编译过不过,看左边的类有没有相应的成员方法,而运行时却是调用右边的类的方法。(如果子类对方法进行了重写,那么在类方法中是会把父类的方法进行覆盖的。)

注:在java中,加载字节码文件永远是先加载父类的字节码,再加载子类的字节码

多态的优势:

1.在多态形式下,右边的对象可以实现解耦合,便于扩展和维护。

复制代码
person p=new student();
p.work();//业务逻辑发生改变时后续代码无需修改

比如,过了几天我们不想让学生去工作,想要老师去工作,我们只需要去改变等号右边,后续的代码其实是不需要改变的,而如果我们想要让学生去工作,只需要把等号的右边改变就行了

2.定义方法时,使用父类型作为参数,可以接受所有的字类对象,体现多态的拓展性与便利。

比如StringBuilder的append方法里,就有object类重载,表示可以把任一的对象append进去,还有ArrayList(集合),它是泛型,不过如果我们不给它是什么类型其实也可以,它的方法就会默认是object类型。

多态的弊端:

不能去调用子类的特有功能

子类里面的特有功能指的是子类里面有,但是父类里面没有的。

解决方法:变回子类就行。(强制类型转换)

即:

复制代码
//d为Animal类型的对象
Dog a=(Dog)d;

以上的强制转化方式需要我们知道是什么类型,那如果我们不知道是什么类型,可以这样做:

第一种方式:

先判断再转换,分成多条语句来实现:

复制代码
if(a instanceof Dog){
    Dog d=(Dog)a;
}....

第二种方法:

java在JDK14的时候提出了一种新的特性:就是可以把判断和强转合在一起写

复制代码
if(a instanceof Dog d){
}...

只需要在判断后面写上变量名就可以了,意思是先判断a是否为dog类型,如果是,就强转成Dog类型,转化之后,变量名为d。如果不是,就不强转。

注:以上都是强制类型的转化,还有一种自动类型的转化,是由子类向父类的强转:

复制代码
Animal a=new Dog();
相关推荐
古法安卓5 小时前
Android-日志系统源码解析
android·java·android studio
小夏coding6 小时前
从"一把梭"到"精妙拆解" —— 滑动窗口计时框架的设计演进
java·后端
MacroZheng7 小时前
同事问我:"Claude Code经常失忆,不怕它把项目搞炸?",我:"怕,三个Markdown文件给它装个永不丢失的外置大脑!"
java·人工智能·后端
十年Java程序媛8 小时前
深度实战:JDK21 虚拟线程 + HikariCP 生产正确配比、坑点、监控全套
java·spring boot
xiaoqiMikko9 小时前
有人在搜一个不存在的 Tomcat 版本
java·tomcat
用户31268748772012 小时前
ConcurrentHashMap 怎么保证线程安全?从分段锁到 CAS+synchronized
java
vipxieliang12 小时前
ValidX vs Apache Commons Validator:功能与性能对比
java·spring boot
SimonKing12 小时前
升级Spring Boot 4后,从 Jackson 2 到 3,到底有哪些变化
java·后端·程序员
吃饱了得干活13 小时前
一篇讲清楚Spring Boot:自动装配、启动器、过滤器、拦截器、设计模式
java·spring boot·后端
lhldsg14 小时前
AI零售系统实战指南:从架构设计到落地部署全解析
java·人工智能·小程序·uni-app·零售