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

免费 网站管理系统360报危险网站

免费 网站管理系统,360报危险网站,美食网站开发的难点,建材类网站模板Java中的多态有什么用&#xff1f; 举一个多态的例子&#xff1a; Deque<ListNode> stack new LinkedList<ListNode>(); 初看可能觉得“直接用 LinkedList 声明变量不更简单吗&#xff1f;”&#xff0c;但这行代码背后其实蕴含了 Java 多态的核心思想和“面向接口…

Java中的多态有什么用?

举一个多态的例子:
Deque<ListNode> stack = new LinkedList<ListNode>();
初看可能觉得“直接用 LinkedList 声明变量不更简单吗?”,但这行代码背后其实蕴含了 Java 多态的核心思想和“面向接口编程”的设计原则。本文将从实际场景出发,拆解这种写法的优势,以及为什么不推荐其他替代方案。

一、先搞懂:这行代码里的多态是什么?

要理解这种写法,首先需要明确 多态在 Java 集合中的体现

Deque<ListNode> stack = new LinkedList<ListNode>(); 中:

  • 左侧 Deque<ListNode>:是 接口类型(Deque 是双端队列接口,定义了 push()pop()add() 等标准操作);
  • 右侧 new LinkedList<ListNode>():是 接口的实现类对象(LinkedList 是 Deque 接口的具体实现,用链表结构实现了双端队列的所有功能)。

这完全符合 Java 多态的核心逻辑:父类型(接口)引用指向子类型(实现类)对象。就像“用‘交通工具’的引用指向‘汽车’对象”,我们只关心“交通工具能移动”的核心能力,不关心“汽车是用轮子还是翅膀”的具体实现。

二、为什么推荐用“接口声明 + 实现类实例化”?

选择 Deque<ListNode> stack = new LinkedList<>(),而不是直接用 LinkedList 声明变量,核心优势在于 解耦与灵活性。我们通过一个实际场景对比,就能直观感受到这种设计的价值。

场景背景

假设我们需要实现一个“用栈存储链表节点,后续弹出节点处理”的功能(比如链表中删除倒数第 N 个节点的场景)。

反例:用具体类 LinkedList 声明变量(耦合度高)

如果一开始直接用 LinkedList 声明变量,代码会写成这样:

