当前位置: 首页 > 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…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...