java面向对象的三大特性之一多态

1、为什么要有多态?

没有多态的话,如果对象过多,那么代码书写会冗余;有了多态,代码书写简洁。

2、什么是多态?

多态是继承/实现下的一种现象。前提条件:继承和实现的关系中,存在父类引用子类对象,方法重写。

对象多态:一个对象,多重身份。如医生既可以当医生看,也可以当员工看,也可以当人看。

行为多态:同一个父类下的子类,不同的行为描述。如猫和狗同属于动物,猫是喵喵喵地叫,狗是汪汪汪地叫。

注意:行为多态是编译看左边,运行看右边。父类 对象1 = new 子类1(); 父类 对象2 = new 子类2(); 编译看左边指的是用对象名调用重写的方法时,如果方法名在父类中找不到,那么编译器就会报错。运行看右边指的是,运行后调用的重写方法是子类的方法。左边决定能调什么方法,右边决定具体执行的方法。

复制代码
package com.ljh.polymorphsm4;

public class Test {
    public static void main(String[] args) {
        People p = new Student();
        System.out.println(p.name);
    }
}
//为什么变量不存在编译看左边,运行看右边。因为变量(属性)不存在多态。
public class People {
    String name = "People的name";
}
public class Student extends People{
    String name = "Student的name";
}

总结:方法有多态,属性没有多态。变量(属性)不存在多态,所以编译看左边,运行也看左边。

3、多态有什么好处?

复制代码
package com.ljh.polymorphsm4;

public class Test {
    public static void main(String[] args) {
        People p = new Teacher();
        p.run();
    }
}
//多态的好处:右边的对象是解耦合的,更便于扩展和维护。

(1)右边对象解耦合,更加便于扩展和维护,也迎合了软件工程中分层的思想。

(2)父类类型的变量作为形参,可以接一切子类对象。

4、多态的缺点是什么?

为了安全,多态下不能直接使用子类的独有功能。因为编译看左边,运行看右边,左边的父类中没有子类独有的功能,所以编译时会导致编译报错!!!

5、如果我要在多态下调用子类的独有功能,怎么解决?

一句话---------------------类型转换可以解决。我们的核心思想是把多态下类型范围从子类自动转换成父类后,利用强制类型转换将父类转换为子类。

强制类型转换的注意事项:存在继承/实现关系就可以在编译阶段进行强制类型转换,编译阶段不会报错;运行时,如果发现对象的真实类型与强转后的类型不同,就会报类型转换异常的错误!!通俗地说,就是兄弟之间不能强制类型转换!!

复制代码
public class Test {
    public static void main(String[] args) {
        People p1 = new Student();  // ✅ p1实际上是Student
        People p2 = new Teacher();  // ✅ p2实际上是Teacher
        
        // 🚨 危险!这里会崩溃!
        Student s2 = (Student) p2;  // p2是Teacher,不是Student!
        // 运行时抛出:ClassCastException
    }
}

强转前,建议使用instanceof关键字,判断当前对象的真实类型,再强制类型转换。p instanceof Student;

相关推荐
R1nG8633 分钟前
多线程安全设计 CANN Runtime关键数据结构的锁优化
开发语言·cann
m0_550024634 分钟前
持续集成/持续部署(CI/CD) for Python
jvm·数据库·python
初次见面我叫泰隆4 分钟前
Qt——5、Qt系统相关
开发语言·qt·客户端开发
亓才孓9 分钟前
[Class的应用]获取类的信息
java·开发语言
开开心心就好17 分钟前
AI人声伴奏分离工具,离线提取伴奏K歌用
java·linux·开发语言·网络·人工智能·电脑·blender
Never_Satisfied21 分钟前
在JavaScript / HTML中,关于querySelectorAll方法
开发语言·javascript·html
80530单词突击赢30 分钟前
JavaWeb进阶:SpringBoot核心与Bean管理
java·spring boot·后端
3GPP仿真实验室44 分钟前
【Matlab源码】6G候选波形:OFDM-IM 增强仿真平台 DM、CI
开发语言·matlab·ci/cd
devmoon1 小时前
在 Polkadot 上部署独立区块链Paseo 测试网实战部署指南
开发语言·安全·区块链·polkadot·erc-20·测试网·独立链
lili-felicity1 小时前
CANN流水线并行推理与资源调度优化
开发语言·人工智能