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

Java多态详解

Java多态详解

什么是多态?

比如我们说:“驾驶一辆车”,有人开的是自行车,有人开的是摩托车,有人开的是汽车。虽然我们都说“开车”,但“怎么开”是由具体的车类型决定的:“开”是统一的动作,具体的行为因车不同而不同。这就是生活中的“多态”现象,同一行为,通过不同的事物,可以体现出来的不同的形态。多态描述的就是这样的状态。

多态分为编译时多态和运行时多态。方法重载(overload)实现的是编译时多态(静态多态),而方法重写(override)实现的是运行时多态(动态多态)。

面向对象编程的三大核心特性:封装、继承、多态(这里指的是运行时多态),多态允许同一操作作用于不同对象时产生不同行为。Java中多态的实现依赖于继承、方法重写和向上转型,是代码灵活性和扩展性的关键机制。

多态的核心实现机制

  • 父类引用指向子类对象(向上转型):用父类类型的变量引用子类对象。
  • 方法重写:子类对父类中的方法进行重新定义,保持方法签名相同。
  • 动态绑定:JVM根据对象的实际类型(而非引用类型)决定调用哪个方法。
class Animal {void sound() { System.out.println("动物叫声"); }
}class Dog extends Animal {@Overridevoid sound() { System.out.println("汪汪"); }
}class Cat extends Animal {@Overridevoid sound() { System.out.println("喵喵"); }
}public class Test {public static void main(String[] args) {Animal a1 = new Dog(); // 向上转型Animal a2 = new Cat();a1.sound(); // 输出"汪汪"a2.sound(); // 输出"喵喵"}
}

我们之所以能在运行时调用子类方法,是因为 Java 支持动态绑定

什么是绑定?

绑定指的是一个方法的调用与**方法所在的类(方法主体)**关联起来。对java来说,绑定分为静态绑定(早绑定、编译时绑定)与动态绑定(晚绑定、运行时绑定)。

静态绑定

  • 定义:在编译阶段确定方法调用与具体实现的对应关系。
  • 绑定依据:变量声明类型(编译时类型)。
  • 典型场景:方法重载、private / static / final 方法调用。

动态绑定

  • 定义:在程序运行期间确定方法调用与具体实现的对应关系。
  • 绑定依据:对象实际类型(运行时类型)。
  • 典型场景:父类引用指向子类对象 + 方法重写。

多态的使用场景

方法参数多态性

将父类类型作为方法参数,可以接受任意子类对象:

void makeSound(Animal animal) {animal.sound();
}// 调用
makeSound(new Dog()); // 输出"汪汪"
makeSound(new Cat()); // 输出"喵喵"

集合中的多态

使用接口或父类类型声明集合,存储不同子类对象:

List<String> list = new ArrayList<>(); // 多态的应用
Set<Integer> set = new HashSet<>();

多态的注意事项

方法调用的限制

  • 通过父类引用只能调用父类中声明的方法。
  • 若需调用子类特有方法,必须向下转型。

向上转型与向下转型

  • 向上转型:子类 → 父类(包括接口实现类 → 接口),自动完成,无需显式转换。
  • 向下转型:父类 → 子类(包括接口 → 实现类),需显式转换,存在ClassCastException风险(必须先用instanceof检查)。

静态方法无多态性

静态方法属于类,调用时由引用类型决定,而非实际对象类型:

class Parent {static void method() { System.out.println("Parent"); }
}
class Child extends Parent {static void method() { System.out.println("Child"); }
}Parent p = new Child();
p.method(); // 输出"Parent"(无多态性)

成员变量的访问

成员变量无多态性,访问时由引用类型决定:

class Parent { int value = 10; }
class Child extends Parent { int value = 20; }Parent p = new Child();
System.out.println(p.value); // 输出10

多态的好处

  • 代码扩展性:新增子类无需修改原有代码(符合开闭原则)。
  • 降低耦合度:调用方法依赖父类接口,而非具体子类。
  • 统一化处理对象:通过父类引用统一管理多种子类对象(如集合遍历)。
  • 支持设计模式:如工厂模式、策略模式、模板方法模式等均依赖多态实现。

多态访问规则总结

口诀

“成员变量,静态方法看左边;非静态方法:编译看左边,运行看右边。”

原理:成员变量和静态方法无多态性非静态方法编译阶段检查父类是否有该方法(确保语法正确),运行阶段根据对象实际类型(子类)调用方法(动态绑定)。

相关文章:

Java多态详解

Java多态详解 什么是多态&#xff1f; 比如我们说&#xff1a;“驾驶一辆车”&#xff0c;有人开的是自行车&#xff0c;有人开的是摩托车&#xff0c;有人开的是汽车。虽然我们都说“开车”&#xff0c;但“怎么开”是由具体的车类型决定的&#xff1a;“开”是统一的动作&a…...

go程序编译成动态库,使用c进行调用

以下是使用 Go 语言打包成 .so 库并使用 C 语言调用的完整步骤&#xff1a; 1. Go 语言打包成 .so 库 &#xff08;1&#xff09;编写 Go 代码 创建一个 Go 文件&#xff08;如 calculator.go&#xff09;&#xff0c;并定义需要导出的函数。导出的函数名必须以大写字母开头…...

iVX:图形化编程与组件化的强强联合

在数字化浪潮中&#xff0c;软件开发范式正经历着从文本到图形的革命性转变。iVX 作为国产可视化编程领域的领军者&#xff0c;以 “图形化逻辑 组件化架构” 的双重创新&#xff0c;重新定义了软件开发的效率边界。其技术突破不仅体现在开发方式的革新&#xff0c;更通过一系…...

华为配置篇-RSTP/MSTP实验

MSTP 一、简介二、常用命令总结三、实验 一、简介 RSTP&#xff08;快速生成树协议&#xff09;​ RSTP&#xff08;Rapid Spanning Tree Protocol&#xff09;是 STP 的改进版本&#xff0c;基于 ​​IEEE 802.1w 标准​​&#xff0c;核心目标是解决传统 STP 收敛速度慢的问…...

端口号被占用怎么解决

windows环境下端口号被占用怎么解决 win r 快捷键打开cmd输入netstat -ano|findstr 端口号 通过这个命令找到pidtaskkill /pid pid端口号 /t /f 如下图所示 命令解读 netstat 是一个网络统计工具&#xff0c;它可以显示协议统计信息和当前的TCP/IP网络连接。 -a 参数告诉 nets…...

GO语言-导入自定义包

文章目录 1. 项目目录结构2. 创建自定义包3. 初始化模块4. 导入自定义包5. 相对路径导入 在Go语言中导入自定义包需要遵循一定的目录结构和导入规则。以下是详细指南&#xff08;包含两种方式&#xff09;&#xff1a; 1. 项目目录结构 方法1&#xff1a;适用于Go 1.11 &#…...

ES常识5:主分词器、子字段分词器

文章目录 一、主分词器&#xff1a;最基础的文本处理单元主分词器的作用典型主分词器示例 二、其他类型的分词器&#xff1a;解决主分词器的局限性1. 子字段分词器&#xff08;Multi-fields&#xff09;2. 搜索分词器&#xff08;Search Analyzer&#xff09;3. 自定义分词器&a…...

NoSQL数据库技术与应用复习总结【看到最后】

第1章 初识NoSQL 1.1 大数据时代对数据存储的挑战 1.高并发读写需求 2.高效率存储与访问需求 3.高扩展性 1.2 认识NoSQL NoSQL--非关系型、分布式、不提供ACID的数据库设计模式 NoSQL特点 1.易扩展 2.高性能 3.灵活的数据模型 4.高可用 NoSQL拥有一个共同的特点&am…...

单片机-STM32部分:12、I2C

飞书文档https://x509p6c8to.feishu.cn/wiki/MsB7wLebki07eUkAZ1ec12W3nsh 一、简介 IIC协议&#xff0c;又称I2C协议&#xff0c;是由PHILP公司在80年代开发的两线式串行总线&#xff0c;用于连接微控制器及其外围设备&#xff0c;IIC属于半双工同步通信方式。 IIC是一种同步…...

【英语笔记(四)】诠释所有16种英语时态,介绍每种时态下的动词变形!!含有所有时态的的动词变形汇总表格

1 时态的单词构成 1.1 现在 1.1.1 一般现在时态 动词原形动词原形s&#xff08;第三人称单数&#xff09; 1.1.1.1 表达事实 I eat carrots. 我吃胡萝卜&#xff1a;我是吃胡萝卜这种食物的.&#xff08;这个是事实陈述&#xff09; The rabbit eats carrots. 兔子吃胡萝卜…...

【质量管理】什么是过程?

在文章【质量管理】谁是顾客&#xff1f;什么是质量链&#xff1f;-CSDN博客 中我们了解了什么是顾客&#xff0c;顾客不仅仅是企业以外的人&#xff0c;在企业的内部我们也有大大小小的顾客。并且我们了解了什么是质量链&#xff0c;企业内部的各种供给方和客户形成了质量链。…...

效率办公新工具:PDF Reader Pro V5.0功能解析与使用体验

在日常文档处理与数字办公的场景中&#xff0c;PDF 文件依然是主流格式之一。从合同审批、项目文档、财务报表&#xff0c;到技术方案和用户手册&#xff0c;PDF 的编辑、转换、标注、归档需求始终存在。 面对这些需求&#xff0c;越来越多用户希望有一款功能完整、跨平台、智…...

Java对象内存布局和对象头

1、面试题 1&#xff09;说下JUC&#xff0c;AQS的大致流程 CAS自旋锁&#xff0c;是获取不到锁就一直自旋吗&#xff1f; 2&#xff09;CAS和synchronized区别在哪里&#xff0c;为什么CAS好&#xff0c;具体优势在哪里&#xff1f; 3&#xff09;sychro…...

Vue 跨域解决方案及其原理剖析

在现代 Web 开发中&#xff0c;跨域问题是前端开发者经常面临的挑战之一。当使用 Vue.js 构建应用时&#xff0c;跨域请求的处理尤为重要。本文将深入探讨 Vue 解决跨域的多种方法及其背后的原理&#xff0c;帮助开发者更好地理解和应对这一常见问题。 一、跨域问题概述 1. 同…...

TikTok 互动运营干货:AI 助力提升粘性

在 TikTok 运营的众多环节中&#xff0c;与用户的互动是建立紧密联系、提升账号粘性的关键所在。及时且真诚地回复评论和私信&#xff0c;能让用户切实感受到你的关注与尊重&#xff0c;从而极大地增强他们对你的好感与粘性。对于用户提出的问题&#xff0c;要以耐心、专业的态…...

Kids A-Z安卓版:儿童英语启蒙的优质选择

Kids A-Z安卓版 是一款由北美知名分级读物厂商 Learning A-Z 官方推出的英语分级学习应用&#xff0c;也被称为 Raz-Kids app。它专为 K-5 年级的学生设计&#xff0c;提供丰富的英语学习资源和互动学习体验&#xff0c;帮助孩子们在轻松愉快的环境中提升英语能力。通过动画、互…...

接口继承与扩展的使用技巧

在 TypeScript 中&#xff0c;接口继承和扩展是非常强大且灵活的功能&#xff0c;可以帮助我们更高效地管理类型和提高代码的可重用性。接口继承使得一个接口可以从另一个接口继承属性和方法&#xff0c;而接口扩展允许我们通过组合多个接口来构建更复杂的结构。这些特性使得 T…...

【React】Craco 简介

Craco 简介 Craco (Create React App Configuration Override) 是一个用于自定义 Create React App (CRA) 配置的工具&#xff0c;无需 eject&#xff08;弹出&#xff09;项目。 为什么需要 Craco Create React App 虽然提供了零配置的 React 开发体验&#xff0c;但其配置…...

HTML5中的Microdata与历史记录管理详解

Microdata 简介 Microdata 是 HTML5 引入的一种标记方式&#xff0c;用于在网页中嵌入机器可读的语义信息。通过使用 Microdata&#xff0c;开发者可以在 HTML 元素中添加特定的属性&#xff0c;以便搜索引擎和其他工具更好地理解网页内容。 Microdata 的核心属性包括 itemsc…...

UNet网络 图像分割模型学习

UNet 由Ronneberger等人于2015年提出&#xff0c;专门针对医学图像分割任务&#xff0c;解决了早期卷积网络在小样本数据下的效率问题和细节丢失难题。 一 核心创新 1.1对称编码器-解码器结构 实现上下文信息与高分辨率细节的双向融合 如图所示&#xff1a;编码器进行了4步&…...

Babel 深度解析:现代 JavaScript 开发的桥梁

1. 什么是 Babel&#xff1f; Babel 是一个 JavaScript 编译器&#xff08;又称转译器&#xff09;&#xff0c;核心使命是解决 JavaScript 的环境兼容性问题。它允许开发者使用最新的语言特性&#xff08;如 ES6、JSX、TypeScript&#xff09;&#xff0c;同时将代码转换为旧…...

MyBatis源码解读2(2.1、核心对象)

二、MyBatis的核心对象 2.1、核心对象 2.1、MappedStatement MyBatis其实是对JDBC的进一步封装&#xff0c;我们都知道JDBC有几个重要的对象&#xff1a; StatementPrepared StatementCallable StatementResultSet Statement、Prepared Statement、Callable Statement分别…...

03.three官方示例+编辑器+AI快速学习webgl_animation_multiple

本实例主要讲解内容 这个示例展示了Three.js中骨骼动画的高级应用技巧&#xff0c;重点演示了如何使用SkeletonUtils.clone()方法复制模型&#xff0c;并展示了两种不同的骨骼动画管理方式&#xff1a; 独立骨骼模式&#xff1a;每个模型拥有独立的骨骼结构&#xff0c;可播放…...

无锁秒杀系统设计:基于Java的高效实现

引言 在电商促销活动中&#xff0c;秒杀场景是非常常见的。为了确保高并发下的数据一致性、性能以及用户体验&#xff0c;本文将介绍几种不依赖 Redis 实现的无锁秒杀方案&#xff0c;并提供简化后的 Java 代码示例和架构图。 一、基于数据库乐观锁机制 ✅ 实现思路&#xf…...

MyBatis快速入门——实操

默认&#xff1a;电脑搭建好了Maven环境 本次入门实验使用的idea版本&#xff1a;ideaU2022.1 目录 一&#xff1a;前期准备工作 1. 创建一个springboot工程 2. Maven环境配置 3. 在mysql数据库中创建一个user表 4. 编写实体类User 二&#xff1a; 引入MyBatis的相关依赖…...

假如你的项目是springboot+vue怎么解决跨域问题

1. 前端代理&#xff08;开发环境推荐&#xff09; 适用场景&#xff1a;Vue 开发环境调试时&#xff0c;避免直接请求后端接口的跨域问题。 实现步骤&#xff1a; 在 Vue 项目的 vue.config.js 中配置代理&#xff1a; module.exports {devServer: {proxy: {/api: { // 代理…...

OpenResty反向代理

通过在 OpenResty 的配置文件中定义不同的 location 块&#xff0c;将匹配特定 URL 路径的请求转发到不同的后端 FastAPI 应用&#xff08;即使它们运行在不同的端口或甚至是不同的服务器/容器上&#xff09;。 核心思路&#xff1a; 多个 FastAPI 应用实例&#xff1a; 你的每…...

《Effective Python》第1章 Pythonic 思维详解——深入理解 Python 条件表达式(Conditional Expressions)

《Effective Python》第1章 Pythonic 思维详解——深入理解 Python 条件表达式&#xff08;Conditional Expressions&#xff09; 在 Python 中&#xff0c;条件表达式&#xff08;conditional expressions&#xff09;提供了一种简洁的方式来在一行中实现 if/else 的逻辑。它…...

【Typenum】 3 类型位运算(bit.rs)

一、源码 代码定义了一个类型级别的位&#xff08;bit&#xff09;系统&#xff0c;主要用于编译时的类型运算。 //! 类型级比特位实现 //! //! 这些是基础的比特位类型&#xff0c;作为本库中其他数值类型的构建基础 //! //! 已实现的**类型运算符**&#xff1a; //! //! - …...

python:trimesh 用于 STL 文件解析和 3D 操作

python&#xff1a;trimesh 是一个用于处理三维模型的库&#xff0c;支持多种格式的导入导出&#xff0c;比如STL、OBJ等&#xff0c;还包含网格操作、几何计算等功能。 Python Trimesh 库使用指南 安装依赖库 pip install trimesh Downloading trimesh-4.6.8-py3-none-any.w…...

stm32week15

stm32学习 十一.中断 2.NVIC Nested vectored interrupt controller&#xff0c;嵌套向量中断控制器&#xff0c;属于内核(M3/4/7) 中断向量表&#xff1a;定义一块固定的内存&#xff0c;以4字节对齐&#xff0c;存放各个中断服务函数程序的首地址&#xff0c;中断向量表定…...

数据库分库分表实战指南:从原理到落地

1. 为什么要分库分表&#xff1f; 1.1 单库瓶颈表现 存储瓶颈&#xff1a;单表数据超过5000万行&#xff0c;查询性能急剧下降性能瓶颈&#xff1a;单库QPS超过5000后响应延迟显著增加可用性风险&#xff1a;单点故障导致全系统不可用 1.2 突破性优势 --------------------…...

雷达工程师面试题目

雷达工程师面试题目 一、基础知识类 简述雷达的工作原理 请从电磁波的发射、传播、反射以及回波接收处理等环节,详细阐述雷达如何实现对目标的探测、定位与跟踪。 常见雷达体制及其特点 列举至少三种常见的雷达体制(如脉冲雷达、连续波雷达、相控阵雷达等),并分别说明…...

JVM-类加载子系统

最近在学习JVM&#xff0c;分模块整理一下JVM的笔记 目录 类加载子系统 一、加载 二、链接 1.验证 2.准备 3.解析 三、初始化 类加载子系统 类加载子系统负责将字节码文件加载到虚拟机中&#xff0c;我们正常编写完一个Java类并在前端编译器编译后会生成一个对应的字节码…...

从0开始学习大模型--Day06--大模型的相关网络架构

云服务器 在平时&#xff0c;我们总能听到诸如用服务器跑数据、模型&#xff0c;或者是搭建服务器之类的话&#xff0c;实际上&#xff0c;它相当于一台算力、内存、运行内存等各个方面都很强大的电脑&#xff0c;只需要我们用自己的电脑通过互联网链接他就能使用它&#xff0…...

控制LED灯设备

本章分别使用C库和系统调用的文件操作方式控制开发板的LED灯&#xff0c;展示如何在应用层通过系统提供的设备文件控制相关硬件。 本章的示例代码目录为&#xff1a;base_code/linux_app/led/sys_class_leds。 9.1. LED子系统 在Linux系统中&#xff0c;绝大多数硬件设备都有…...

Three.js + React 实战系列 - 联系方式提交表单区域 Contact 组件✨(表单绑定 + 表单验证)

对个人主页设计和实现感兴趣的朋友可以订阅我的专栏哦&#xff01;&#xff01;谢谢大家&#xff01;&#xff01;&#xff01; 在现代网页中&#xff0c;一个精致的 Contact 区域不仅仅是表单的堆砌&#xff0c;更是用户与我们建立联系的第一印象。 在本节课中&#xff0c;我…...

Python-MCPAgent开发-DeepSeek版本

Python-MCPAgent开发-DeepSeek版本 尝试Windows使用Python完成【McpServer】【McpAgent】开发&#xff0c;当前使用OpenAI-Agents框架进行开发 1-核心知识点 先完成【LLM】配置再完成【McpServer】开发再完成【Agent】开发完成【LLM】【McpServer】【Agent】请求互通 2-思路整…...

Linux:43线程封装与互斥lesson31

mmap文件映射视屏&#xff1a;待看... 目录 线程栈 代码证明&#xff1a;一个线程的数据&#xff0c;其他线程也可以访问 线程封装 简单封装,2.thread Thread.hpp Main.cc Makefile 结果&#xff1a; ​编辑 问题1&#xff1a; 问题2&#xff1a; lamba表达式 模版封…...

stm32测频率占空比最好的方案

频率检测, 方案方法很多种, 其中最快最节省资源的方法. 分享给大家. 其它的方案都试过, 问题多多. 适合单片机在工业应用中, 1MHZ以下的频率检测. 1MHZ估计也行. 但是偏差估计是变大了. 我试过很多种方案, 可以看我前面的文章. 最后发现目前这种方案最为优秀. 主要特点为不占用…...

Redis--常见数据类型List列表

目录 一、概念 二、命令 2.1 LPUSH 2.2 LPUSHX 2.3 RPUSH 2.4 RPUSHX 2.5 LRANGE 2.6 LPOP 2.7 RPOP 2.8 LINDEX 2.9 LINSERT 2.10 LLEN 2.11 阻塞版本命令 三、内部编码 一、概念 列表类型是用来存储多个有序的字符串&#xff0c;列表中的每个字符串称为元素&…...

Linux : 多线程【线程概念】

Linux &#xff1a; 多线程【线程概念】 &#xff08;一&#xff09;线程概念线程是什么用户层的线程linux中PID与LWP的关系 (二) 进程地址空间页表(三) 线程总结线程的优点线程的缺点线程异常线程用途 &#xff08;一&#xff09;线程概念 线程是什么 在一个程序里的一个执行…...

React+Springboot项目部署ESC服务器

记录一下我个人部署Linux服务器的心得 环境介绍 ESC服务器创建时默认安装LNMP&#xff0c;即Linux&#xff0c;Nginx&#xff0c;Mysql&#xff0c;Php 所以这里不讲怎么安装Nignx和Mysql 笔者使用的Linux版本为22.0.4LTS版 前端打包 运行React打包命令进行前端项目的打包…...

python-Pandas库详细教程

python-Pandas库详细教程1 定义使用方法&#xff1a; 一、导入Pandas库代码 二、DataFrame用法Pandas索引 groupby()数值计算 定义 python中特定用于数据分析、处理的模板库。 优点&#xff1a; 处理数据便捷、简单。 使用方法&#xff1a; 处理“.csv”数据&#xff1a;rea…...

力扣刷题Day 46:搜索二维矩阵 II(240)

1.题目描述 2.思路 方法1&#xff1a;分别找到搜索矩阵的右、下边界&#xff0c;然后从[0][0]位置开始遍历这部分矩阵搜索目标值。 方法2&#xff1a;学习Krahets佬的思路&#xff0c;从搜索矩阵的左下角开始遍历&#xff0c;matrix[i][j] > target时消去第i行&#xff0c…...

C++:类和对象4

一&#xff0c;日期类实现 学习建议&#xff1a; 对于计算机学习来说&#xff0c;调试十分重要&#xff0c;所以在日常学习中一定要加大代码练习&#xff0c;刷代码题和课后自己敲出课上代码例题&#xff0c;注意不要去对比正确代码或者网上找正确代码直接使用&#xff0c;一…...

【软件工程】基于机器学习的多缺陷定位

基于机器学习的多缺陷定位&#xff08;Multi-Dault Localization, MDL&#xff09;是软件工程和自动化测试领域的重要研究方向&#xff0c;旨在通过机器学习技术高效识别代码中多个潜在缺陷的位置。以下从方法、挑战、应用场景及未来方向展开分析&#xff1a; 一、核心方法 监督…...

互联网大厂Java求职面试实战:Spring Boot到微服务的技术问答解析

&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通 &#x1f601; 2. 毕业设计专栏&#xff0c;毕业季咱们不慌忙&#xff0c;几百款毕业设计等你选。 ❤️ 3. Python爬虫专栏…...

LLMs之MCP:2025年5月2日,Anthropic 宣布 Claude 重大更新:集成功能上线,研究能力大幅提升

LLMs之MCP&#xff1a;2025年5月2日&#xff0c;Anthropic 宣布 Claude 重大更新&#xff1a;集成功能上线&#xff0c;研究能力大幅提升 导读&#xff1a;2025年5月2日&#xff0c;Anthropic 宣布 Claude 推出 Integrations 集成功能和增强型高级研究功能。Integrations 基于 …...

飞蛾扑火算法matlab实现

注意&#xff1a;此代码实现的是求目标函数最大值&#xff0c;求最小值可将适应度函数乘以-1&#xff08;框架代码已实现&#xff09;。 注意&#xff1a;此代码实现的是求目标函数最大值&#xff0c;求最小值可将适应度函数乘以-1&#xff08;框架代码已实现&#xff09;。 注…...