Java语言-----封装、继承、抽象、多态、接口
目录
前言
一.封装
1.1封装的定义
1.2访问修饰符的使用
二.继承
2.1继承的定义
2.2继承的方法
2.3继承使用注意点
三.多态
3,1多态的定义
3.2动态绑定
3.3方法重写
3.4向上(向下)转型
四.抽象
4.1抽象的概述和定义
4.2抽象的使用
五.接口
5.1接口的意义
5.2接口的定义
总结
😽个人主页: tq02的博客_CSDN博客-C语言,Java领域博主
🌈理想目标:努力学习,向Java进发,拼搏一切,找到一份朝九晚五,有假期的工作,让自己的未来不会有遗憾。
🎁欢迎各位→点赞👍 + 收藏⭐ + 评论📝+关注✨本章讲解内容:Java封装、继承、抽象、多态、接口
使用编译器:IDEA
前言
在讲述封装、继承、抽象、多态、接口前,我们得先了解一下,什么是类与对象,类与对象的详细讲解:tq02的类与对象讲解
一.封装
1.1封装的定义
封装,在类里操作,将类的成员变量和成员方法进行封装处理,意义:可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。而对类进行封装我们需要使用访问修饰符,一共分为四种,
| 访问修饰符 | private | default | protected | public |
| 同一包的同一类 | √ | √ | √ | √ |
| 同一包的不同类 | √ | √ | √ | |
| 不同包的子类 | √ | √ | ||
| 不同包的非子类 | √ |
注:1.如果成员变量或者成员方法没有使用封装则是默认使用default修饰符。
2.包是存放多个类的容器,就是防止在工程建立时,和其他人写的类名相同而起冲突。
3.子类是在继承当中可以学到的。
1.2访问修饰符的使用
我们进行四种封装代码实例图
1.private修饰

private修饰的price和name变量,其他类无法访问,只有自己的类里可以进行访问。就例如在BookList类里无法直接访问这两个元素变量。
2.default修饰

default修饰符,是指当你没有标注修饰符时,就默认了default修饰符,而此类的只有同一个包的其他类访问,例如BookList可以访问,但不同包的Student类无法访问。
3.protected修饰符

protected修饰符,类当被修饰了之后,同包下所有的类都可以访问,非同包下的其他包的子类也可以使用。如Student类继承之后也可以使用Book类。
4.public修饰符

