深入剖析Java框架源码的设计之重载与重写、构造方法的区别详解

【Java基础篇】重载与重写、构造方法的区别详解 提到重载与重写,大家最熟悉的地方莫过于自己封装一个枚举类或者框架中的底层实现类吧?我们经常用着底层的框架技术,但是底层的原理可能不太明白。下面我就来通过Java类的三大特性——封装、继承、多态的具体实现:重载与重写来深入剖析Java的设计原理,让大家可以简简单单写底层源码!... 阅读详情

前言

提到重载与重写,大家最熟悉的地方莫过于自己封装一个枚举类或者框架中的底层实现类吧?我们经常用着底层的框架技术,但是底层的原理可能不太明白。下面我就来通过Java类的三大特性——封装、继承、多态的具体实现:重载与重写来深入剖析Java的设计原理,让大家可以简简单单写底层源码!

根本区别

根本区别: 重载是一个父类方法多个不用的子类功能,重写是一个父类方法多个相同的子类功能.
相当于重载是在创造方法,重写是给子类使用方法!
构造函数是为了在类加载时初始化多个变量的值,也可以在new对象时初始化值!

详细对比

1、使用static修饰的方法只能执行一次,不能再次被实例化; 2、构造函数是一种特殊的方法,方法名与类名相同,构造函数是重载的一种实现,构造函数不能被重写(因为构造函数是一个无自己方法的类型-采用this全局引用符引用的本类中的参数、无自己的返回值-返回值是本类参数的、类名与参数名相同,这三点也就导致构造函数不满足重写的条件——必须修改父类的参数的值,没有返回值就无法修改值,因此子类无法继承父类的方法——总之重载的方法无法被重写,因此已经回不到父类的默认方法了——再底层一点就是:重载是创建一个新的同名方法来扩容原方法参数与功能,从本质上调用的是一个新方法;而重写是在原方法的基础上改变参数的值来实现原功能,从本质上还是调用的原方法) 3、重载与重写是指对方法操作,方法名都相同,参数的值都可以不同; 4、重载是改造原方法的功能(一个类中,参数类型、个数、顺序不相同),重写是重现原方法的功能(子类中,参数类型、个数都相同,但参数的值必须不同) 5、重载用于构造函数,同一个方法名对不同参数的功能实现(即实现一个方法多个功能),重写用于继承父类并再度封装父类的方法
6、在一个类中,可以有多个构造方法(方法参数不同) ,即默认重载方法,来实现对象属性不同的初始化;
7、但是子类中不能定义一个方法无void无返回值的方法,编译错误,即子类无法继承构造方法,但是子类的构造器中可以调用(实例化)父类的构造方法(默认自动调用无参构造);然后,一个父类方法被重载为了构造函数,然后再重写为子类方法,那么构造函数该岂不是指向两个相同的地址?根据JVM的分区,用户方法与对象(非JDK对象)都会放入堆,而堆中的指针是唯一的——相当于内存区的计数器。所以是不能在(重载过的)构造方法上重写的!
8、this是用于指向的当前类(对象)的指针,可以通过this.变量名在构造函数中调用变量的值
9、this() 不能使用在普通方法中,只能写在构造方法(类名与方法名相同,无返回值)中:

public class Student { //定义一个类,类的名字为student。 
 public Student() { //定义一个方法,名字与类相同故为构造方法
  this(“Hello!”);
 }
 public Student(String name) { //定义一个带形式参数的构造方法
 }
}

10、一个实体类再创建后会自动生成一个默认构造函数,是无返回参数的,只有指向实体类的变量指针(this);同时,构造函数可以自定义(即初始化时加入一些不同的元素)
11、Java核心是对象(万物即可对象,对象即类),而类(对象)的核心就是封装、继承、多态,具体体现是重载、重写与构造函数。
12、this关键字只能访问本类中的成员变量,同时:

this调用本类中的属性,也就是类中的成员变量;
this调用本类中的其他方法;
this调用本类中的其他构造方法,调用时要放在构造方法的首行。

拓展

既然我们已经深入了重载与重写的区别、构造方法的底层,那么,我们就可以去利用这三样东西去创建属于自己的框架源码了。首先,可以重载大量的方法形成不同功能的同名方法(也就是构造方法),然后根据方法体的参数的不同就可以调用不同的功能(参数的值可以自己设置),这就实现了一个方法的多个功能的封装(根据参数不同来选择)。比如:使用Jedis调用方法:
源码:

