通俗易懂的Java方法分派策略

LM Studio Bionic:本地AI智能体从部署到实战完整指南 AI智能体作为能够自主规划、执行多步任务的人工智能系统,其核心原理在于结合大语言模型的推理能力与工具调用机制。通过状态保持和任务分解算法,智能体实现了从单次问答到持续协作的技术跃迁。在工程实践中,这种架构显著降低了复杂任务自动化的门槛,特别适用于数据敏感场景和定制化需求。以Tesla V100等专业硬件为例,本地部署能充分发挥其大显存优势,支持更高精度的模型量化格式。在实际应用层面,智能体可无缝集成到代码审查、文档生成等开发工作流中,而LM Studio Bionic通过统一界面整合了模型服务、任务规划器等 阅读详情

第一时间获取 IT 技术干货!

阅读文本大概需要 4 分钟。

1

基础

我们知道Java有一大特性就是多态。讲到多态不得不想再深层次的研究下多态中的方法分派到底是采用什么样的策略的。

还是举个例子来分析一下:

public class SuperClass {
    public String getName() {
        return "super";
    }
}


public class SubClass extends SuperClass{
    @Override
    public String getName() {
        return "sub";
    }
}


public class MainClass{


    public static void main(String... args) {
        SuperClass superClass = new SubClass();
        test(superClass);
    }
    
    public static void test(SuperClass superClass) {
        System.out.println("a " + superClass.getName());
    }
    
    public static void test(SubClass subClass) {
        System.out.println("b " + subClass.getName());
    }
}

上面的代码中最终输出的应该是多少呢?
别着急,咱们先分析下上面的输出会有什么不同,我们声明的是一个父类对象,但是实例化的时候是以子类来实例化的,所以影响输出结果的第一个问题是:

① getName()方法最后输出的是"super"还是"sub",也就是调用的子类的getName还是父类的getName

第二个问题是:

② test()调用的是第一个以父类为参数的方法还是第二个以子类型为参数的方法

其实对于①问题,稍微有过编程经验的人都清楚,getName肯定是调用的是子类的方法,因为本来就是子类的实例,这也是Java多态的一种体现。

作为一个初级工程师,以上都是应该知道的。

对于第二个问涉及的是Java编译器在将test()编译成字节码的时候,需要知道参数的类型,而参数类型就是你声明变量的类型,也就是说会调用test(SuperClass)方法。所以最后会输出"a sub"。

如果你已经知道这些了,恭喜你中级工程师的水平有了。

稍微总结一下上面的内容,Java的方法分派分为两种:

  1. 静态分派 - 方法重载分派

    1. 编译器就确定

    2. 依据调用者的声明类型和方法的参数类型匹配

  2. 动态分派 - 方法重写分派

    1. 运行时确定

    2. 依据调用者的实际类型分派

2

发散一下

如果你做过Android开发,你一定对Groovy或多或少有一定的了解(我们在写Gradle脚本时就是使用的Groovy语言)。我们也是知道在Groovy中也是可以写Java的代码的,如果将上面的代码放到Groovy中,输出的结果一样吗?

还真不一样,输出的是"b sub",这是Groovy不同之处哈,他在被编译成字节码的时候,test()方法被编译成了CallSite.callStatic方法,而这个方法会在运行时通过反射拿到参数的实际类型,然后决定调用哪个test方法,那实际类型当然是子类了,所以会调用以子类为参数类型的方法了。

到这里,如果你能够触类旁通,不仅仅局限于一种语言,能够多语言横向对比,那么显然你具有了高工的气质了。如果你有兴趣的话,不妨对比下C++、Kotlin、Scala等语言之间有什么区别。

本节内容实际上比较简单直白,但是涉及到的点你平时不一定有认真思考过,只有比较系统的掌握了语言才能对他的编译和运行机制了如指掌。所以只有多思考才能进步。

推荐阅读:

你说你是高工,匿名内部类有我玩得6吗?

你说你是高工,String有多长也不知道?

