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

如何将影像组学与计算病理特征关联肿瘤微环境“反应/荒漠”基质表型建立关联,并进一步解释其与胰腺癌术后早期复发及ECM重塑的机制联系

01导语各位同学&#xff0c;大家好。做影像组学最怕的是什么&#xff1f;是模型精度刷到0.99&#xff0c;但一问“为什么能预测”就哑口无言——特征到底对应什么生物学过程&#xff1f;细胞、基质、还是血管&#xff1f;完全说不清。今天咱们通过一篇发表于Advanced Science的…...

如何快速实现智慧树自动刷课:终极完整使用指南

如何快速实现智慧树自动刷课&#xff1a;终极完整使用指南 【免费下载链接】zhihuishu 智慧树刷课插件&#xff0c;自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台枯燥的视频学习而手动点击"下一集&quo…...

2026届最火的五大降重复率工具实际效果

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 要降低AI生成文本的检测率&#xff0c;关键之处在于让内容展现出人类写作的典型特征&#xf…...

如何快速激活Windows和Office:KMS智能激活脚本完整指南

如何快速激活Windows和Office&#xff1a;KMS智能激活脚本完整指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows激活弹窗烦恼吗&#xff1f;是否遇到过Office突然变成只读模式无…...

人体蛋白质异构体图谱

摘要 新兴研究凸显了蛋白异构体的重要性——尽管源自同一基因,蛋白异构体通常具有独特的功能作用,且有助于生理多样性、疾病机制及表型变异的形成。然而,目前缺乏全面表征蛋白异构体的异构体水平资源。IsoProDB是个整合统一的一站式数据库,对来自RefSeq和UniProtKB的蛋白异…...

告别盲调!用C#和nRF24L01为你的赛车打造一套无线数据监控系统(附上位机源码)

基于C#与nRF24L01的赛车无线监控系统开发实战 在智能车与机器人开发领域&#xff0c;实时数据监控一直是调试过程中的关键痛点。传统有线数据采集方式存在布线复杂、移动受限等问题&#xff0c;而商用无线方案往往成本高昂且灵活性不足。本文将深入讲解如何利用成本不到50元的n…...

从微软Surface战略迷思看硬件定价、生态与市场定位

1. 项目概述&#xff1a;一场迟到的平板战争2012年&#xff0c;当微软在洛杉矶的发布会上&#xff0c;从一张看似普通的桌子下抽出那台名为“Surface”的平板电脑时&#xff0c;整个科技圈都屏住了呼吸。镁光灯闪烁&#xff0c;媒体头条争相报道&#xff0c;这似乎是微软对苹果…...

Glowby OSS:本地优先AI编码代理工作流,实现可控的代码生产化改造

1. 项目概述&#xff1a;Glowby OSS&#xff0c;一个本地优先的AI编码代理工作流 如果你和我一样&#xff0c;对AI辅助编程充满兴趣&#xff0c;但又对把代码和数据完全交给云端服务商感到不安&#xff0c;那么Glowby OSS的出现&#xff0c;绝对值得你花上十分钟了解一下。简单…...

手机号逆向查询QQ号:终极实用指南与5分钟快速上手

手机号逆向查询QQ号&#xff1a;终极实用指南与5分钟快速上手 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 你是否曾因忘记QQ号而无法登录&#xff1f;或者需要验证朋友手机号对应的QQ身份&#xff1f;手机号查QQ工具正是为解决这…...

5分钟快速上手:wxappUnpacker微信小程序逆向工程完整指南 [特殊字符]

5分钟快速上手&#xff1a;wxappUnpacker微信小程序逆向工程完整指南 &#x1f680; 【免费下载链接】wxappUnpacker forked from https://github.com/qwerty472123/wxappUnpacker 项目地址: https://gitcode.com/gh_mirrors/wxappu/wxappUnpacker 想要深入了解微信小程…...