面向对象(封装,继承,多态)

1.封装【encapsulation】 【/ɪnˌkæpsjuˈleɪʃ(ə)n/】

在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。

封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。

要访问该类的代码和数据,必须通过严格的接口控制。

封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。

适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。

  • 封装的优点

    • 1. 良好的封装能够减少耦合。

    • 2. 类内部的结构可以自由修改。

    • 3. 可以对成员变量进行更精确的控制。

    • 4. 隐藏信息,实现细节

  • 高内聚:相关的功能和数据尽可能地组织在同一个类中,各个类内部数据操作细节自己完成,以确保其独立性。

  • 低耦合:各个类之间的依赖关系应尽可能低。也就是说,一个类的变化应尽量减少对其他类的影响。有助于提高软件的可扩展性、可复用性和灵活性。

如何实现封装呢?

实现封装就是指控制类或成员的可见性范围?这就需要依赖访问控制修饰符,也称为权限修饰符来控制。

权限修饰符:private,缺省,protected,public

 成员变量/属性私有化

在面向对象编程中,将成员变量(也称为属性)私有化是一种常见的做法。这样做的目的是保护数据,防止外部直接访问和修改,以确保数据的完整性和安全性。同时,通过提供公共的getter和setter方法来访问和修改这些私有变量,可以更好地控制对这些变量的访问和修改.

成员变量封装的目的

  • 隐藏类的实现细节

  • 让使用者只能通过事先预定的方法来访问数据,从而可以在该方法里面加入控制逻辑,限制对成员变量的不合理访问。还可以进行数据检查,从而有利于保证对象信息的完整性。

实现步骤

  1. 使用 private 修饰成员变量

    2.提供 getXxx方法 / setXxx 方法,可以访问成员变量

public class Person {
    private String name;
    private int age;
    private boolean marry;

    public void setName(String n) {
        name = n;
    }

    public String getName() {
        return name;
    }

    public void setAge(int a) {
        age = a;
    }

    public int getAge() {
        return age;
    }
    
    public void setMarry(boolean m){
        marry = m;
    }
    
    public boolean isMarry(){
        return marry;
    }
}

 IDEA自动生成get/set方法模板

1、如何解决局部变量与实例变量同名问题

当局部变量与实例变量(非静态成员变量)同名时,在实例变量必须前面加“this.”

2、IDEA自动生成get/set方法模板
  • 大部分键盘模式按Alt + Insert键。

  • 部分键盘模式需要按Alt + Insert + Fn键

2.继承

继承的概念:

继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

生活中的继承:

兔子和羊属于食草动物类(继承食草动物吃草的特性),狮子和豹属于食肉动物类(继承食肉动物吃肉的特性)。

食草动物和食肉动物又是属于动物类。

所以继承需要符合的关系是:is-a,父类更通用,子类更具体。

虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性。

类的继承格式

通过 extends 关键字,可以声明一个子类继承另外一个父类,定义格式如下:

【修饰符】 class 父类 {
    ...
}

【修饰符】 class 子类 extends 父类 {
    ...
}

为什么要继承?

子类继承父类之后,就具有父类当中的属性和方法,子类就不会存在重复的代码,维护性也提高,代码也更加简洁,提高代码的复用性(复用性主要是可以多次使用,不用再多次写同样的代码)

继承的好处

  • 提高代码的复用性

  • 提高代码的扩展性

  • 表示类与类之间的is-a关系

继承的特点

  • 子类拥有父类非 private 的属性、方法。

  • 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。

  • 子类可以用自己的方式实现父类的方法。

  • Java 的继承是单继承,但是可以多层继承,单继承就是一个子类只能继承一个父类,多层继承就是,例如 B 类继承 A 类,C 类继承 B 类,所以按照关系就是 B 类是 C 类的父类,A 类是 B 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。

  • 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。

继承关键字

继承可以使用 extends implements 这两个关键字来实现继承,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承 Object(这个类在 java.lang 包中,所以不需要 import)祖先类。

        extends关键字

在 Java 中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类。

        implements关键字

使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。

        super 与 this 关键字

super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。

this关键字:指向自己的引用。

        final 关键字

final 可以用来修饰变量(包括类属性、对象属性、局部变量和形参)、方法(包括类方法和对象方法)和类。

final 含义为 "最终的"。