你说你是高工,char都没搞明白?!

THANDKS

- End -

YOLOv11涨点改进 | 全网创新首发、主干改进篇 | CVPR 2025 | RAVLT主干让 YOLOv11 更加强大!通过增强线性注意力机制,特别在小目标和复杂背景的检测上表现突出 本文提出RAVLT主干网络,通过改进YOLOv11的空间特征建模能力,显著提升小物体和复杂背景检测性能。RAVLT采用秩增强线性注意力(RALA)机制,在保持线性计算复杂度的同时解决传统线性注意力低秩问题。RALA通过增强KV缓冲区和输出特征矩阵的秩,提高特征多样性和建模能力。实验表明,RAVLT在ImageNet-1k上达到84.4% Top-1准确率,仅需2600万参数和4.6GFLOPs,性能优于现有线性注意力模型。文章详细介绍了RAVLT模块结构、实现原理及在YOLOv11中的集成方法,包含四种主干 阅读详情

相关推荐

一文讲清CAN和CANFD的区别

本文将从技术原理、协议特性到应用场景,深度解析两者的核心差异。

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 3204

Java中的并行计算与任务分发策略

Java作为一种广泛应用于企业级应用开发的编程语言,提供了丰富的并行计算支持,包括多线程、并发包和并行流等机制,但同时也带来了并发控制和性能优化等挑战。选择合适的并行计算方式和优化策略,可以有效提升Java应用的性能和响应能力,满足现代应用对高效处理和大规模数据计算的需求。通过Actor模型实现并行计算,将任务抽象为独立的Actor,通过消息传递进行通信和协作,避免了显式的锁和共享状态管理,提高了系统的并发性能和可维护性。使用线程池可以有效地控制资源的分配和任务的执行,避免线程创建和销毁的开销。

微赚淘客开发者博客 619

从2D到3D地图开发:手把手教你用Cesium+Three.js实现卫星轨迹可视化(含代码片段)

本文详细介绍了如何结合Cesium与Three.js实现从2D到3D的卫星轨迹可视化。通过对比传统Web GIS框架的局限,阐述了Cesium处理三维地理与轨道数据、Three.js负责高级图形渲染的分工优势,并提供了从环境搭建、坐标同步到动态粒子效果实现的完整代码实战指南。

nut55的博客 670

java策略模式三种实现方案

java策略模式三种实现方案

qq_39035267的博客 1669

国产系统迁移实战:在银河麒麟V10上搞定Wine32位支持,让老Windows软件跑起来

本文详细介绍了在银河麒麟V10操作系统上构建Wine32位支持的全过程,帮助用户解决Windows应用迁移难题。从系统架构差异分析到Wine环境配置,再到实战应用部署与优化,提供了一套完整的解决方案,确保老Windows软件在国产系统上稳定运行。

weixin_32288959的博客 648

PID控制器(位置式和增量式)

PID控制算法

zhinian_hao的博客 4512

Java静态分派、动态分派、双分派

Java分派机制

Xuni的博客 418

视频理解与处理——OpenClaw视频能力深度解析(2026视频版)

本文介绍了OpenClaw视频理解与处理的核心技术,重点分析了视频预处理流程。通过VideoProcessor类实现视频加载、帧采样、尺寸调整和归一化等基础处理功能,支持本地和在线视频源处理,为后续视频分析任务提供标准化输入。预处理模块采用均匀采样和标准化方法优化视频数据,确保动作识别、场景分析等高级应用的准确性,展现了OpenClaw强大的视频处理能力。

一键难忘的博客 464

Java单分派和双分派以及访问者模式的使用

java静态绑定和动态绑定,单分派和多分派,访问者设计模式

joiwsev的博客 458

YOLOv11-seg 改进系列 | 引入原创 RSCD 重参数共享卷积分割头,增强 Head 表达力并压低计算量