public class Jedis extends BinaryJedis implements JedisCommands, MultiKeyCommands, AdvancedJedisCommands, ScriptingCommands, BasicCommands, ClusterCommands, SentinelCommands, ModuleCommands {
    protected JedisPoolAbstract dataSource = null;
​
    public Jedis() {
    }
​
    public Jedis(String host) {
        super(host);
    }
​
    public Jedis(HostAndPort hp) {
        super(hp);
    }
​
    public Jedis(String host, int port) {
        super(host, port);
    }
​
    public Jedis(String host, int port, boolean ssl) {
        super(host, port, ssl);
    }

上面是Jedis使用构造函数封装方法的源码,我们可以借鉴上面的源码自己封装底层API(可以是对其他数据库的操作)或者自己封装属于自己功能的方法;当封装的方法足以完成一个完整的操作的时候,我们就可以将其打成Jar包发布到Maven Center,从而形成一个框架。Jar包多了,这时候可以下载OpenJDK的某一个版本,然后将自己的Jar整合到JDK中;这样,就开发出来了属于自己定制功能的JDK版本。npm同理~

Java重写与重载本质区别:编译期静态解析 vs 运行时动态分派 重写(Overriding)和重载(Overloading)是Java面向对象多态性的两大基石,但二者作用阶段、实现机制与技术价值截然不同。重载是编译期行为,由javac基于实参类型完成静态方法解析,生成独立字节码签名;重写则是运行时机制,依赖JVM虚方法表(vtable)实现动态绑定,支撑真正的多态分派。其技术价值在于:重载提升API易用性与类型安全,重写保障继承体系的可扩展性与开闭原则落地。典型应用场景包括框架回调设计(重写)、工具类方法泛化(重载),以及Spring事件监听、IDEA方法跳转等工程实践 阅读详情

相关推荐

Java面向对象知识点大总结,建议收藏

API规范应用开发人员,SPI服务于框架拓展人员。API更多强调的软件组件之间的规则和接口的约定,用户可以通过继承实现不同的业务逻辑,调用方只需调用即可。SPI则是一种拓展,用户必须通过导入SPI得到内置功能亦或者自行实现。更多关于SPI的讲解可以参考笔者这篇文章:序列化是Java内置的一种将对象进行持久化的技术手段,即将对象按照规定规范转成字节数组保存到物理文件中,需要时将字节数组通过反序列化还原成对象。反序列化时JVM不仅会比对类路径和功能代码是否一致,还会比对判断类型是否一致,只有字节流中的。

禅与计算机程序设计的艺术 1324

Java知识点(九):方法的重写、重写和重载的区别、package、import、public、private、protected、默认访问控制符、static、final

包括方法的重写(Override)、重写和重载的区别、访问控制(package、import、public、private、protected、默认访问控制符、访问控制修饰符对比)、静态变量、静态方法、静态块、成员变量和静态变量的区别、修饰成员变量、修饰方法、修饰类。

qq_45138120的博客 4668

java重写源码方法-malabar-mode:用于Java和其他基于JVM的语言的EMCSJVM集成

java修改源码方法 马拉巴模式 EMACS 与 JVM 的集成。 马拉巴尔正在转向 JDEE 截至 2016 年 10 月 21 日,马拉巴尔模式正在与 . 将不再在 malabar 上做任何工作,所有有用的功能已经或将被转移到 JDEE。 我建议使用 JDEE 而不是 malabar(我有)。 如果 JDEE 中缺少 malabar 功能,请在标题中使用“from malabar”创建问题,指定缺少的功能。 我会将这个项目留作参考,但没有任何问题正在处理,也不会进行更新。 我的努力将用于改进 JDEE。 概括 malabar-mode 是一个 monir-mode 与 Maven 挂钩,可以轻松地动态编译文件并执行 Maven 构建命令。 注意:java/groovy 代码已移至 这是基于已合并回主分支的分支。 马拉巴模式的开发已经重新开始。 这是为了使其保持最新状态并以适度的速度发展。 您可能想跳到 . 马拉巴模式提供什么 由于 malabar-mode 可以在 java-mode 和 groovy-mode 中使用,我们可以免费获得一些东西: 语法高亮 移动命令( CMf/-b

方法的重载和重写分别有什么特点呢?

方法的重写和重载的特点

weixin_52496592的博客 676

重写测试框架

迁移测试框架。 自动地。 这是什么? 该项目实现了一个,该执行常见的Java测试迁移任务,例如从JUnit 4迁移到JUnit 5。

Java重载和重写的区别--源码实例

// 对overload测试的文件:OverloadTest.java public class OverloadTest { // 下面几个方法用来验证可以通过定义不同的参数类型和参数的数目进行方法重载。 public void fun(){ System.out.println("method fun in OverloadTest, no parameter"); } public void fun(float f) { System.out.println("method fun in OverloadTest, parameter type: float"); } public void fun(int i){ System.out.println("method fun in OverloadTest, parameter type: int"); } public void fun(int i1, int i2) { System.out.println("method fun in OverloadTest, parameter type: int, int"); } // 下面的两个方法用来验证可以通过定义不同的参数顺序进行方法重载。 // 需要注意:这里的参数肯定不是相同的类型,否则的顺序的先后就毫无意义。 public void fun1(int i, float f) { System.out.println("method fun1 in OverloadTest, sequence of parameters is: int, float"); } public void fun1(float f, int i) { System.out.println("method fun1 in OverloadTest, sequence of parameters is: float, int"); } // 下面的两个方法用来验证方法抛出的异常对于重载的影响. // 无论是异常的类型还是异常的个数都不会对重载造成任何的影响。 public void fun2() throws TestException { System.out.println("fun2 in OverloadTest, exception: TestException"); } public void fun2(int i) throws TestException, TestException1 { System.out.println("fun2 in OverloadTest, exception: TestException, TestException1"); } public void fun2(float f) throws Exception { System.out.println("fun2 in OverloadTest, exception: Exception"); } // 不能通过抛出的异常类型来重载fun方法。 //public void fun(int i) throws Exception { // System.out.println("method fun in OverloadTest, parameter type: int, exception: Exception"); //} // ? 不能通过返回值重载fun方法。 //public boolean fun(int i) throws Exception { // System.out.println("method fun in OverloadTest, parameter type: int, exception: Exception, return: boolean"); // return true; //} private void fun3() { } // 不能通过不同的访问权限进行重载 public void fun3() { } public static void main(String[] args) { // 这里只是定义了OverloadTest的实例,所以test不会调用 // OverloadTest1中的方法。 OverloadTest test = new OverloadTest1(); // 这里定义了OverloadTest1的实例,因为OverloadTest1是OverloadTest // 的子类,所以test1会调用OverloadTest中的方法。 OverloadTest1 test1 = new OverloadTest1(); try { int i = 1, j = 2, m = 3; // 这里不会调用OverloadTest1的fun方法 // test.fun(i, m, j); test1.fun(i, j, m); test1.fun(); // 这个调用不会执行,因为fun3()在OverloadTest中访问权限是priavte //test1.fun3(); test1.fun3(i); } catch(Exception e) { } } } class OverloadTest1 extends OverloadTest{ // 在子类中重载fun public void fun(int i, int m, int n) { System.out.println("Overload fun1 in OverloadTest1, parameter type: int, int, int"); } // 这个不是对父类中方法的重载,只是一个新的方法。 public void fun3(int i) { System.out.println("fun2 in OverloadTest1"); } } // 对override测试的文件:OverrideTest.java public class OverrideTest { public void fun() throws TestException { System.out.println("method fun in OverrideTest"); } private void fun1() { System.out.println("method fun1 in OverrideTest"); } public static void main(String[] args) { OverrideTest test = new OverrideTest1(); try { test.fun(); test.fun1(); } catch(Exception e) { } } } class OverrideTest1 extends OverrideTest{ // 以下正常Override public void fun() throws TestException2 { System.out.println("fun in OverrideTest1"); } // 不能Override父类中的方法,因为它定义了不同的异常类型和 // 返回值。 //public int fun() throws TestException1 { // System.out.println("method fun in Test"); // return 1; //} // 不能Override父类中的方法,因为它抛出了比父类中非法范围 // 更大的异常。 //public void fun() throws Exception { // System.out.println("fun in OverrideTest1"); //} // 这个方法并没有Override父类中的fun1方法,因为这个方法在 // 父类是private类型,所以这里只是相当于定义了一个新方法。 public void fun1() { System.out.println("method fun1 in Test"); } } class TestException extends Exception{ public TestException(String msg) { super(msg); } } class TestException1 extends TestException { public TestException1(String msg) { super(msg); } } class TestException2 extends TestException { public TestException2(String msg) { super(msg); } }

java重写源码类不生效(自己重写的类没有被jvm加载)

java重写源码类不生效(自己重写的类没有被jvm加载)

lu993356091的博客 2842

java重写源码方法-java-simple-serial-connector:官方jSSC(Java简单串行连接器)存储库

java重写源码方法

JAVA-如何修改源码(重写JAR包里的类)

同名类的加载顺序及原理

qq_37191371的博客 7997

JavaSE-注解与反射(框架底层实现机制)

注解(Annotation)JDK5.0引入 内置注解: @Override:重写方法 @Deprecated:废弃 @SuppressWarnings:镇压警告 元注解(meta-annotation): 可自定义注解 @Target:描述注解的使用范围,传入value参数指定 @Retention:描述注解的生命周期,传入value参数指定 (runtime>class>sources) @Documented:是否生成注解在Javadoc种 @Inherited:子类可以继承父类的注解 自定义注解 @interface 注解名{} 属性为注解的参数:可以使用默认值 反射(框架设计的

卡尔曼滤波、互补滤波与Tsinghua滤波:平衡车姿态感知的三大算法对比

本文对比了平衡车姿态感知中的卡尔曼滤波、互补滤波与Tsinghua滤波三大核心算法。互补滤波计算简单,适合入门;卡尔曼滤波理论最优但实现复杂;Tsinghua滤波则是一种面向嵌入式优化的轻量级方案,通过动态权重调整和零偏估计,在资源受限的MCU上实现了性能与效率的平衡,是智能车竞赛等场景的实用选择。

weixin_29232121的博客 349

重写jar包中的方法

重写步骤: 1.找到你所要重写的方法的所在类,查看其中的路径; 2.在我们的src目录下新建一个同包名同类名的类; 3.将jar包中的重写方法所在类的所有代码复制到我们新建的同包名同类名的类中; 4.在我们新建的同包名同类名的类中修改对应的方法中的代码,注意要保持方法中的参数不要发生改变,也不要删除原类中已有的方法,但是可以新增一些方法。 原理: 编译输出的时候会优先使用我们src下面的JSON类,而不是优先使用Jar包里面的JSON类,这样就达到了覆盖jar包方法的目的。 注-如果遇到重写后方法

PPX、小布的博客 2287

DSP28335做FFT傅里叶变换

1. 看了一下例程,居然没有FFT的例程,难道这个DSP28335不能做FFT吗?对了C2000系列是有C2000 ware这个库的。方便很多,不过目前不确定在C5000上运行的FFT能直接迁移到DSP28335上行不?测试了一下,是可以的,因为都是用的math.h,下面的一些正弦函数基本一样的 2. 硬件简介,其中DSP28335和TLV320AIC23B之间使用I2C接口进行寄存器配置,...

weixin_30390075的博客 3331

深入解析 Java 重载与重写:从语法到多态的全面剖析

彻底讲透 Java 中重载与重写的区别。

一起探索IT的世界 763

Silvaco TCAD仿真4——DeckBuild实战:从示例库到自定义设计

本文详细介绍了Silvaco TCAD仿真工具DeckBuild的实战应用,从示例库的使用到自定义设计的全过程。通过具体案例和参数修改技巧,帮助用户快速掌握TCAD仿真技术,提升半导体器件设计的效率和精度。特别适合需要从基础入门到进阶操作的工程师和研究人员。

weixin_29284657的博客 435

Jetson-nano 编译实时内核并烧录

前言 之前一篇文章介绍了正常的烧录过程,使用的是默认内核,实际工作中需要对内核打补丁升级为实时内核,并对其重编译。 一、准备内容 官网大法好 官方内核下载链接 官方交叉编译器下载链接 官方文档 ubuntu主机一台 根据官网选择下载对应的文件, 1、L4TDriver Package (BSP) source jetson内核文件。 2、官方交叉编译器 因为我们不是在jetson上直接编译,而jetson是arm平台,所以要进行交叉编译。 二、使用步骤 1.解压 内核 tar -xjf public_s

ldl371122的博客 3288

java概念中的一些区别

1,面向对象和面向过程的区别 面向过程 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix 等一般采用面向过程开发,性能是最重要的因素。 缺点:没有面向对象易维护、易复用、易扩展 面向对象 优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护 缺点:性能比面向过程低 2,JVM、JDK 和 JRE的区别 JVM(java虚拟机) Java ...

hurley11的博客 271

Codex Skill:AI编程助手的专项能力扩展与实战指南

在AI编程助手领域,Skill(技能)是一种标准化的能力扩展机制,它通过封装特定任务所需的指令、资源和脚本,解决AI模型在专项任务上的能力局限。其核心原理是将专业知识和工作流程模块化,让通用AI助手能够像领域专家一样执行复杂任务。从技术价值看,Skill不仅提升了代码生成的准确性,更重要的是实现了业务流程的自动化集成,如代码规范检查、API文档生成等具体场景。这种机制特别适用于需要结合内部工具链和特定业务逻辑的企业环境,能够显著提升开发效率和质量。通过安装PPT生成、SpringBoot项目创建等专项Ski

weixin_33672109的博客 414

Java方法重写(Override)详解:从语法到多态实战

在面向对象编程中,方法重写是实现多态性的核心技术,它允许子类为继承的方法提供特定实现。其原理基于动态绑定机制,在运行时根据对象实际类型决定调用哪个方法,这大大提升了代码的灵活性和可扩展性。在工程实践中,重写广泛应用于框架扩展、接口实现和自定义业务逻辑等场景。正确使用@Override注解能有效避免常见错误,而遵循里氏替换原则则是保证重写行为正确的关键。本文通过Java示例深入解析了重写的语法规则、与重载的核心区别,并提供了完整的图形系统实战案例和最佳实践指南。

weixin_33827731的博客 486

MTK平台 MT6789 烧录 efuse 3.0 Configuration SOP

=====================生成cert1和cert2 key===============================================生成efuse key相关文件===========================================签名DA==========================================================正常编译。=====================Security3.0 的SOP 说明。

a785722173的博客 2332

实现端到端加密的WebRTC视频会议终端

需要注意的是,上述示例代码中没有涉及到具体的加密算法和密钥交换过程,而是通过WebRTC API自动处理了加密和密钥交换的细节。然后,我们通过信令服务器将本地SDP发送给对方,并接收对方的SDP。最后,我们将对方的SDP设置为远程描述,并将最终的连接建立起来。最后,我们将对方的SDP设置为远程描述,并建立最终的连接。在本文中,我们将探讨如何使用WebRTC构建一个加密的视频会议终端,并提供相应的源代码。在本文中,我们将探讨如何使用WebRTC构建一个加密的视频会议终端,并提供相应的源代码。

WaJulia的博客 434

C++继承与多态万字精讲:继承权限、菱形继承痛点、虚函数底层、重写重载区别、抽象类、面试绝杀

我们吃透了C++语法、内存模型、深浅拷贝、类四大默认函数、STL全套,已经掌握了单一类的开发能力。但真正的工程开发、框架设计、大型项目架构,绝对不会只写独立类,而是依靠继承 + 多态实现代码复用、层级管理、接口统一、动态扩展。封装、继承、多态是面向对象三大核心特性:封装:权限控制、数据隐藏、安全隔离(前面已学完)继承:代码复用、层级派生、纵向扩展多态:接口统一、动态绑定、灵活扩展不懂继承多态,就完全不懂面向对象,看不懂源码、写不了框架、过不了面试。一次性彻底打通继承与多态全部重难点,覆盖。

2401_86195313的博客 161

高级电机控制场景实例:基于Simulink的永磁同步电机基于Luenberger观测器的弱磁控制仿真

本文基于Simulink实现表贴式永磁同步电机(SPMSM)的Luenberger观测器弱磁控制仿真,通过构建“观测-弱磁-控制”协同逻辑,突破传统矢量控制的基速限制。利用线性化模型设计观测器实时估计电流与磁链,结合电压极限约束动态注入负d轴电流,实现转速扩展至12000rpm(4倍基速),弱磁区电流THD低于3%,动态响应时间小于5ms,验证了高速运行下系统稳定性与鲁棒性。附完整建模步骤、MATLAB函数代码及性能分析,适用于电动汽车、机床等高速驱动场景,为高级电机控制提供可复现的技术范式。

amy_mhd的博客 32

Java十万字笔记(带索引)

Java类与对象学习学习路线: 1,类和类成员:属性(C++叫成员)、方法(C++叫函数)、构造器(构造方法)(C++叫构造函数);代码块、内部类 2,面向对象三大特征:封装性、继承性、多态性、(抽象性) 封装性:①对外隐藏方法实现细节;隐藏属性,只能通过 类.访问 ②有些属性,行为 只能用,不能改 继承性:父类(超类) —继承—>> 子类(派生类):继承并可以添加自己的新成员 Java目前不支持多...

ZJH 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java入门基础,Java知识点总结合集

其它面试题(springboot、mybatis、并发、java中高级面试总结等)**[外链图片转存中…(img-1GlT60WC-1709271223671)][外链图片转存中…(img-mfUp6s1Q-1709271223671)][外链图片转存中…(img-iaiWnz9O-1709271223672)]本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录。

809

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

对线面试官day4-JAVA基础2,2024京东最新Java面试真题解析

无论是哪家公司,都很重视高并发高可用的技术,重视基础,重视JVM。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。最后我整理了一些面试真题资料,技术知识点剖析教程,还有和广大同仁一起交流学习共同进步,还有一些职业经验的分享。

2401_84447362的博客 909

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

上一篇: 分布式唯一ID方案之雪花算法Snowflake
下一篇: 抽象类和接口概念和区别
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值