使用 final 关键字声明类,就是把类定义定义为最终类,不能被继承,或者用于修饰方法,该方法不能被子类重写:

  • 声明类:

    final class 类名 {//类体}
  • 声明方法:

    修饰符(public/private/default/protected) final 返回值类型 方法名(){//方法体}

注: final 定义的类,其中的属性、方法不是 final 的。

IDEA中如何查看继承关系

选择A类名,按Ctrl + H就会显示A类的继承树。

3.多态

多态是同一个行为具有多个不同表现形式或形态的能力。

多态就是同一个接口,使用不同的实例而执行不同操作,如图所示:

多态的优点

  • 1. 消除类型之间的耦合关系
  • 2. 可替换性
  • 3. 可扩充性
  • 4. 接口性
  • 5. 灵活性
  • 6. 简化性

多态存在的三个必要条件

  • 继承
  • 重写
  • 父类引用指向子类对象:Parent p = new Child();
  • 当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。

多态的形式和体现

1、多态引用

Java规定父类类型的变量可以接收子类类型的对象,这一点从逻辑上也是说得通的。

父类类型 变量名 = 子类对象;

父类类型:指子类继承的父类类型,或者实现的父接口类型。

所以说继承是多态的前提

2、多态引用的表现

表现:编译时类型与运行时类型不一致,编译时看“父类”,运行时看“子类”。

3、多态引用的好处和弊端

弊端:编译时,只能调用父类声明的方法,不能调用子类扩展的方法;

好处:运行时,看“子类”,如果子类重写了方法,一定是执行子类重写的方法体;变量引用的子类对象不同,执行的方法就不同,实现动态绑定。代码编写更灵活、功能更强大,可维护性和扩展性更好了。

3 应用多态解决问题

1、声明变量是父类类型,变量赋值子类对象
  • 方法的形参是父类类型,调用方法的实参是子类对象

  • 实例变量声明父类类型,实际存储的是子类对象

2、数组元素是父类类型,元素对象是子类对象
3、方法返回值类型声明为父类类型,实际返回的是子类对象

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Day60 单调栈 part03

Day60 单调栈 part03 最后一天啦!完结撒花~ 84.柱状图中最大的矩形 我的思路: 感觉和接雨水差不多,只需要多考虑一些情况 双指针 lheight 和 rheight 分别是用来存储每个柱子的左边界和右边界的数组。 解答: class Solutio…

vue element ui 打开弹窗出现黑框问题

文章目录 问题描述解决方案 问题描述 大家好!今天是2024年4月20日 | 农历三月十二,周六的我又做在公司里面写起了代码 今天在做项目的时候遇到一个奇怪的问题,如下图所示: 因为这个页面我做了两个弹框,先弹出来第一个弹…

前端工程化01-复习jQuery当中的AJAX

4.1、基础概念 什么是服务器 一台存储网站内容、网站文件的电脑 什么是资源 网站中使用的文件(html、css、图片、…)这些东西就叫做资源数据也是服务器上的资源,而且是一个网站的灵魂 客户端 客户端应该指上网的设备但是在前端开发中&a…

SQLite 的命令行 Shell(三十一)

返回:SQLite—系列文章目录 上一篇:SQLite FTS5 扩展(三十) 下一篇:SQLite—系列文章目录 1. 入门 SQLite 项目提供了一个名为 sqlite3(或 Windows 上的sqlite3.exe)的简单命令行程序 …

密码学 | 承诺:绑定性 + 隐藏性

🥑原文:承诺方案(Commitment)学习笔记 🥑写在前面: 本文属搬运博客,自己留存学习。本文只会讲承诺的两个安全属性,不会再讲解承诺的定义。 正文 承诺方案需要满足两个安全属性&…

【Pytorch】Yolov5中CPU转GPU过程报错完善留档归纳

Yolov5 从CPU转GPU Python多版本切换 Conda包处理 文章目录 Yolov5 从CPU转GPU Python多版本切换 Conda包处理1.Pytorch套件中存在版本不匹配2.numpy停留在3.8没跟上pytorch2.2.23.ModuleNotFoundError: No module named pandas._libs.interval4.ImportError: cannot imp…

SpringBoot启动流程深度解析

写在前面: 由于该系统是底层系统,以微服务形式对外暴露dubbo服务,所以本流程中SpringBoot不基于jetty或者tomcat等容器启动方式发布服务,而是以执行程序方式启动来发布(参考下图keepRunning方法)。 本文以调试一个实际的SpringBoo…

【做一名健康的CSDNer】

程序员由于工作性质,常常需要长时间面对电脑,这可能对身心健康带来挑战。以下是一些实用的建议,帮助程序员保持身心健康: 规律生活:建立健康的生活习惯,包括规律的作息时间和固定的饮食时间,保证…

书生·浦语大模型实战营Day04OpenXLab 部署

书生浦语大模型实战营Day04OpenXLab 部署 如何在 OpenXLab 部署一个 InternLM2-7B chat 的应用。 OpenXLab浦源平台介绍 OpenXLab 浦源平台以开源为核心,旨在构建开源开放的人工智能生态,促进学术成果的开放共享。OpenXLab面向 AI 研究员和开发者提供…

【python】使用python和selenium实现某平台自动化上传作品的全步骤

第一,我们需要下载python并安装 下载地址:https://www.python.org/downloads/release/python-3123/ 3.x版本的python自带pip工具,因此不需要额外下载。 ModuleNotFoundError: No module named seleniumpip用于下载python适用的各类模块&…

yolov8自带的P2层如何开启

YOLOv8模型 简述YOLOv8不同size模型简述 在最开始的YOLOv8提供的不同size的版本,包括n、s、m、l、x(模型规模依次增大,通过depth, width, max_channels控制大小),这些都是通过P3、P4和P5提取图片特征; 正…

网络编程 -- 简易TCP网络程序

一 字符串回响 1.1 核心功能 字符串回响程序类似于 echo 指令,客户端向服务器发送消息,服务器在收到消息后会将消息发送给客户端,该程序实现起来比较简单,同时能很好的体现 socket 套接字编程的流程。 1.2 程序结构 这个程序我们…

Python编程玩转二维码

文章目录 Python编程玩转二维码第一部分:背景介绍第二部分:qrcode库是什么?第三部分:如何安装这个库?第四部分:库函数使用方法第五部分:场景应用第六部分:常见Bug及解决方案第七部分…

动力学重构/微分方程参数拟合 - 基于模型

这一篇文章,主要是给非线性动力学,对微分方程模型参数拟合感兴趣的朋友写的。笼统的来说,这与混沌系统的预测有关;传统的机器学习的模式识别虽然也会谈论预测结果,但他们一般不会涉及连续的预测。这里我们考虑的是&…

Git ignore、exclude for TortoiseGit 小结

1.Ignore Type:忽略类型,也即忽略规则,如何去忽略文件? 1.1.Ignore item(s) only in containing folder(s):仅忽略在包含在文件夹中项目。 仅忽略该文件夹下选定的patterns。the patterns其实就是文件类型,比如.txt后…

文本美学:text-image打造视觉吸引力

当我最近浏览 GitHub 时,偶然发现了一个项目,它能够将文字、图片和视频转化为文本,我觉得非常有趣。于是我就花了一些时间了解了一下,发现它的使用也非常简单方便。今天我打算和家人们分享这个发现。 项目介绍 话不多说&#xf…

面试(05)————Redis篇

目录 一、项目中哪些地方使用了redis 问题一:发生了缓存穿透该怎么解决? 方案一:缓存空数据 方案二:布隆过滤器 模拟面试 问题二: 发生了缓存击穿该怎么解决? 方案一:互斥锁 方案二&#xff…

【GPTs分享】GPTs分享之Image Recreate | img2img​

简介 该GPT是一个专门用于图像编辑、重建和合并的工具。它通过详细的自动图像描述和生成,帮助用户从源图像中重现或修改图像。此工具设计用于为视障用户提供图像内容的详细描述,并生成全新的图像,以满足特定的视觉需求。 主要功能 \1. 图像…

Clion 2023.1.5 最新详细破解安装教程

CLion 最大的优点是跨平台,在Linux、Mac、Windows 上都可以运行。CLion 还同时支持 GCC、Clang、MSVC 这 3 种编译器,使用 CLion 编写程序,程序员可以根据需要随意切换使用的编译器。 第一步: 下载最新的 Clion 2023.1.5 版本安装包 我们先…

掌握字幕艺术:pysrt 库指南

文章目录 掌握字幕艺术:pysrt 库指南第一部分:背景介绍第二部分:库是什么?第三部分:如何安装这个库?第四部分:库函数使用方法第五部分:场景应用第六部分:常见Bug及解决方…