public修饰符,一旦使用,所有的类都可以使用,不在乎是否同包。
二.继承
2.1继承的定义
继承是什么?是所有OOP语言不可缺少的组成成分,是面向对象的三大特征之一,继承就相当于,孩子继承父亲的东西(父亲愿意给孩子的东西),关键字是extends,继承父类的成员变量和成员方法,一般是为了减少代码冗余。但是继承也得遵守访问修饰符,一旦不符合,则无法继承。
代码显示:
public class Animal {public String name;public Animal(String name) {this.name = name;}public void eat(String food) {System.out.println(this.name + "正在吃" + food);
}
}
// Cat.java
class Cat {public String name;public Cat(String name) {this.name = name;}public void eat(String food) {System.out.println(this.name + "正在吃" + food);
}
}
// Bird.java
class Bird {public String name;public Bird(String name) {this.name = name;}public void eat(String food) {System.out.println(this.name + "正在吃" + food);}public void fly() {System.out.println(this.name + "正在飞 ︿( ̄︶ ̄)︿");}
}
可以看得出来,Animal类和cat类还有Bird类,有很多重复的代码,而为了减少大量的冗余代码,我们可以使用继承的手段。
2.2继承的方法
定义方法:
class 子类 extends 父类 {
}
代码实现:
class Animal {public String name;public Animal(String name) {this.name = name;
}public void eat(String food) {System.out.println(this.name + "正在吃" + food);}
}class Cat extends Animal {public Cat(String name) {// 使用 super 调用父类的构造方法.super(name);}
}class Bird extends Animal {public Bird(String name) {super(name);
}public void fly() {System.out.println(this.name + "正在飞 ︿( ̄︶ ̄)︿");}
}
public class Test {public static void main(String[] args) {Cat cat = new Cat("小黑");cat.eat("猫粮");Bird bird = new Bird("圆圆");bird.fly();
}
}
我们可以看出,Cat类和Bird类的成员变量和成员方法相当于是在Animal类的基础上,扩展出来。
2.3继承使用注意点
- 使用 extends 指定父类.
- Java 中一个子类只能继承一个父类 (而C++/Python等语言支持多继承).
- 子类会继承父类的所有 public 的变量和方法.
- 对于父类的 private 的字段和方法, 子类中是无法访问的.
- 子类的实例中, 也包含着父类的实例. 可以使用 super 关键字得到父类实例的引用
- 所有的类都有一个父类---Object类
三.多态
3,1多态的定义
多态是面向对象三大特征最后一个,可以增强程序的扩展性,提高程序的可维护性。而它的主要支撑技术有向上转型、向下转型、动态绑定、方法重写。
3.2动态绑定
即方法与方法的主体在运行时才进行绑定。例如,当父类和子类拥有一个同名的方法(remove),那么定义了an.remove(),remove方法的调用主体是an,但是an只有调用时,才能知道是实例化了哪个类。而这便是动态绑定。
3.3方法重写
当子类和父类的成员方法名相同时,那么子类的成员方法便是方法重写。而当子类的对象实例化之后,使用和父类同名的方法,则使用的子类的方法,不是使用父类的方法。
class Animal {public String name;public void Name(String name) {System.out.println("Animal的名字是"+name);
}}class Cat extends Animal {public void Name(String name) {System.out.println("Cat的名字是"+name);
}
}
public class Test {public static void main(String[] args) {Cat cat = new Cat();cat.Name("小黑");
}
}
该代码的结果是Cat的名字是小黑,由此可见,使用的Cat类的Name方法,而不是Animal类的Name方法。
3.4向上(向下)转型
向上转型和向下转型都是在继承的基础上
class Animal {public String name;public Animal(String name) {this.name = name;
}}class Cat extends Animal {public int age;public Cat(String name) {// 使用 super 调用父类的构造方法.super(name);}public void eat(String food) {System.out.println(this.name + "正在吃" + food);}
}
public class Test {public static void main(String[] args) {Animal cat = new Cat("小黑");cat.eat();
}
}
从上面代码中,我们可以发现cat是Animal的引用变量,而它指向了子类的对象,这就是向上转型。
注:
- cat是Animal类型的引用变量,而对于Animal类型的引用变量来说,是无法得知age子类成员变量的,所以无法使用cat.age=22;进行赋值的。
- 由于cat实际上指向Cat的对象,所以当调用eat()方法时;依然还能显示子类成员方法的信息。
public class Animal {protected String name;public Animal(String name) {this.name = name;}public void eat(String food) {System.out.println("我是一只小动物");System.out.println(this.name + "正在吃" + food);}
}
public class Bird extends Animal {public Bird(String name) {super(name);}public void eat(String food) {System.out.println("我是一只小鸟");System.out.println(this.name + "正在吃" + food);}public void fly() {System.out.println(this.name + "正在飞");}public static void main(String[] args) {Animal animal = new Bird("圆圆");//强制转换为Bird类型Bird bird = (Bird)animal;bird.fly();}
}
从上面代码中,我们可以很明显的发现向下转型需要通过强制类型转换完成。虽然animal是Animal父类的引用变量,但是将animal强制转换为Bird类型便为向下转型。但是并不安全,因为向下转型可能会不正确,例如原本向下转型为Cat类,但却转型为了Bird类,这便会产生危险性。
解决方法:
Animal animal = new Cat("小猫");
if (animal instanceof Bird) {
Bird bird = (Bird)animal;
bird.fly();
}
instanceof 可以判定一个引用是否是某个类的实例. 如果是, 则返回 true. 这时再进行向下转型就比较安全了。
结论:1.向上转型时,是父类的引用变量指向了子类的对象,当然,无法使用子类的新增成员(变量和方法),但是如果使用父类的成员方法,如果子类有该方法的重写,则使用重写的方法,若无,则使用父类方法。
2.向下转型时,则需要强制类型转换。
四.抽象
4.1抽象的概述和定义
抽象类,关键字为abstract,如果所有的子类都要重写父类的某个方法时,父类的方法可以为抽象方法,直接声明,不需要结构体。而含有抽象方法的类,则为抽象类
定义方法:public abstract 类名{
String name;
public abstract void 方法名();
}
4.2抽象的使用
抽象类存在的最大意义就是为了被继承.
抽象类不能被实例化, 要想使用, 只能创建该抽象类的子类. 然后让子类重写抽象类中的抽象方法。
abstract class Animal {public String name;public Animal(String name) {this.name = name;
}public abstract void eat(String food); //抽象方法,子类一定要重写
}class Cat extends Animal {public Cat(String name) {// 使用 super 调用父类的构造方法.super(name);//重写父类的抽象方法public abstract void eat(String food){System.out.println("猫吃"+food);}}
}class Bird extends Animal {public Bird(String name) {super(name);
}//重写父类的抽象方法public abstract void eat(String food){System.out.println("鸟吃"+food);}
}
public class Test {public static void main(String[] args) {Cat cat = new Cat("小黑");cat.eat("猫粮");Bird bird = new Bird("圆圆");bird.fly();
}
}
抽象的重点知识:
- 抽象类不能直接实例化。
- 抽象方法不能是 private 的。
- 抽象类中可以包含其他的非抽象方法, 也可以包含字段. 这个非抽象方法和普通方法的规则都是一样的, 可以被重写,也可以被子类直接调用。
五.接口
5.1接口的意义
接口是为了弥补代码无法多继承,只能单继承的问题。例如定义了一个Animal的父类,和Cat、Bird、Dog、Wolf的子类,可是你想啊,狗和猫是宠物,或许有共同的方法,定义一个宠物类,那么可以通过接口实现不相关类的相同行为。
好处:
- 利于代码的规范,目的是给开发人员一个清晰的指示,告诉他们哪些业务需要实现;同时防止由于开发人员随意命名而导致命名不清晰和代码混乱,影响开发效率。
- 是有利于对代码进行维护,定义一个接口,把功能菜单放在接口里,然后定义类时实现这个接口。
- 是保证代码的安全和严密。
5.2接口的定义
定义方法:
public interface 接口名{ }
使用接口:
class 类名 implements 接口名{ 方法体 };
代码实现:
class Animal {public String name;public Animal(String name) {this.name = name;}}//定义接口
public interface Eat {public void eat(String food);
}//使用接口
class Dog extends Animal implements Eat{public int age;public Cat(String name) {// 使用 super 调用父类的构造方法.super(name);}public void eat(String food) {System.out.println(this.name + "正在吃" + food);}
}//使用接口
class Cat extends Animal implements Eat{public int age;public Cat(String name) {// 使用 super 调用父类的构造方法.super(name);}public void eat(String food) {System.out.println(this.name + "正在吃" + food);}
}
public class Test {public static void main(String[] args) {Animal cat = new Cat("小黑");cat.eat();
}
}
接口的重点:
- 接口的方法体若为空,则为空实现。
- 一个类可以有多个接口。
- 接口里所有的方法都是public和抽象的,所以可以省略public和抽象的。
- 接口无法被实例化。
- 接口可以被继承
总结
继承是多态、抽象的基础,而学会了抽象,才能理解接口。而这些知识都是Java最为重要的面向对象三大特征的。只有细心学习,才能更近一步,在Java上才能算正式起步。
相关文章:
Java语言-----封装、继承、抽象、多态、接口
目录 前言 一.封装 1.1封装的定义 1.2访问修饰符的使用 二.继承 2.1继承的定义 2.2继承的方法 2.3继承使用注意点 三.多态 3,1多态的定义 3.2动态绑定 3.3方法重写 3.4向上(向下)转型 四.抽象 4.1抽象的概述和定义 4.2抽象的使用 五…...
基于深度学习的瓶子检测软件(UI界面+YOLOv5+训练数据集)
摘要:基于深度学习的瓶子检测软件用于自动化瓶子检测与识别,对于各种场景下的塑料瓶、玻璃瓶等进行检测并计数,辅助计算机瓶子生产回收等工序。本文详细介绍深度学习的瓶子检测软件,在介绍算法原理的同时,给出Python的…...
仿网易云小程序(一)
目录 一、项目准备 二、项目初始化 1.新建项目 2.封装service请求 三、底部导航栏的设计 四、MV页面的设计 1.将获取到的数据进行渲染 2.播放量数据进行处理转换 3.时长数据进行处理转换 五、MV组件的抽离封装 六、请求的抽离video 七、下拉重新请求新的数据 八、跳转到…...
【C++】vector模拟实现及其应用
文章目录vector的介绍vector的使用及其实现vector的定义vector iterator 的使用vector空间增长问题vector的增删查改vector的介绍 vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素…...
JS看这一篇就够啦,JS基础大全,可用于快速回顾知识,面试首选
1 JS简介 更多JS内容可以看MDN:点击传送 浏览器分成两部分:渲染引擎和 JS 引擎 渲染引擎:用来解析HTML与CSS,俗称内核,比如 chrome 浏览器的 blink ,老版本的 webkitJS 引擎:也称为 JS 解释器…...
武汉凯迪正大GB4208外壳防护等级试具
一、IP1X 试验探棒 产品概述: 符合IEC61032图1试具A、GB16842试具A、GB4208IP1、IEC60529IP1、IEC60065 等标准要求。用于防止手背触及的防护检验。 技术参数: 1、探球直径:50mm 2、挡板直径:45mm 3、挡板厚度:…...
Cent OS 从零部署ruoyi-cloud教程
1、java环境安装 https://blog.csdn.net/m0_61035257/article/details/125705400 Java_home设置 https://blog.csdn.net/m0_51104427/article/details/123924893 2、mysql安装 https://blog.csdn.net/ShockChen7/article/details/126965940 若安装的是Mysql8,建议…...
ChatGPT相关核心算法
ChatGPT 的卓越表现得益于其背后多项核心算法的支持和配合。本文将分别介绍作为其实现基础的 Transformer 模型、激发出其所蕴含知识的Prompt/Instruction Tuning 算法、其涌现出的思维链能力、以及确保其与人类意图对齐的基于人类反馈的强化学习算法。 1.基于Transformer的预…...
Python导入模块,Python import用法(超级详细)
使用 Python 进行编程时,有些功能没必须自己实现,可以借助 Python 现有的标准库或者其他人提供的第三方库。比如说,在前面章节中,我们使用了一些数学函数,例如余弦函数 cos()、绝对值函数 fabs() 等,它们位…...
大量产品“GPT 化”,开源大模型 AI 应用开发框架发布
大型语言模型(LLM)的出现,让我们看到了 AI 在自然语言处理方面的潜力,它涌现出来的创造力和思维能力令人叹为观止,并在新一代人机交互领域释放了大量的想象空间。 目前,决策者、产品负责人和开发者都在抢滩…...
STM32——IIC总线(MPU6050应用)
目录 一、IIC介绍 二、MPU6050 三、MPU6050实例 四、EEPROM ---------------------------------------------------------------------------------------------------------------------------- 每次都是IIC好没新意啊,我决定这次录视频的时候举两个例子&…...
ADB使用经验
adb是Android Debug Bridge的缩写,是一种用于与Android设备通信的命令行工具。它可以通过USB连接或Wi-Fi连接,允许开发者在计算机和Android设备之间进行文件传输、安装应用程序、调试应用程序等操作。要使用adb,需要先将Android设备与计算机连…...
详解LinkedHashSet和LinkedHashMap
目录 一.LinkedHashSet和LinkedHashMap 1.基本介绍 2.与HashSet和HashMap的区别 3.LinkedHashSet和LinkedHashMap具体的方法 1.LinkedHashSet 2.LinkedHashMap 二.模拟代码实现LinkedHashMap 三.具体应用 一.LinkedHashSet和LinkedHashMap 1.基本介绍 顾名思义,根据名…...
C++ LinuxWebServer 2万7千字的面经长文(下)
⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! Linux Web Server项目虽然是现在C求职者的人手一个的项目,但是想要吃透这个项目,还是…...
RK3568平台开发系列讲解(驱动基础篇)IO 模型的分类
🚀返回专栏总目录 文章目录 一、阻塞 IO二、非阻塞 IO三、IO 多路复用四、信号驱动五、异步 IO沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将针对IO模型进行分类。 假设有这样一个场景,从磁盘中循环读取 100M 的数据并处理,磁盘读取 100M 需要花费 20 秒的…...
ChatGPT 有哪些 “激动人心的时刻“?以及自己的一些思考
文章目录一、前言二、主要内容三、一些思考🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、前言 近日,英伟达创始人兼 CEO 黄仁勋与 OpenAI 联合创始人及首席科学家伊尔亚-苏茨克维 (Ilya Sutskever) 展开了一次 “炉边谈话”。 黄仁…...
Thingsboard开源物联网平台智慧农业实例快速部署教程(二)【手把手部署UI与动态数据】
Thingsboard开源物联网平台智慧农业实例快速部署教程(二)【部署UI与动态数据】 文章目录Thingsboard开源物联网平台智慧农业实例快速部署教程(二)【部署UI与动态数据】1. 页面总览2. 设备2.1 数据字段定义2.2 设备映射关系2.3 添加…...
Redis事务
1、事务概要 Redis事务是一个单独的隔离操作: 事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。 Redis事务的主要作用 串联多个命令,防止别的命令插队。 事务的3个命令 MultiExe…...
【蛤蟆先生去看心理医生】
第一章 整个人都不太好 人物性格描述蛤蟆热情、时尚、爱冒险,现在抑郁,不能自拔獾智慧、威严河鼠关心朋友,有点絮叨鼹鼠体贴善良 第二章 擎友前来相助 讲诉了鼹鼠和河鼠对蛤蟆情况的担忧和讨论。鼹鼠回忆起过去蛤蟆时髦的打扮和充满活力的生…...
JAVA开发与运维(云安全产品)
在现在的开发和运维中,云生态组件的使用率非常高,很少公司自己维护自己的物理机,网络流量 ,监控,第三方中间件,除了少数涉密程度高的部分和公司外,大多数的企业都在使用云生态。比如我们正在开发…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...

