当前位置: 首页 > news >正文

【java面向对象的三大特性】封装、继承和多态

目录标题

  • 一、封装(Encapsulation):
  • 二、继承(Inheritance):
  • 三、多态(Polymorphism):
      • 1. 多态的三个必要条件:
      • 2.多态的具体实现:
      • 3.多态的使用场景:
      • 4.多态的好处:
      • 5.多态的注意事项:
      • 6.实际应用场景:

三者之间的关系:

封装是基础,提供了数据的安全性
继承提供了代码的复用性
多态提供了代码的灵活性和扩展性

一、封装(Encapsulation):

// 封装示例
public class Student {// 私有属性(实现封装)private String name;private int age;// 提供公共的访问方法(getter和setter)public String getName() {return name;}public void setName(String name) {// 可以在这里添加数据验证if (name != null && !name.isEmpty()) {this.name = name;}}public int getAge() {return age;}public void setAge(int age) {// 添加年龄验证if (age > 0 && age < 150) {this.age = age;}}
}

封装的特点:

隐藏内部实现细节
对属性的访问进行控制
提高代码的安全性
只能通过规定的方法访问数据

二、继承(Inheritance):

// 父类
public class Animal {protected String name;public void eat() {System.out.println(name + "正在吃东西");}public void sleep() {System.out.println(name + "正在睡觉");}
}// 子类继承父类
public class Dog extends Animal {// 子类可以使用父类的属性和方法// 子类可以有自己的属性和方法private String breed;public void bark() {System.out.println(name + "在汪汪叫");}// 子类可以重写父类的方法@Overridepublic void eat() {System.out.println(name + "在吃骨头");}
}

继承的特点:

子类可以使用父类的属性和方法
子类可以有自己的属性和方法
子类可以重写父类的方法
Java只支持单继承,但可以实现多个接口

三、多态(Polymorphism):

1. 多态的三个必要条件:

// 1. 继承或者实现(继承父类或实现接口)
// 2. 重写(重写父类/接口的方法)
// 3. 父类引用指向子类对象(向上转型)

2.多态的具体实现:

简单示例

// 炒菜的接口
interface Cooking {void cook();  // 炒菜的方法
}// 青椒炒肉
class PepperMeat implements Cooking {public void cook() {System.out.println("炒青椒炒肉");}
}// 番茄炒蛋
class TomatoEgg implements Cooking {public void cook() {System.out.println("炒番茄炒蛋");}
}// 厨师类
class Chef {// 多态体现在这里:接收任何实现了Cooking接口的类public void doCook(Cooking dish) {dish.cook();  // 具体炒什么菜由传入的对象决定}
}//!!!! 多态的使用场景:public class Test {public static void main(String[] args) {Chef chef = new Chef();// 来个青椒炒肉chef.doCook(new PepperMeat());  // 输出:炒青椒炒肉// 来个番茄炒蛋chef.doCook(new TomatoEgg());   // 输出:炒番茄炒蛋/**
想象你是餐厅服务员:
顾客说:"我要点菜"(调用doCook方法)
顾客说具体要什么菜(传入的dish对象):"我要青椒炒肉"(传入PepperMeat对象)
"我要番茄炒蛋"(传入TomatoEgg对象)你把菜单给厨师(调用cook方法)*/}
}

多态的作用是:

代码更灵活
不需要修改厨师的代码,就能让厨师炒新的菜
调用同一个方法,能得到不同的结果

// 1. 基于继承的实现
class Animal {public void makeSound() {System.out.println("动物叫");}
}class Dog extends Animal {@Override  // 重写父类方法public void makeSound() {System.out.println("汪汪汪");}
}class Cat extends Animal {@Override  // 重写父类方法public void makeSound() {System.out.println("喵喵喵");}
}// 2. 基于接口的实现
interface Shape {double getArea();
}class Circle implements Shape {private double radius;@Overridepublic double getArea() {return Math.PI * radius * radius;}
}class Rectangle implements Shape {private double width;private double height;@Overridepublic double getArea() {return width * height;}
}

3.多态的使用场景:

//多态的使用场景:// 1. 方法参数的多态
public class AnimalService {public void makeAnimalSound(Animal animal) {  // 父类引用作为参数animal.makeSound();  // 调用的是子类重写的方法}
}// 使用
AnimalService service = new AnimalService();
service.makeAnimalSound(new Dog());  // 输出:汪汪汪
service.makeAnimalSound(new Cat());  // 输出:喵喵喵// 2. 数组或集合中的多态
Animal[] animals = new Animal[2];
animals[0] = new Dog();  // 向上转型
animals[1] = new Cat();  // 向上转型for(Animal animal : animals) {animal.makeSound();  // 分别输出:汪汪汪、喵喵喵
}