// 用具体类 LinkedList 声明变量
LinkedList<ListNode> stack = new LinkedList<>();// 业务逻辑:往栈中存链表节点
stack.push(head);       // 存头节点
stack.push(head.next);  // 存下一个节点// 定义方法:接收 LinkedList 类型的参数
public void processStack(LinkedList<ListNode> stack) {while (!stack.isEmpty()) {ListNode node = stack.pop();  // 弹出节点并处理System.out.println("处理节点值:" + node.val);}
}// 调用方法
processStack(stack);
问题:想换更高效的 ArrayDeque 时,要“牵一发而动全身”

后来我们发现,ArrayDeque(同样实现了 Deque 接口)的效率比 LinkedList 更高(ArrayDeque 基于数组实现,随机访问更快),想把 LinkedList 换成 ArrayDeque

但因为最初用了 具体类声明变量,我们必须修改 所有和 stack 相关的地方

  1. 变量声明:ArrayDeque<ListNode> stack = new ArrayDeque<>();
  2. 方法参数:public void processStack(ArrayDeque<ListNode> stack) { ... }
  3. 方法调用:如果其他地方调用 processStack,传入的参数类型也必须从 LinkedList 改成 ArrayDeque
  4. 返回值:如果有方法返回 LinkedList<ListNode>,也要改成 ArrayDeque<ListNode>

这种修改方式不仅繁琐,还容易遗漏代码导致 Bug——这就是“代码耦合度高”的代价:代码和具体实现类绑定死了,失去了灵活性。

正例:用接口 Deque 声明变量(灵活解耦)

如果一开始就用 Deque 接口声明变量,代码会是这样:

// 用接口 Deque 声明变量,实例化用 LinkedList
Deque<ListNode> stack = new LinkedList<>();// 业务逻辑不变(push、pop 是 Deque 定义的方法)
stack.push(head);
stack.push(head.next);// 方法参数用 Deque 接口(不依赖具体实现)
public void processStack(Deque<ListNode> stack) {  // 这里不用改!while (!stack.isEmpty()) {ListNode node = stack.pop();              // 这里也不用改!System.out.println("处理节点值:" + node.val);}
}// 调用方法不变
processStack(stack);
优势:换 ArrayDeque 只需改 1 行代码

当我们想换成 ArrayDeque 时,只需要修改实例化的部分,其他所有代码完全不变:

// 只改这一行:把 new LinkedList 换成 new ArrayDeque
Deque<ListNode> stack = new ArrayDeque<>();// 下面的业务逻辑、方法参数、调用方式全不变!
stack.push(head);
processStack(stack);  // 正常运行,因为 processStack 接收的是 Deque 类型

这种写法的核心价值在于:代码只依赖“功能规范”(Deque 定义的方法),不依赖“具体实现”(LinkedList 或 ArrayDeque)。无论底层用哪种实现类,只要符合 Deque 接口的规范,上层代码就无需调整。

三、其他常见写法的问题:为什么不推荐?

除了“接口声明 + 实现类实例化”,我们还可能想到其他写法,但这些写法都存在明显缺陷。

1. 为什么不直接用 Deque<ListNode> stack = new Deque<>();

错误原因:Deque 是接口,不能直接实例化(new)。

Java 中,接口的作用是“定义规范”,它只包含方法的声明(没有方法体),本身没有具体实现逻辑。就像“不能直接造一个‘交通工具’,只能造‘汽车’或‘自行车’(交通工具的实现类)”,接口必须通过它的实现类(如 LinkedList、ArrayDeque)才能创建对象。

2. 为什么不推荐 LinkedList<ListNode> stack = new LinkedList<>();

问题核心:耦合度高,限制未来扩展。

如前文反例所示,这种写法会让变量 stackLinkedList 这个具体实现类强绑定。如果后续想更换实现类(比如换成 ArrayDeque、ConcurrentLinkedDeque 等),就必须修改所有声明、参数、返回值,维护成本极高。

简单说:用具体类声明变量,相当于“把代码焊死在某个实现上”,失去了多态带来的灵活性。

3. 为什么 Deque<ListNode> stack = new ArrayDeque<>(); 是可行的?

这是完全可行的!因为 ArrayDeque 也是 Deque 接口的实现类,符合“接口声明 + 实现类实例化”的原则。

选择 LinkedList 还是 ArrayDeque,只取决于具体业务需求:

  • LinkedList:适合频繁在两端插入/删除数据的场景(链表结构的优势);
  • ArrayDeque:适合频繁随机访问、对效率要求高的场景(数组结构的优势)。

但无论选哪种实现类,用 Deque 接口声明变量的写法始终是最优的——它保证了代码的灵活性和可维护性。

四、总结:面向接口编程的核心思想

通过 Deque<ListNode> stack = new LinkedList<>(); 这个例子,我们能提炼出 Java 开发中“面向接口编程”的核心原则:

  1. 依赖抽象,不依赖具体:上层代码只关心“需要什么功能”(接口定义的方法),不关心“功能如何实现”(实现类的细节);
  2. 解耦与灵活:更换实现类时,只需修改实例化部分,上层代码无需调整;
  3. 提高可读性:通过接口类型(如 Deque),其他开发者能快速理解变量的核心功能(双端队列),而不用关心底层是链表还是数组实现。

这种思想不仅适用于集合框架,在整个 Java 开发中都至关重要(比如 Spring 中的依赖注入、接口回调等)。掌握它,能让你的代码更健壮、更易维护,也更符合工业级开发的规范。

http://www.dtcms.com/a/436323.html

相关文章:

  • 【最新】2025年计算机软件著作权合作开发协议示例文件
  • Scade One 图形建模 - 算术算符
  • 数据集网站网站管理
  • 百度收录正常网站流量下降石家庄seo推广
  • asp网站作业下载网站在线统计代码
  • 保安公司网站如何做象山网站建设
  • 英语学习-Saints036
  • 淘客网站开发公司青岛网络公司有哪些
  • php网站开发需要多久做网站都需要哪些费用
  • 石家庄建站外贸网站上海新闻最新消息
  • Mysql速成笔记1(DDL)
  • ps做 网站标准尺寸是多少网站域名使用怎么做待摊分录
  • 如何做好网站建设工作学校网站建设阶段性目标
  • 北京网站建设yi wl什么行业需要做网站
  • 恒网做的网站wordpress邮件设置密码
  • 网站备案阿里云流程长沙网站seo排名
  • 从技术表演到价值落地——从云栖大会透视中国AI商业化落地密码
  • 一键生成原创视频番禺网站排名优化公司
  • 音乐网站怎么做外链怎么查询商标是否已被注册
  • 株洲网站的建设宿迁房产网新楼盘
  • 盐城经济技术开发区建设局网站cocos游戏开发
  • 深圳网站制作哪家专业企业品牌策划推广方案
  • 中国做的比较好的网站设计公司有哪些动漫制作专业认识
  • 某学校网站建设方案论文工信部备案
  • 网站建设公司云南简单的网页制作软件
  • 福建网站备案个人网页制作成品html
  • 商城网站开发培训学校之前做的网站推广怎么删除
  • 无锡企业网站制作策划深圳公司网页设计推广报价
  • 嵌入式软件知识点汇总(day6):常见通信方式(上)
  • 衡阳网站设计ss0734做个人网站怎么赚钱