面向对象编程:多态性的理论与实践

news2024/11/26 13:56:28

文章目录

      • 1. 修饰词和访问权限
      • 2. 多态的概念
      • 3. 多态的使用现象
      • 4. 多态的问题与解决
      • 5. 多态的意义

在这里插入图片描述

在面向对象编程中,多态是一个重要的概念,它允许不同的对象以不同的方式响应相同的消息。本文将深入探讨多态的概念及其应用,以及在Java中如何实现多态性。

1. 修饰词和访问权限

在Java中,我们可以使用修饰词来设置成员的访问权限,常见的修饰词有public、private、protected和默认的(啥都不写)。

  • public:表示公共的,可以在任何地方被访问。
  • private:表示私有的,只能在本类中访问。
  • protected:表示受保护的,同包内和子类中可以访问。
  • 默认的:表示默认访问权限,只能在同包内访问。

小结:类应该设置为public,成员变量设置为private,成员方法设置为public。

2. 多态的概念

多态是面向对象编程中的一个重要特性,它表现为多种形态的存在。在现实生活中,我们也可以找到许多多态性的例子,比如人可以是学生、员工、孩子、大哥等多种形态。

在代码中,实现多态性的条件如下:

a. 必须有父子类的关系存在。
b. 必须有方法的重写。
c. 父类型的引用指向子类型的对象。

class Animal {
    void eat() {
        System.out.println("Animal is eating");
    }
}

class Cat extends Animal {
    @Override
    void eat() {
        System.out.println("Cat is eating");
    }
}

class Dog extends Animal {
    @Override
    void eat() {
        System.out.println("Dog is eating");
    }
}

public class PolymorphismExample {
    public static void main(String[] args) {
        Animal a = new Cat(); // 向上造型
        a.eat(); // 输出:Cat is eating

        a = new Dog(); // 向上造型
        a.eat(); // 输出:Dog is eating
    }
}

3. 多态的使用现象

在使用多态时,我们可以观察到以下现象:

  • 成员变量:能点出来什么?看引用的类型;执行结果看引用的类型。编译看左边,运行看左边。
  • 成员方法:能点出来什么?看引用的类型;执行结果看对象的类型。编译看左边,运行看右边。

4. 多态的问题与解决

使用多态存在的问题是无法访问子类特有的成员。如果我们想要访问子类特有的成员,可以进行向下造型(也称为强制转换)。

Animal ani = new Cat(); // 向上造型
// 不能访问Cat类特有的成员,编译报错
// ani.catchMouse();

// 向下造型,转为Cat类型
if (ani instanceof Cat cat) {
    cat.catchMouse(); // 调用Cat类特有的方法
}

需要注意的是,向下造型可能会出现ClassCastException,即数据类型转换异常。因此,在进行类型转换之前最好先进行判断,可以使用instanceof关键字来判断对象的类型。

if (ani instanceof Cat cat) {
    // 执行Cat类型的操作
} else {
    // 执行其他类型的操作
}

5. 多态的意义

使用多态可以使代码更加灵活,可以将不同的子类对象赋给父类引用,从而实现更加通用的代码。通过多态,我们可以编写出更加简洁、易于扩展的程序。

在面向对象的编程中,多态是一种非常重要的特性,它让我们的代码变得更加灵活、易于维护和扩展。同时,多态的应用也体现了面向对象编程的核心思想——封装、继承和多态的结合使用,使代码更具有可读性和可维护性。希望本文的解析能够帮助你更好地理解和运用多态性在Java中的实现。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/794214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker 网络端口映射 四大网络模式

Docker 网络端口映射 Docker 网络实现原理 Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网…

爆肝整理,接口测试方法总结+常问面试题(答案)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 理想的测试流程 …

flask路由添加参数

flask路由添加参数 在 Flask 中,可以通过两种方式在路由中添加参数:在路由字符串中直接指定参数,或者通过 request 对象从请求中获取参数。 在路由字符串中指定参数:可以将参数直接包含在路由字符串中。参数可以是字符串、整数、…

8-js高级-6(promise)

一 Promise 的理解和使用 1 Promise 是什么? 理解 抽象表达: Promise 是一门新的技术(ES6 规范)Promise 是 JS 中进行异步编程的新解决方案 (备注:旧方案是单纯使用回调函数) 具体表达: 从语法上来说: Promise 是一个构造函数从功能上来说: promise 对象用来…

vue3 实现排序按钮

需求背景解决效果index.vue 需求背景 需要实现一个复用性&#xff0c;是提供表单顺倒排序的按钮 解决效果 index.vue <!--/*** author: liuk* date: 2023/7/25* describe: 排序按钮*/--> <template><div class"sort-fn"><span :class"[…

记一次完整体系的攻防演练

准备工作&#xff1a; 1&#xff0c;在客户的内网环境部署一个Windows7系统&#xff0c;在这个系统上把finecms这个应用部署上去。把finecms安装之后&#xff0c;和客户沟通&#xff0c;把这个应用的地址映射到公网上去。 2&#xff0c;其次&#xff0c;没有条件的话&#xff0…