本文提出一种改进的YOLOv11-seg分割头Segment_RSCD,通过重参数共享卷积增强表达能力。该模块在LSCD共享检测头基础上引入DiverseBranchBlock重参数卷积,保留三尺度预测与Proto掩码原型接口不变。相比原始Segment头,Segment_RSCD参数增加4%但计算量降低1.3%,在共享卷积结构中通过多分支补偿表达能力损失,同时利用Scale层保持尺度差异校准。该方法不改动Backbone/Neck结构,仅重构检测/分割头,实现训练期多路径聚合与部署期等效单分支的平衡。

qq_44224801的博客 181

DeepSeek揭秘:构建高效反洗钱智能监控系统的全流程与代码实例

在金融领域,反洗钱(AML)是一项至关重要的任务。随着金融交易的复杂性和规模不断增长,传统的手工监控方法已无法满足现代金融系统的需求。因此,开发一个智能监控系统来自动识别和报告可疑交易变得尤为重要。本文将详细介绍如何使用DeepSeek技术构建一个高效的反洗钱智能监控系统,并提供相关的代码实例。

理论都是虚的,代码才是王道。 883

java使用策略模式(进阶篇)

策略模式,英文全称是 Strategy Design Pattern。在 GoF 的《设计模式》一书中,它是这样定义的:翻译成中文就是:定义一组算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端(这里的客户端代指使用算法的代码)。经上述分析,笔者认为策略模式可以达到这样的效果:假设 A 类调用 B 类,那么可以认为 A 类是 B 类的客户端,当 B 类增加了一些策略时,客户端 A 类不用进行任何的代码改动即可使用新策略。

偶尔写些东西,意思一下我也参与了内卷 1万+

RK3588网卡出现丢包或者带宽不足的问题验证排查