4.多态的好处:

降低耦合度:代码之间的依赖关系变少
提高扩展性:新增子类不需要修改原有代码
同一个方法可以有不同的实现
父类引用可以指向子类对象
接口引用可以指向实现类对象
增加代码的复用性,提高代码的灵活性和扩展性

5.多态的注意事项:

Animal animal = new Dog();
animal.makeSound();  // 正常调用,会调用Dog的方法// 无法调用子类特有的方法
// animal.fetch();  // 错误!Animal类型的引用无法调用Dog特有的方法// 如果需要调用子类特有方法,需要向下转型
if(animal instanceof Dog) {Dog dog = (Dog)animal;  // 向下转型dog.fetch();  // 现在可以调用Dog特有的方法了
}

6.实际应用场景:

// 1. 策略模式
interface PaymentStrategy {void pay(double amount);
}class CreditCardPayment implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("信用卡支付: " + amount);}
}class WeChatPayment implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("微信支付: " + amount);}
}// 2. Spring框架中的多态
interface UserDao {void save();
}@Repository  // 多个实现类,Spring通过多态特性注入
class MysqlUserDao implements UserDao {@Overridepublic void save() {System.out.println("保存到MySQL");}
}

相关文章:

【java面向对象的三大特性】封装、继承和多态

目录标题 一、封装&#xff08;Encapsulation&#xff09;&#xff1a;二、继承&#xff08;Inheritance&#xff09;&#xff1a;三、多态&#xff08;Polymorphism&#xff09;&#xff1a;1. 多态的三个必要条件&#xff1a;2.多态的具体实现&#xff1a;3.多态的使用场景&a…...

Hermite 插值

Hermite 插值 不少实际问题不但要求在节点上函数值相等&#xff0c;而且还要求它的导数值相等&#xff0c;甚至要求高阶导数值也相等。满足这种要求的插值多项式就是 Hermite 插值多项式。 下面只讨论函数值与导数值个数相等的情况。设在节点 a ≤ x 0 < x 1 < ⋯ <…...

【推理llm论文精度】DeepSeek-R1:强化学习驱动LLM推理能力飞跃

最近deepseek R1模型大火&#xff0c;正好复习一下他家的技惊四座的论文https://arxiv.org/pdf/2501.12948 近年来&#xff0c;大型语言模型&#xff08;LLM&#xff09;在推理能力上取得了显著进展&#xff0c;但如何进一步有效提升仍然是研究热点。DeepSeek-AI发布了 DeepS…...

arm linux下的中断处理过程。

本文基于ast2600 soc来阐述&#xff0c;内核版本为5.10 1.中断gic初始化 start_kernel() -> init_IRQ() -> irqchip_init() of_irq_init()主要是构建of_intc_desc. 489-514: 从__irqchip_of_table中找到dts node中匹配的of_table(匹配matches->compatible)&#xf…...

C语言:指针详解

C语言&#xff1a;指针详解 1&#xff1a;指针的基本概念1&#xff1a;什么是指针2&#xff1a;为什么要引入指针3&#xff1a;指针的作用4&#xff1a;指针的类型 2&#xff1a;指针的声明与初始化1&#xff1a; 指针的声明2&#xff1a; 指针的初始化 3&#xff1a;指针的操作…...

github用户名密码登陆失效了

问题&#xff1a; git push突然推代码需要登陆&#xff0c;但是用户名和密码正确输入后&#xff0c;却提示403 git push# Username for https://github.com: **** #Password for https://gyp-programmergithub.com: #remote: Permission to gyp-programmer/my-app.git denie…...

【删除tomcat默认管理控制台】

停止Tomcat&#xff1a; ./catalina.sh stop 删除管理控制台应用&#xff1a; 进入Tomcat的webapps目录&#xff1a; cd /path/to/tomcat/webapps List item 删除manager和host-manager文件夹&#xff1a; rm -rf manager host-manager 启动Tomcat&#xff1a; ./catali…...

动态库与静态库:深入解析与应用

在软件开发中&#xff0c;库&#xff08;Library&#xff09;是预编译的代码集合&#xff0c;用于在多个程序之间共享功能。根据链接方式的不同&#xff0c;库主要分为两种类型&#xff1a;静态库&#xff08;Static Library&#xff09; 和 动态库&#xff08;Dynamic Library…...

【鱼眼镜头12】Scaramuzza的鱼眼相机模型实操,不依赖于具体的相机几何结构,直接从图像数据出发,因此更具灵活性。