蓝桥杯上岸必背!!!(第七期 最短路算法)

第七期&#xff1a;最短路算法&#x1f525; &#x1f525; &#x1f525; 蓝桥杯热门考点模板总结来啦✨ 你绝绝绝绝绝绝对不能错过的常考最短路算法模板 &#x1f4a5; ❗️ ❗️ ❗️ 大家好 我是寸铁✨ 还没背熟模板的伙伴们背起来 &#x1f4aa; &#x1f4aa; &…

SpringBoot整合JavaMail

SpringBoot整合JavaMail 简单使用-发送简单邮件 介绍协议 导入坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>添加配置 spring:mail:host: smtp.qq.co…

JVM系统优化实践(23):GC生产环境案例(6)

您好&#xff0c;这里是「码农镖局」CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e; 在互联网大厂中&#xff0c;对每天亿级流量的日志进行清洗、整理是非常常见的工作。在某个系统中&#xff0c;需要对用户的访问日志做脱敏处理&#xff0c;也就是清洗掉姓名…

day41-Verify Account Ui(短信验证码小格子输入效果)

50 天学习 50 个项目 - HTMLCSS and JavaScript day41-Verify Account Ui&#xff08;短信验证码小格子输入效果&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name&qu…

Shell脚本实战——对MySQL进行分库分表备份

一、查看当前数据库以及数据表 如何除去Datebase标题字样以及系统自带的数据库呢&#xff1f;可以使用以下命令 mysql -uroot -p#BenJM123 -e show databases -N | egrep -v "information_schema|mysql|performance_schema|sys"剩下的两个就是用户自己创建的表啦&am…

分享一个JSON插件

文章目录 知识回顾使用方法 知识回顾 看官们&#xff0c;最近在使用Flutter做网络相关的操作&#xff0c;主要是Http请求操作&#xff0c;请求结果基本上都是JSON格式&#xff0c;因此需要把JSON格式转换成Dart语法的数据模型。如果手动编写的话会占用时间而且容易出错。因此&…

UCDOS和WPS推动计算机领域的汉字化发展,中文编程该谁力扛大旗?

你还记得UCDOS吗&#xff1f; 从DOS时代过来的人&#xff0c;还知道UCDOS的&#xff0c;现在可能已经是中年人了&#xff01; 当时&#xff0c;鲍岳桥的UCDOS可以称得上是中国的国产操作系统。 在Windows还没来得及进入中国市场时&#xff0c;UCDOS可以说是走向了巅峰时刻&a…

【分库分表】分库分表常见问题和解决方案

文章目录 前言MySQL出现的性能问题Mysql常见的优化手段大数据表优化方案详解分库分表垂直拆分单库垂直分表多库垂直分表 水平拆分单库水平分表多库水平分表常见的水平分表策略哈希取模分片hash取模的问题一致性hash算法按照范围分片 分库分表实战根据uid进行水平分表如何实现全…

lambda表达式的进阶过程

文章目录 什么是Lambda表达式简述Lambda表达式的优点语法格式 函数式接口定义常见的函数式接口汇总 Lambda的演化过程lambda表达式简化 总结 什么是Lambda表达式 简述 Lambda表达式是JAVA8中提供的一种新的特性&#xff0c;是一个匿名函数方法。可以把Lambda表达式理解为一段…

关于uniapp中的日历组件uni-calendar中的小红点

关于uniapp中的日历组件uni-calendar中的小红点 如果你使用过uni-calendar组件&#xff0c;可能你觉得这个小红点有点碍眼&#xff0c;但是官方给定的日历组件uni-calendar中如果你想要在某一天上添加一些信息例如:价格&#xff0c;签到&#xff0c;打卡之类&#xff0c;只要标…

【PWN · ret2text | 伪rand()】[HDCTF 2023]pwnner

伪随机数以及ctypes库的初步接触 目录 前言 一、题目 二、解题思路 三、exp 总结 前言 一道简单的ret2text&#xff0c;加上一些伪随机的知识&#xff0c;对于本蒟蒻萌新来说&#xff0c;比较新&#xff0c;值得记录。 一、题目 栈溢出保护、PIE保护都没有开。反汇编后…

servlet银行储蓄管理系统java存取转账交易 jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 servlet银行储蓄管理系统 系统有1权限&#xff1a;管…

python与深度学习(四):ANN和fashion_mnist二

目录 1. 说明2. fashion_mnist的ANN模型测试2.1 导入相关库2.2 加载数据和模型2.3 设置保存图片的路径2.4 加载图片2.5 图片预处理2.6 对图片进行预测2.7 显示图片 3. 完整代码和显示结果4. 多张图片进行测试的完整代码以及结果 1. 说明 本篇文章是对上篇文章训练的模型进行测…

Guitar Pro有没有免费的?

Guitar Pro是一款功能强大的吉他谱编辑软件&#xff0c;它为音乐创作者和乐手提供了极大的便利。但是&#xff0c;许多人对于Guitar Pro是否有免费版本&#xff0c;问题存在疑虑。下面我们就来详细介绍Guitar Pro有没有免费的内容吧&#xff01; 一、Guitar Pro有没有免费的 …