注意除了有最大的TCP数据接收缓冲,还有/proc/sys/net/core/wmem_max — 最大的TCP数据发送缓冲可以调整,这里暂时没用到,针对具体需要可适当调整。比如把ethx接口中断从默认的cpu0迁移到其它cpu,例如将eth0中断234移到cpu7 (10是16进制, cpu0 =3588的cpu有8个核,4个A55(小核)+4个A76(大核),可以找到对应中断 将中断从默认cpu0核切到cpu7。tcp_rmem:单位是字节,接收缓存区大小,缓存从对端接收的数据,后续会被应用程序读取。

Android/Linux驱动开发传帮带学习,让驱动入门门槛更低! 2026

【分派和双分派】

分派是指在运行时或编译时根据对象的类型选择适当的代码块(如方法或函数)执行。分派机制确保程序根据对象的实际类型调用正确的函数,实现多态的动态绑定。分派分为静态分派和动态分派静态分派(Static Dispatch):分派在编译阶段完成。编译器根据方法签名选择调用哪个方法,主要应用在方法重载中。静态分派不依赖对象的运行时类型,而是基于参数的静态类型。动态分派(Dynamic Dispatch):分派在运行时完成。根据对象的实际类型选择调用的具体方法,应用在方法重写中。

严文文 Chris 885

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java:方法的虚分派(virtual dispatch)和方法表(method table)

背景知识: java 字节码基本框架,jvm基本框架 多态的机制。 Virtual Dispatch 首先从字节码中对方法的调用说起。 java的bytecode中对方法的调用实现分为四种情况: 1.invokevirtual 为最常见的情况,包含virtual dispatch机制;  2.invokespecial是作为private和构造

biaobiaoqi的老博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java分派_Java基础之Java分派机制

Java分派机制在Java中,符合“编译时可知,运行时不可变”这个要求的方法主要是静态方法和私有方法。这 两种方法都不能通过继承或别的方法重写,因此它们适合在类加载时进行解析。Java虚拟机中有四种方法调用指令:invokestatic:调用静态方法。invokespecial:调用实例构造器方法,私有方法和super。invokeinterface:调用接口方法。invokevirtual:调用...

weixin_42489917的博客 310

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

JVM - 方法静态分派和动态分派

一、静态分派:指JVM在方法重载时如何找到正确方法的过程 二、重载方法 public class StaticPatch { public void sayHello(Human human) { System.out.println("hello,Human"); } public void sayHello(Man man) { System.out.print...

起名字上头 312

java invokevirtual_【转】Java方法调用的虚分派

本文通过介绍 Java 方法调用的虚分派,来加深对 Java 多态实现的理解。需要预先理解 Java 字节码和 JVM 的基本框架。虚分配(Virtual Dispatch)首先从字节码中对方法的调用说起。Java 的 bytecode 中方法的调用实现分为四种指令:1.invokevirtual 为最常见的情况,包含 virtual dispatch 机制;2.invokespecial 是作为...

weixin_34058060的博客 590

java 有虚表吗_java方法的虚分派和方法表

java:方法的虚分派(virtual dispatch)和方法表(method table)Java方法调用的虚分派虚分配(Virtual Dispatch)首先从字节码中对方法的调用说起。Java的bytecode中方法的调用实现分为四种指令:invokevirtual为最常见的情况,包含virtual dispatch机制;invokerspecial是作为对private和构造方法的调用,...

weixin_35070219的博客 157

虚表java_java方法的虚分派和方法表

java:方法的虚分派(virtual dispatch)和方法表(method table)Java方法调用的虚分派虚分配(Virtual Dispatch)首先从字节码中对方法的调用说起。Java的bytecode中方法的调用实现分为四种指令:invokevirtual为最常见的情况,包含virtual dispatch机制;invokerspecial是作为对private和构造方法的调用,...

weixin_39604045的博客 80

java方法的虚分派和方法表

java:方法的虚分派(virtual dispatch)和方法表(method table) Java方法调用的虚分派 虚分配(Virtual Dispatch) 首先从字节码中对方法的调用说起。Java的bytecode中方法的调用实现分为四种指令: invokevirtual为最常见的情况,包含virtual dispatch机制; invokerspecial是作为对privat...

kexinxin1的博客 1133

java:方法的虚分派(virtual dispatch)和方法表(method table)

http://blog.youkuaiyun.com/biaobiaoqi/article/details/6894869 Java方法调用的虚分派 JUN 2ND, 2013 | COMMENTS 本文通过介绍 Java 方法调用的虚分派,来加深对 Java 多态实现的理解。需要预先理解 Java 字节码和 JVM 的基本框架。 虚分配(Virtual Dispa

tianjinsong的专栏 9566

JAVA虚拟机中的方法分派,内联,与解析

(1) 方法分派:是选择方法: 静态分派 动态分派   (2) 直接引用转为间接引用:是解析方法的符号引用 包括静态解析(类加载时)与动态链接(方法调用) 相应的方法称为非虚方法(包括FINAL方法)与虚方法; 所以两者处于不同层面   (3)方法内联:JIT优化 如果发现是非虚方法,可以直接内联。如果不是则可以采用“基于CHA(类继承关系分析)”的激进优化: 如果查出一个版

Stroller 1182

【转】Java方法调用的虚分派

原文地址:http://biaobiaoqi.me/blog/2013/06/02/virtual-dispatch-and-method-table-in-java/ 本文通过介绍 Java 方法调用的虚分派,来加深对 Java 多态实现的理解。需要预先理解 Java 字节码和 JVM 的基本框架。 虚分配(Virtual Dispatch) 首先从字节码中对方法的调用说起...

weixin_34342578的博客 67

执行引擎子系统、JIT即时编译原理与分派实现

class。

qq_46274595的博客 213

深入理解Java虚拟机——方法调用

前言: 方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程。 Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址(直接引用) 这个特性给Java带来了更强大的动态扩展能力 1.解析 所有方法调用中的目标方法在Class文件里面都是一个常量池中的符号引用,在类加载的解析阶段,会将其中的一部分符号引用转化为直接引用 这种解

Leessang 296
上一篇: 通俗易懂的匿名内部类深度解析
下一篇: 通俗易懂的讲解:Java 泛型优点、原理、限制和实现
IT烂笔头
博客等级 码龄15年 621粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值