文章目录 Scaramuzza相机模型标定效果2、原理和代码代码1、 2D映射到3D&#xff0c;函数输入为2D点坐标OCAM参数代码功能详解2、3D --> 2D 3、总结Scaramuzza 模型的核心思想Scaramuzza 模型的核心思想与 Kannala-Brandt 模型的对比Scaramuzza 模型的独特之处Scaramuzza 的意…...

LVS 负载均衡集群(NAT模式)

一、环境准备 四台主机&#xff08;一台 LVS、两台 RS、一台客户端&#xff09; 注意每个虚拟机都需要关闭防火墙和 selinux 1.1.LVS 主机 LVS 主机&#xff08;两块网卡&#xff09; 第一块&#xff1a;NAT模式&#xff08;内网&#xff09; 第二块&#xff1a;添加网卡&am…...

MATLAB中的APPdesigner绘制多图问题解析?与逻辑值转成十进制

在matlab APPdesigner中绘图可以用UIAxes组件进行绘图&#xff0c;但是当想多张图时&#xff0c;只能提前绘制图像区域不方便。下面是几种办法&#xff1a; 为了操作可以添加Panl组件&#xff0c;方便操作。 1、当是要求的几个图像大小都是相同时刻采用函数&#xff1a; til…...

9种慢慢被淘汰的编程语言...

技术不断进步&#xff0c;我们使用的编程语言也不例外。 随着人工智能的兴起以及对编程语言使用的影响&#xff0c;我们更加关注哪些语言将在未来继续流行&#xff0c;哪些会被淘汰。 Python、Java 和 JavaScript 等多功能编程语言正在主导市场&#xff0c;而其他一些语言则逐…...

vue知识点5

1.如何让组件里的样式与其他组件互相不干扰 scope范围的意思 <style scope> </style> 2.vue的生命周期 创建 挂载 更新 销毁 3.vue的四个生命周期详解 创建beforeCreate,created 挂载 beforeMount,mounted 更新 beforeUpdate,updated 销毁 beforeDest…...

rdiff-backup备份

目录 1. 服务器备份知识点 1.1 备份策略 1.2 备份步骤和宝塔面板简介 1.3 CentOS7重要目录 2. 备份工具 2.1 tar -g 备份演示 2. rsync 备份演示 3. rdiff-backup 备份演示 4. 差异和优缺点 3. rdiff-backup安装和使用 3.1 备份命令rdiff-backup 3.2 恢复命令--…...

UE_C++ —— Metadata Specifiers

声明UClasses、UFunctions、UProperties、UEnums和UInterfaces时使用的元数据关键词&#xff0c;表示其与引擎和关卡编辑器诸多方面的互动方式&#xff1b; 当声明classe、interfaces、structs、enums、enum values、functions、or propertie时&#xff0c;可添加 Metadata Spe…...

【算法与数据结构】并查集详解

目录 一&#xff0c;什么是并查集 二&#xff0c;并查集的结构 三&#xff0c;并查集的代码实现 1&#xff0c;并查集的大致结构和初始化 2&#xff0c;find操作 3&#xff0c;Union操作 4&#xff0c;优化 小结&#xff1a; 四&#xff0c;并查集的应用场景 省份…...

deepseek多列数据对比,联想到excel的高级筛选功能

目录 1 业务背景 ​2 deepseek提示词输入 ​3 联想分析 4 EXCEL高级搜索 1 业务背景 系统上线的时候经常会遇到一个问题&#xff0c;系统导入的数据和线下的EXCEL数据是否一致&#xff0c;如果不一致&#xff0c;如何快速找到差异值&#xff0c;原来脑海第一反应就是使用公…...

Windows操作系统部署Tomcat详细讲解

Tomcat是一个开源的Java Servlet容器&#xff0c;用于处理Java Web应用程序的请求和响应。以下是关于Tomcat的用法大全&#xff1a; 一、安装Tomcat 下载 访问Apache Tomcat官方网站&#xff08;https://tomcat.apache.org/&#xff09;&#xff0c;根据你的操作系统&#xf…...

每日Attention学习23——KAN-Block

模块出处 [SPL 25] [link] [code] KAN See In the Dark 模块名称 Kolmogorov-Arnold Network Block (KAN-Block) 模块作用 用于vision的KAN结构 模块结构 模块代码 import torch import torch.nn as nn import torch.nn.functional as F import mathclass Swish(nn.Module)…...

今日写题04work

题目&#xff1a;移除链表元素 两种实现思路 思路一 使用双指针&#xff0c;prev&#xff0c;cur快慢指针解决。当cur不等于val&#xff0c;两个指针跳过。当等于val时&#xff0c;要考虑两种情况&#xff0c;一种是pos删&#xff0c;一种是头删除。 pos删除就是正常情况&am…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...