`
grzrt
  • 浏览: 192025 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA中的继承分析

    博客分类:
  • JAVA
 
阅读更多

    为什么写这篇博客,之前对继承的理解知识大体理论上,最近有个同事问了个问题,发现对JAVA继承的底层实现相当模糊,结合《深入理解Java虚拟机:JVM高级特性与最佳实践》以及上网查的资料进行了一下深入学习。
   程序:现在又两个父子类如下

 

class Parent{
	public String str = "Parent";
	private int a = 10;
	public int getA() {
		return a;
	}
}

class Chield extends Parent {
	public String str = "Chield";
	private int a = 20;
	public int getA() {
		return a;
	}
}
 

  测试程序1:

public class TestInherit {
	public static void main(String[] args) {
		Parent p1 = new Parent();
		Parent c1 = new Chield();
		TestInherit.sayInherit(p1);
		TestInherit.sayInherit(c1);
		
		Parent p2 = new Parent();
		Chield c2 = new Chield();
		TestInherit.sayInherit(p2);
		TestInherit.sayInherit(c2);
	}
	
	public static void sayInherit(Parent p) {
		System.out.println("Call Parent");
	}
	
	public static void sayInherit(Chield c) {
		System.out.println("Call Chield");
	}
}

 结果是:
Call Parent
Call Parent
Call Parent
Call Chield

首先介绍方法调用的四条字节码指令:
invokevirtual 调用对象的实例方法,根据对象的实际类型进行分配,
invokeinterface 调用由接口实现的方法,在运行时对象中找到相应的实现;
invokespecial 调用需要特殊处理的实例方法,即实例的初始化<init>、private方法或超类的方法;
invokestatic  调用静态方法(static方法)。
其余字节码操作指令不作介绍。

 

代码:
Parent c1 = new Chield();
中Parent 称为静态类型,Chield称为实际类型。
静态绑定:如果是private,static或者final方法或者构造器,那么编译时就可以准备知道应该调用哪个方法,这种调用方式成为静态绑定。对应的字节码指令是:invokespecila,invokestatic(应用:overload,由于发生在编译期所以voreload不是由虚拟机来执行的)
动态绑定:与静态绑定相对,方法调用在运行时才能决定的,就是动态绑定。对应的指令为:invokevirtual(应用:override)
invokevirtual指令的运行时解析过程大致如下:
1)找到操作数栈顶的第一个元素所指向的对象的实际类型,    记作C
2)若果在类型C中找到常量中的描述符和简单名称都相符的方法,则进行访问权限校验,如果通过则返回这个方法的直接引用,查找过程结束,不通过则返回java.lang.IllegalAccessError异常,
3)否则,按照继承关系从下到上依次对C的各个父类进行第2步的搜索和验证,
4)如果始终没找到合适的方法,则抛出java.lang.AbstractMethodError异常。
上边测试程序的子节码如下:

public class com.rt.TestInherit extends java.lang.Object{
public com.rt.TestInherit();
public static void main(java.lang.String[]);
  Code:
   0:   new     #16; //class com/rt/Parent
   3:   dup
   4:   invokespecial   #18; //Method com/rt/Parent."<init>":()V #初始化
   7:   astore_1	#局部变量表 索引为1的位置
   8:   new     #19; //class com/rt/Chield
   11:  dup
   12:  invokespecial   #21; //Method com/rt/Chield."<init>":()V #初始化
   15:  astore_2 #局部变量表 索引为1的位置
   16:  aload_1 #加载局部变量表 索引为1的位置reference类型值到 操作数栈 
   17:  invokestatic    #22; //Method sayInherit:(Lcom/rt/Parent;)V #采用静态绑定
   20:  aload_2 #加载局部变量表 索引为2的位置reference类型值到 操作数栈 
#采用静态绑定
,所以虽然c1变量的实际类型是Chiled,由于采用静态绑定方法参数是静态类型,因此输出“Call Parent”
   21:  invokestatic    #22; //Method sayInherit:(Lcom/rt/Parent;)V 
   24:  new     #16; //class com/rt/Parent
   27:  dup
   28:  invokespecial   #18; //Method com/rt/Parent."<init>":()V
   31:  astore_3
   32:  new     #19; //class com/rt/Chield
   35:  dup
   36:  invokespecial   #21; //Method com/rt/Chield."<init>":()V
   39:  astore  4
   41:  aload_3
   42:  invokestatic    #22; //Method sayInherit:(Lcom/rt/Parent;)V
   45:  aload   4
   47:  invokestatic    #26; //Method sayInherit:(Lcom/rt/Chield;)V
   50:  return

public static void sayInherit(com.rt.Parent);
  Code:
   0:   getstatic       #37; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:   ldc     #43; //String Call Parent
   5:   invokevirtual   #45; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   8:   return

public static void sayInherit(com.rt.Chield);
  Code:
   0:   getstatic       #37; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:   ldc     #52; //String Call Chield
   5:   invokevirtual   #45; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   8:   return
}

 主要疑点在红色标记处。

 

测试程序2:

public class TestInherit {
    public static void main(String[] args) {
        Parent p1 = new Parent();
        Parent c1 = new Chield();

        System.out.println(p1.str);
        System.out.println(c1.str);
       
        System.out.println(p1.getA());
        System.out.println(c1.getA());
    }
}

  输出结果:
Parent
Parent
10
20

 

在Eclipse中,通过Debug查看c1中的属性如下图:

 

可以看出,子类中包含所有父类中的属性,这是由于在加载的时候会先加载父类。

System.out.println(p1.str);
System.out.println(c1.str);
对应字节码如下:

19:  aload_1 #从局部变量表中加载父类到操作数栈
   20:  getfield        #28; //Field com/rt/Parent.str:Ljava/lang/String;
   23:  invokevirtual   #32; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   26:  getstatic       #22; //Field java/lang/System.out:Ljava/io/PrintStream;
   29:  aload_2  #从局部变量表中加载子类类到操作数栈
   30:  getfield        #28; //Field com/rt/Parent.str:Ljava/lang/String;
#调用invokevirtual指令,会采用动态分配,找到实际类型子类对象(new Chield()生成)
#但是由于属性是静态绑定,所以导致输出的父类的属性
#如果调用的是方法,那么就会通过动态类型绑定到子类对象上
   33:  invokevirtual   #32; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   36:  getstatic       #22; //Field java/lang/System.out:Ljava/io/PrintStream;

 原因是:在Java中,属性绑定到类型,方法绑定到对象!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    ### 2025年全球AI Coding市场洞察研究报告

    内容概要:本文《2025年全球AI Coding市场洞察研究报告》由亿欧智库发布,深入分析了AI编程工具的市场现状和发展趋势。报告指出,AI编程工具在2024年进入爆发式增长阶段,成为软件开发领域的重要趋势。AI编程工具不仅简化了代码生成、调试到项目构建等环节,还推动编程方式从人工编码向“人机协同”模式转变。报告详细评估了主流AI编程工具的表现,探讨了其商业模式、市场潜力及未来发展方向。特别提到AI Agent技术的发展,使得AI编程工具从辅助型向自主型跃迁,提升了任务执行的智能化和全面性。报告还分析了AI编程工具在不同行业和用户群体中的应用,强调了其在提高开发效率、减少重复工作和错误修复方面的显著效果。最后,报告预测2025年AI编程工具将在精准化和垂直化上进一步深化,推动软件开发行业进入“人机共融”的新阶段。 适合人群:具备一定编程基础,尤其是对AI编程工具有兴趣的研发人员、企业开发团队及非技术人员。 使用场景及目标:①了解AI编程工具的市场现状和发展趋势;②评估主流AI编程工具的性能和应用场景;③探索AI编程工具在不同行业中的具体应用,如互联网、金融、游戏等;④掌握AI编程工具的商业模式和盈利空间,为企业决策提供参考。 其他说明:报告基于亿欧智库的专业研究和市场调研,提供了详尽的数据支持和前瞻性洞察。报告不仅适用于技术从业者,也适合企业管理者和政策制定者,帮助他们在技术和商业决策中更好地理解AI编程工具的价值和潜力。

    MATLAB环境下基于变分模态分解与Cramer von Mises检验的时间序列信号降噪方法及其应用

    内容概要:本文探讨了一种创新的信号降噪方法,该方法结合了变分模态分解(VMD)和Cramer von Mises检验,在MATLAB R2018a环境中实现了对一维时间序列信号的有效降噪。文中详细介绍了算法的工作流程,从数据准备到最终的降噪处理,包括VMD分解和Cramer von Mises检验的具体步骤。此外,还提供了简化的MATLAB代码示例,帮助读者理解其实现方式。该方法适用于多种类型的信号,如金融时间序列、地震信号、机械振动信号等,展现了广泛的应用潜力。 适合人群:从事信号处理、数据分析的研究人员和技术人员,尤其是那些对MATLAB有一定了解并希望提升信号降噪效果的专业人士。 使用场景及目标:本方法旨在解决一维时间序列信号中存在的噪声问题,提高信号质量,增强数据的可用性和准确性。适用于金融、地质、机械工程、生物医学等领域的一维时间序列信号处理任务。 其他说明:文中提供的代码片段仅作示例,实际应用时需根据具体情况调整参数设置和处理逻辑。建议结合最新文献和官方文档深入学习VMD和Cramer von Mises检验的相关知识。

    基于11-2直流微电网的现代能源管理系统:PV+MPPT、DCDC储能、三相并网PQ控制与VF控制技术

    内容概要:本文详细介绍了11-2直流微电网的构成及其关键技术,旨在提升清洁能源和可持续能源的应用效果。首先阐述了PV+MPPT技术,通过最大功率点跟踪提高光伏发电效率;其次讨论了DCDC储能技术,用于平衡微电网的能量供需,确保稳定供电;接着介绍了三相并网的PQ控制策略,实现对外部电网的能量交换和功率因数调整;最后讲解了三相负载的VF控制,保障微电网提供稳定、高质量的电能,使波形保持优美。总结部分展望了直流微电网在未来清洁能源领域的更大作用。 适合人群:从事电力系统、新能源技术和微电网研究的专业人士和技术爱好者。 使用场景及目标:适用于希望深入了解直流微电网核心技术的研究人员和工程师,帮助他们掌握PV+MPPT、DCDC储能、三相并网PQ控制和三相负载VF控制的具体应用方法,以优化微电网的设计和运行。 其他说明:文中提到的技术不仅有助于提高微电网的效率和稳定性,还为未来的清洁能源发展提供了理论支持和技术指导。

    单级热电制冷器件,全球前20强生产商排名及市场份额(by QYResearch).pdf

    单级热电制冷器件,全球前20强生产商排名及市场份额(by QYResearch).pdf

    实训商业源码-WordPress主题-图片摄影作品展示自适应主题-毕业设计.zip

    实训商业源码-WordPress主题-图片摄影作品展示自适应主题-毕业设计.zip

    【无线网络技术】WiFi 3(IEEE 802.11g)的技术特点、应用及历史地位综述:从经典到逐步退出主流市场

    内容概要:WiFi 3(IEEE 802.11g)是无线网络发展历程中的重要里程碑,于2003年推出,旨在解决当时无线网络传输速度瓶颈问题。它工作在2.4GHz频段,采用正交频分复用(OFDM)技术,最大传输速率从802.11b的11Mbps提升至54Mbps,并保持与802.11b设备的兼容性,极大提升了用户体验。WiFi 3不仅在家庭、办公环境和公共场所广泛应用,还通过其优秀的兼容性和稳定性,加速了无线网络的普及。尽管随着WiFi 4、5、6等新一代标准的出现,WiFi 3逐渐退出主流市场,但在特定场景中仍发挥作用。未来,WiFi技术将继续发展,满足更高带宽和低延迟需求的应用场景。 适合人群:对无线网络技术发展感兴趣的读者,尤其是对历史和技术细节有一定了解的技术爱好者。 使用场景及目标:①了解WiFi 3在无线网络发展中的地位和作用;②掌握WiFi 3的技术特点及其与前后代标准的对比;③理解WiFi 3在特定场景下的应用及其逐渐被替代的原因。 其他说明:WiFi 3的成功不仅在于其技术上的突破,还在于其对市场需求的精准把握。它为后续WiFi标准的发展奠定了基础,并在无线网络技术的演进中发挥了承上启下的作用。尽管已被新一代标准取代,WiFi 3的技术理念和应用模式仍然影响深远。

    Abaqus相场法断裂模型及其在UMAT用户子程序中的实现——材料断裂分析的有效工具

    内容概要:本文详细介绍了Abaqus相场法断裂模型及其在UMAT用户子程序中的实现。首先概述了Abaqus相场法断裂模型的基本概念,这是一种基于连续介质力学的数值模拟方法,能够有效模拟材料在复杂应力状态下的断裂行为。接着讨论了UMAT用户子程序的作用,即通过自定义材料本构关系,实现对材料力学行为的精确描述。文中还探讨了如何利用UMAT实现广义版本的相场断裂,支持多种断裂准则(如Drucker-Prager),并允许选择不同的裂纹密度函数,以适应不同的应用场景和材料特性。最后,强调了该模型在材料断裂分析中的重要性和广泛应用前景。 适合人群:从事材料科学、工程力学研究的专业人士,尤其是那些希望深入了解材料断裂机制并在实际项目中应用相关理论的研究人员和技术人员。 使用场景及目标:适用于需要进行材料断裂分析的工程项目,特别是涉及复杂应力状态下材料性能评估的情况。目标是帮助研究人员和工程师更准确地预测和分析材料的断裂行为,优化设计方案。 阅读建议:对于有兴趣深入理解Abaqus相场法断裂模型及其在UMAT用户子程序中实现的读者,建议仔细研读每部分内容,尤其是关于断裂准则和裂纹密度函数的选择部分,这有助于提高模拟的准确性。

    基于Carsim与Matlab/Simulink的多点预瞄模糊控制联合仿真建模及应用

    内容概要:本文介绍了利用Carsim和Matlab/Simulink进行多点预瞄模糊控制的联合仿真的方法和技术细节。主要内容涵盖双移线工况下理想的轨迹生成、预瞄点处理模块的设计以及模糊控制器的具体实现。文中特别强调了动态调整预瞄点权重的方法及其对车辆侧向加速度的影响,并展示了不同驾驶条件下预瞄距离补偿机制的作用。此外,还提到了一些优化措施如移动平均滤波的应用来提高系统的稳定性和响应性能。 适用人群:汽车工程领域的研究人员、自动驾驶系统开发者、高校相关专业师生。 使用场景及目标:适用于需要深入理解和掌握复杂交通环境下的智能车辆控制系统设计的研究人员;旨在帮助读者构建高效的联合仿真平台,探索先进的路径规划和跟踪控制策略。 其他说明:提供的Simulink源码文件和详细的建模说明文档有助于加速项目开发流程并促进学术交流。

    FLAC3D三轴剪切试验中邓肯张本构模型的应用与计算结果分析

    内容概要:本文详细介绍了基于邓肯张本构模型的FLAC3D三轴剪切试验模拟。首先概述了材料力学分析在工程领域的关键作用,接着介绍了邓肯张本构模型的基本概念及其在FLAC3D中的应用。然后,文章描述了实验模型的建立过程,包括加载和加卸载模拟的具体步骤。通过对应力应变曲线的分析,展示了材料在不同应力状态下的力学行为,特别是非线性和塑性变形特性。最后,讨论了FLAC3D本构模型的二次开发,强调了其在提高模型适用性和灵活性方面的作用。 适合人群:从事岩土工程、材料科学及相关领域的研究人员和技术人员。 使用场景及目标:适用于需要进行复杂应力应变分析的工程项目,旨在帮助工程师更准确地预测材料的力学性能,从而优化工程设计。 其他说明:本文不仅提供了详细的模拟过程和技术细节,还分享了实际操作中的经验和技巧,对于希望深入了解FLAC3D和邓肯张本构模型的读者非常有帮助。

    实训商业源码-xycms_yly_v3.7-毕业设计.zip

    实训商业源码-xycms_yly_v3.7-毕业设计.zip

    虚拟电厂优化调度中电转气、碳捕集与垃圾焚烧协同机制研究及Python实现

    内容概要:本文详细探讨了将碳捕集、垃圾焚烧和电转气(P2G)集成到虚拟电厂优化调度中的复杂性和解决方案。作者分享了自己在实验室内复现该模型的经验,重点介绍了如何通过Python建立目标函数和约束条件来实现三个系统的协同运作。具体来说,文章讨论了垃圾焚烧的热电联产稳定性、P2G设备对富余电能的转换以及碳捕集系统对二氧化碳的处理,并展示了如何利用最小化函数确保P2G产能上限和碳源自平衡。此外,还提到了解决时间尺度不一致的问题,采用滚动时间窗进行分层优化,从而提高整体效率并减少碳排放。最后强调了实际应用中需要考虑预测误差的容灾能力和弹性约束的重要性。 适合人群:从事能源系统优化、虚拟电厂设计的研究人员和技术人员,特别是关注低碳技术和可持续发展的专业人士。 使用场景及目标:适用于希望深入了解虚拟电厂内部工作机制及其优化方法的人群;旨在为相关领域的项目提供理论支持和技术指导,帮助提升能源利用效率和环境保护水平。 其他说明:文中提供的Python代码片段可用于构建类似的优化模型,但需要注意实际应用场景中的变量调整和参数设置。

    基于STM32的智能家居控制系统:自动与手动模式切换及环境参数智能调控

    内容概要:本文详细介绍了基于STM32的智能家居控制系统的设计与实现,重点在于自动与手动两种控制模式的切换以及对温湿度和光照的智能化管理。系统采用DHT11传感器进行温湿度监测,当温度超过30℃时触发警报,湿度超过50%时启动电机除湿;光照强度低于特定阈值时自动调节灯光亮度。手动模式允许用户通过按键调整各个设备的状态。文中还涉及了关键代码片段如DHT11的数据读取、ADC光照检测、按键处理状态机等,并分享了一些开发过程中遇到的实际问题及其解决方案,比如防止按键抖动、处理电机反向电动势等。 适合人群:具有一定嵌入式系统基础知识,尤其是熟悉STM32架构和C语言编程的学习者和技术人员。 使用场景及目标:适用于希望深入了解智能家居控制系统内部机制的人群,特别是那些想要掌握从硬件搭建到软件编码全过程的开发者。通过本项目的实践,能够更好地理解物联网(IoT)应用中常见的传感技术和控制逻辑。 其他说明:附带完整的仿真文件、源代码和演示视频,便于读者动手实验。文中提到的一些注意事项对于避免常见错误非常有用,例如正确配置Proteus中的元件连接方式、选择合适的硬件接口等。

    实训商业源码-vuefilemanager-laravel-v2.0.2-毕业设计.zip

    实训商业源码-vuefilemanager-laravel-v2.0.2-毕业设计.zip

    西门子博途电梯控制系统:基于SCL语言与WinCC仿真的10层6梯程序设计

    内容概要:本文档详细介绍了一个使用西门子博途软件和SCL语言编写的10层6梯电梯控制系统的设计与实现。主要内容涵盖电梯调度算法(如最近电梯选择)、人机界面(HMI)交互逻辑、高峰时段自动调度模式以及状态同步机制。文中提供了详细的代码示例和技术要点解析,帮助读者理解并掌握电梯控制系统的开发流程。 适合人群:对工业自动化感兴趣的初学者及希望深入了解PLC编程和SCL语言的中级开发者。 使用场景及目标:本项目的目的是为学生或工程师提供一个完整的电梯控制系统设计方案,可用于教学演示、实验研究或实际工程项目中。通过学习该项目,可以提高对PLC编程的理解,特别是SCL语言的应用技巧。 其他说明:随附有详细的梯形图和SCL源代码,支持WinCC仿真环境下的测试与验证。此外,还介绍了如何扩展系统功能,如增加物联网模块将电梯状态数据传输到云端。

    基于阶梯式碳交易机制与电制氢的综合能源系统热电优化策略研究

    内容概要:本文探讨了在低碳经济运行目标下,如何利用阶梯式碳交易机制和电制氢技术优化综合能源系统(IES)。研究引入了电解槽、甲烷反应器和氢燃料电池(HFC),替代传统的电转气(P2G)工艺,提出了热电比可调的热电联产和HFC运行策略,旨在降低购能成本、碳排放成本和弃风成本。通过构建混合整数线性规划模型并使用CPLEX求解器进行求解,验证了所提方法的有效性和经济性。实际案例显示,该策略显著降低了碳排放成本,并提高了系统的灵活性和适应性。 适合人群:从事能源管理和优化的研究人员、工程师以及政策制定者。 使用场景及目标:适用于需要优化能源系统、减少碳排放的企业和机构,特别是那些希望引入电制氢技术和阶梯式碳交易机制的单位。目标是提升能源系统的经济性和环保性能。 其他说明:文中详细讨论了关键组件如电解槽、氢燃料电池的工作原理及其在不同时间段的操作策略,强调了参数设置对系统性能的影响。同时指出,在实际应用中还需考虑设备启停的磨损成本等未被广泛提及的因素。

    Advanced RF Board Skills in ADS.pdf

    Advanced RF Board Skills in ADS

    实训商业源码-大红喜庆版UI猜灯谜小程序源码-毕业设计.zip

    实训商业源码-大红喜庆版UI猜灯谜小程序源码-毕业设计.zip

    电力系统优化调度中基于混合整数规划的6机30节点机组启停与功率分配解决方案

    内容概要:本文详细介绍了针对6机30节点电力系统的优化调度方法,采用混合整数规划(MIP)进行机组启停决策和功率分配。主要内容涵盖目标函数构建、安全约束设定(如支路功率限制)、热备用约束处理以及求解器参数调优等方面。文中提供了具体的Python代码片段,展示了如何利用快速求和运算、矩阵乘法等高效算法实现复杂约束条件的建模。此外,还讨论了求解器性能优化技巧,如设置合理的MIPGap值、启用预处理选项和多线程加速等。最终通过热图直观地呈现了机组启停状态。 适合人群:对电力系统调度优化感兴趣的工程师和技术人员,尤其是熟悉数学规划和Python编程的人群。 使用场景及目标:适用于需要对大规模电力网络进行经济性和安全性综合评估的实际工程应用。主要目标是在满足各种运行约束的前提下,最小化发电成本并确保系统稳定可靠运行。 其他说明:文中提到的方法不仅能够有效解决当前案例中的具体问题,也为类似规模和复杂度的电力系统调度研究提供了有价值的参考。

    基于STM32的HC-SR04超声波测距与DS18B20温度显示Proteus仿真及C语言源码实现

    内容概要:本文详细介绍了基于STM32F103RC/C6的HC-SR04超声波测距和DS18B20温度显示的Proteus仿真及其C语言源码实现。主要内容涵盖硬件连接、定时器配置、测距算法、温度补偿以及LCD1602数据显示。文中提供了详细的代码片段,如定时器初始化、温度读取和距离计算等,并分享了调试经验和优化技巧,确保测距精度和稳定性。 适合人群:具有一定嵌入式系统基础知识的学习者、初学者或从事相关领域的工程师。 使用场景及目标:适用于希望深入理解STM32嵌入式系统的开发者,特别是那些需要进行超声波测距和温度监测项目的人员。该项目不仅可用于学习目的,也可作为毕业设计或小型项目的基础。 其他说明:文中提到的关键技术和实现细节对于提高测距精度和温度测量准确性非常重要,尤其是温度补偿算法的应用。此外,还提到了一些常见的调试问题及解决方案,有助于读者更好地理解和掌握整个系统的工作原理。

    实训商业源码-W!简论坛-毕业设计.zip

    实训商业源码-W!简论坛-毕业设计.zip

Global site tag (gtag.js) - Google Analytics