继承关系的类初始化和实例化的顺序

告别手动操作!用Python脚本批量处理Siemens NX零件文件(导入/导出/移除参数) 本文详细介绍了如何利用Python脚本实现Siemens NX零件文件的批量处理,包括导入、导出和移除参数等操作。通过NX Open API和Python UF接口,工业设计师可以大幅提升工作效率,告别繁琐的手动操作。文章提供了完整的实战指南,涵盖环境配置、核心功能实现以及性能优化技巧,特别适合需要进行Siemens-NXUG二次开发的工程师参考。 阅读详情

一切都是java编译器搞得鬼. JVM只是负责解析字节码.字节码虽然不是最原始的原子汇编码,但字节码已经可以完全解释JVM的指令执行过程了。

AD:WOT2014课程推荐:实战MSA:用开源软件搭建微服务系统

就像之前的一个评论.我们学习的是思路. 很多人都知道继承关系的类的初始化和实例化的顺序,但如果忘记了怎么办? 如何找到自己的答案? 又如果遇到的问题是关于泛型的擦除问题,又该如何去分析?

思路,重点是思路.泛型擦除先不谈.看继承. 首先给出一个例子,看看它的输出是什么.

    
  1. public class A {  
  2.     private static String a = "NA";  
  3.     private String i="NA";  
  4.     {  
  5.         i = "A";  
  6.         System.out.println(i);  
  7.     }  
  8.       
  9.     static {  
  10.         a = "Static A";  
  11.         System.out.println(a);  
  12.     }  
  13.       
  14.     public A() {  
  15.         System.out.println("Construct A");  
  16.     }  
  17. } 
    
  1. public class B extends A {  
  2.     private static String b = "NB";  
  3.     private String j="NB";  
  4.     {  
  5.         j = "B";  
  6.         System.out.println(j);  
  7.     }  
  8.       
  9.     static {  
  10.         b = "Static B";  
  11.         System.out.println(b);  
  12.     }  
  13.       
  14.     public B() {  
  15.         System.out.println("Construct B");  
  16.     }  
  17. } 
    
  1. public class C {  
  2.     public static void main(String[] args) {  
  3.         new B();  
  4.     }  
  5.  
  6. } 

以上输出是:

Static A
Static B
A
Construct A
B
Construct B

一切都是java编译器搞得鬼. JVM只是负责解析字节码.字节码虽然不是最原始的原子汇编码,但字节码已经可以完全解释JVM的指令执行过程了.一般来说,字节码和java源码相差比较大,javac会做前期优化,修改增加删除源码产生jvm解释器可以理解的字节码. java语法带来的安全,易用,易读等功能让我们忽略了字节码会和java源码有出路.

当遇到new的时候,比如new B(),将会尝试去初始化B类.如果B已经初始化,则开始实例化B类.如果B类没有初始化,则初始化B类,但B类继承A,所以在初始化B类之前需要先初始化A类.所以类的初始化过程是:A->B. 类在初始化的时候会执行static域和块. 类的实例化在类初始化之后,实例化的时候必须先实例化父类.实例化会先执行域和块,然后再执行构造函数.

上面的理论如果靠这种死记硬背,总会忘记.哦,还有父类的构造函数必须放在子类构造函数的第一行.为什么?

遇到这种语法问题的时候,看教科书不如自己找出答案.工具就在JDK中,一个名叫javap的命令. javap会打出一个class的字节码伪码. 我们只需要分析B的字节码,就可以找到答案.

    
  1. joeytekiMacBook-Air:bin joey$ javap -verbose B  
  2. Compiled from "B.java" 
  3. public class B extends A  
  4.   SourceFile: "B.java" 
  5.   minor version: 0 
  6.   major version: 50 
  7.   Constant pool:  
  8. const #1 = class    #2; //  B  
  9. const #2 = Asciz    B;  
  10. const #3 = class    #4; //  A  
  11. const #4 = Asciz    A;  
  12. const #5 = Asciz    b;  
  13. const #6 = Asciz    Ljava/lang/String;;  
  14. const #7 = Asciz    j;  
  15. const #8 = Asciz    <clinit>;  
  16. const #9 = Asciz    ()V;  
  17. const #10 = Asciz   Code;  
  18. const #11 = String  #12;    //  NB  
  19. const #12 = Asciz   NB;  
  20. const #13 = Field   #1.#14; //  B.b:Ljava/lang/String;  
  21. const #14 = NameAndType #5:#6;//  b:Ljava/lang/String;  
  22. const #15 = String  #16;    //  Static B  
  23. const #16 = Asciz   Static B;  
  24. const #17 = Field   #18.#20;    //  java/lang/System.out:Ljava/io/PrintStream;  
  25. const #18 = class   #19;    //  java/lang/System  
  26. const #19 = Asciz   java/lang/System;  
  27. const #20 = NameAndType #21:#22;//  out:Ljava/io/PrintStream;  
  28. const #21 = Asciz   out;  
  29. const #22 = Asciz   Ljava/io/PrintStream;;  
  30. const #23 = Method  #24.#26;    //  java/io/PrintStream.println:(Ljava/lang/String;)V  
  31. const #24 = class   #25;    //  java/io/PrintStream  
  32. const #25 = Asciz   java/io/PrintStream;  
  33. const #26 = NameAndType #27:#28;//  println:(Ljava/lang/String;)V  
  34. const #27 = Asciz   println;  
  35. const #28 = Asciz   (Ljava/lang/String;)V;  
  36. const #29 = Asciz   LineNumberTable;  
  37. const #30 = Asciz   LocalVariableTable;  
  38. const #31 = Asciz   <init>;  
  39. const #32 = Method  #3.#33; //  A."<init>":()V  
  40. const #33 = NameAndType #31:#9;//  "<init>":()V  
  41. const #34 = Field   #1.#35; //  B.j:Ljava/lang/String;  
  42. const #35 = NameAndType #7:#6;//  j:Ljava/lang/String;  
  43. const #36 = String  #2; //  B  
  44. const #37 = String  #38;    //  Construct B  
  45. const #38 = Asciz   Construct B;  
  46. const #39 = Asciz   this;  
  47. const #40 = Asciz   LB;;  
  48. const #41 = Asciz   SourceFile;  
  49. const #42 = Asciz   B.java;  
  50.  
  51. {  
  52. static {};  
  53.   Code:  
  54.    Stack=2, Locals=0, Args_size=0 
  55.    0:   ldc #11; //String NB  
  56.    2:   putstatic   #13; //Field b:Ljava/lang/String;  
  57.    5:   ldc #15; //String Static B  
  58.    7:   putstatic   #13; //Field b:Ljava/lang/String;  
  59.    10:  getstatic   #17; //Field java/lang/System.out:Ljava/io/PrintStream;  
  60.    13:  getstatic   #13; //Field b:Ljava/lang/String;  
  61.    16:  invokevirtual   #23; //Method java/io/PrintStream.println:(Ljava/lang/String;)V  
  62.    19:  return 
  63.   LineNumberTable:   
  64.    line 3: 0 
  65.    line 11: 5 
  66.    line 12: 10 
  67.    line 13: 19 
  68.  
  69.  
  70.  
  71. public B();  
  72.   Code:  
  73.    Stack=2, Locals=1, Args_size=1 
  74.    0:   aload_0  
  75.    1:   invokespecial   #32; //Method A."<init>":()V  
  76.    4:   aload_0  
  77.    5:   ldc #11; //String NB  
  78.    7:   putfield    #34; //Field j:Ljava/lang/String;  
  79.    10:  aload_0  
  80.    11:  ldc #36; //String B  
  81.    13:  putfield    #34; //Field j:Ljava/lang/String;  
  82.    16:  getstatic   #17; //Field java/lang/System.out:Ljava/io/PrintStream;  
  83.    19:  aload_0  
  84.    20:  getfield    #34; //Field j:Ljava/lang/String;  
  85.    23:  invokevirtual   #23; //Method java/io/PrintStream.println:(Ljava/lang/String;)V  
  86.    26:  getstatic   #17; //Field java/lang/System.out:Ljava/io/PrintStream;  
  87.    29:  ldc #37; //String Construct B  
  88.    31:  invokevirtual   #23; //Method java/io/PrintStream.println:(Ljava/lang/String;)V  
  89.    34:  return 
  90.   LineNumberTable:   
  91.    line 15: 0 
  92.    line 4: 4 
  93.    line 6: 10 
  94.    line 7: 16 
  95.    line 16: 26 
  96.    line 17: 34 
  97.  
  98.   LocalVariableTable:   
  99.    Start  Length  Slot  Name   Signature  
  100.    0      35      0    this       LB;  
  101. } 

类的生命周期,将经历类的装载,链接,初始化,使用,卸载. 装载是将字节码读入到内存的方法区中, 而类的初始化则会在线程栈中执行static{}块的code. 在之前,这个块有另一个名字<cinit>即类初始化方法.现在改名为static{}了. 类的初始化只进行一次. 但是,每当一个类在装载和链接完毕以后,通过字节码的分析,JVM解析器已经知道B是继承A的,于是在初始化B类前,A类会先初始化.这是一个递归过程. 所以,B类的初始化会导致A类static{}执行,然后是B的static{}执行.让我们看看B的static{}块中执行了什么.

    
  1. static {};  
  2.   Code:  
  3.    Stack=2, Locals=0, Args_size=0 
  4. 栈深为2,本地变量0个,参数传递0个.  
  5.    0:   ldc #11; //String NB  
  6. 将常量池中#11放到栈顶.#11="NB".  
  7.    2:   putstatic   #13; //Field b:Ljava/lang/String;  
  8. 将栈顶的值 "NB" 赋予常量池中的#13,也就是 static b="NB".  
  9.    5:   ldc #15; //String Static B  
  10. 将#15放入栈顶. #15="static B".  
  11.    7:   putstatic   #13; //Field b:Ljava/lang/String;  
  12. 赋值static b = "static B".  
  13.    10:  getstatic   #17; //Field java/lang/System.out:Ljava/io/PrintStream;  
  14. 将PrintStream引用压栈.  
  15.    13:  getstatic   #13; //Field b:Ljava/lang/String;  
  16. 将static b的值压栈.  
  17.    16:  invokevirtual   #23; //Method java/io/PrintStream.println:(Ljava/lang/String;)V  
  18. 调用虚函数PrintStream.println("static B")  
  19.    19:  return 
  20. 退出函数,销毁函数栈帧. 

通过注释,我们看到类B中的static域赋值和static块均被放到了类的初始化函数中.

当我们进行类的实例化的时候,会调用类的构造函数.我们看看类B的构造函数做了什么.

    
  1. public B();  
  2.   Code:  
  3.    Stack=2, Locals=1, Args_size=1 
  4. 栈深为2,本地变量1个(其实就是this),参数为1个(就是this).  
  5.    0:   aload_0  
  6. 将第一个参数压栈.也就是this压栈.  
  7.    1:   invokespecial   #32; //Method A."<init>":()V  
  8. 在this上调用父类的构造函数.在B的构造函数中并没有声明super(),但是java编译器会自动生成此字节码来调用父类的无参构造函数.如果在B类中声明了super(int),编译器会使用对应的A类构造函数来代替.JVM只是执行字节码而已,它并不对super进行约束,约束它们的是java的编译器.this出栈.  
  9.    4:   aload_0  
  10. 将this压栈.  
  11.    5:   ldc #11; //String NB  
  12. 将"NB"压栈.  
  13.    7:   putfield    #34; //Field j:Ljava/lang/String;  
  14. 给j赋值this.j="NB". this和"NB"出栈.  
  15.    10:  aload_0  
  16. 将this压栈.  
  17.    11:  ldc #36; //String B  
  18. 把"B"压栈  
  19.    13:  putfield    #34; //Field j:Ljava/lang/String;  
  20. 给j赋值this.j="B". this和"B"出栈.栈空  
  21.    16:  getstatic   #17; //Field java/lang/System.out:Ljava/io/PrintStream;  
  22. 压栈PrintStream  
  23.    19:  aload_0  
  24. 压栈this 
  25.    20:  getfield    #34; //Field j:Ljava/lang/String;  
  26. this出栈,调用this.j,压栈this.j.  
  27.    23:  invokevirtual   #23; //Method java/io/PrintStream.println:(Ljava/lang/String;)V  
  28. 调用PrintStream.println(this.j).栈空.  
  29.    26:  getstatic   #17; //Field java/lang/System.out:Ljava/io/PrintStream;  
  30. 压栈PrintStream  
  31.    29:  ldc #37; //String Construct B  
  32. 压栈"Construct B" 
  33.    31:  invokevirtual   #23; //Method java/io/PrintStream.println:(Ljava/lang/String;)V  
  34. 调用PrintStream.println("Construct B")  
  35.    34:  return 

从上面的字节码可以看出,java编译器在编译产生字节码的时候,将父类的构造函数,域的初始化,代码块的执行和B的真正的构造函数按照顺序组合在了一起,形成了新的构造函数. 一个类的编译后的构造函数字节码一定会遵循这样的顺序包含以下内容:

父类的构造函数->

当前类的域初始化->(按照书写顺序)

代码块->(按照书写顺序)

当前类的构造函数.

到这里,应该彻底明白继承类的初始化和实例化顺序了.

原文链接:http://my.oschina.net/xpbug/blog/111371

Cocos Creator+微信小游戏:如何用wxDownloader实现资源动态加载与热更新 本文深入探讨了在Cocos Creator开发微信小游戏时,如何利用wxDownloader有效应对主包体积限制,实现资源的动态加载与热更新。文章详细介绍了从项目配置、资源标记到初始化加载的完整流程,并重点解析了基于MD5 Cache的缓存策略与版本控制方案,旨在帮助开发者构建稳健高效的资源管理体系,优化游戏启动速度与更新体验。 阅读详情

相关推荐

【YOLOv8实战】从零构建番茄成熟度智能检测GUI系统【附完整工程】

本文详细介绍了从零构建基于YOLOv8的番茄成熟度智能检测GUI系统的完整实战流程。内容涵盖环境搭建、数据集准备、模型训练调优,并重点讲解如何使用PyQt5开发图形界面,最终将项目打包为可执行文件,实现AI模型从训练到桌面应用落地的完整工程闭环。

xxx12的博客 822

多重继承关系的初始化顺序

多重继承关系的初始化顺序 父类属性---》父类构造方法---》子类属性---》子类构造方法                  说明:创建对象时,子类构造方法会自动调用父类的构造方法,若子类有有参构造,则不会自动调用父类无参构造。此时子类必须有一个无参构造,否则使用无参构造函数创建对象时会报错。如果父类属性未初始化,父类属性不会调用,会直接走父类构造方法中的内容。然后继续子

明天,争取的博客 3227

STM32F407 CanOpen主机实战:对象字典配置与多电机CIA402协议驱动详解

本文详细介绍了基于STM32F407的CanOpen主机开发实战,重点解析了对象字典的配置流程与多电机CIA402协议驱动方法。通过使用objdictedit工具配置SDO和PDO参数,并整合CanFestival协议栈,实现了对多个伺服电机的稳定同步控制。文章提供了从硬件连接到代码调试的完整指南,帮助开发者快速掌握工业现场的多轴运动控制技术。

plant的博客 531

内部类中的继承类的实例化

继承类的实例化对象。 首先,我们建立一个外部类,类名为Dome1,内部类为Dome101。 然后我们通过关键词extends来继承内部类Dome101 然后我们进行实例化对象,通过类名.继承类名进行实例

YSKBO743639220的博客 385

实用电路精讲系列---ACDC开关电源

AC/DC开关电源工作原理及应用解析 AC/DC开关电源通过高频开关技术将交流电转换为稳定直流电,核心流程包括整流滤波、高频开关转换、反馈稳压和隔离保护。典型应用涵盖智能断路器、车载充电机、光伏逆变器等多个领域,采用不同拓扑结构和功率器件满足各场景需求。文章详细分析了基于LT1103的实用电路,包含输入整流、开关稳压、多级滤波等关键模块,并阐述了同步整流和多级滤波对提升效率稳定性的作用。这种电源技术通过高频开关切换+变压器耦合+闭环反馈,实现了高效紧凑的电能转换,在各工业领域具有广泛应用价值。

weixin_40590799的博客 2586

深入解析Cuk、Zeta和Sepic拓扑:非隔离型开关电源的设计奥秘

本文深入解析了Cuk、Zeta和Sepic三种非隔离型开关电源拓扑的设计奥秘。它们均能实现升降压转换,但特性各异:Cuk拓扑输出反向电压,输入输出纹波极低;Sepic拓扑输出同极性电压,应用广泛;Zeta拓扑输出纹波小,适合精密供电。文章详细对比了其电路结构、工作原理、核心公式及选型指南,帮助工程师根据输入电压范围、输出极性及纹波要求,灵活选择最合适的拓扑方案。

weixin_28308325的博客 478

C++ 类对象的初始化顺序,有多重继承情况下的顺序

C++ 类对象的初始化顺序,有多重继承情况下的顺序

him_xp的博客 991

Multisim14.3主数据库访问冲突:Windows更新KB5065426卸载与系统兼容性修复指南

本文针对Multisim14.3在Windows更新KB5065426后出现的主数据库访问冲突问题,提供了详细的解决方案。通过卸载问题更新、修复系统兼容性及调整权限设置,帮助用户快速恢复元器件库的正常访问,确保电路仿真设计的连续性。

lstm7chronicler的博客 514

继承1(覆盖、子类的实例化、抽象类、模板方法)

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-继承的概述 多个类中存在相同属性和行为时,将这些内容抽取到 单独一个类中,那么多个类无需再定义这些属性和行 为,只要继承单独的那个类即可。 多个类可以称为子类,单独这个类称为父类或者超 类。 子类可以直接访问父类中的非私有的属性和行为。 通过extends 关键字让类与类之间产生继承关系。 clas

海角秋风 852

NVIDIA Jetson Orin DLA架构解析与AI推理优化实践

深度学习加速器(DLA)作为专用AI推理芯片,通过固定功能架构实现卷积、池化等神经网络操作的高效能比处理。其核心原理在于硬件级优化计算单元与数据流,相比通用GPU可提升3-5倍能效。在边缘计算场景中,DLA与GPU的异构协同成为关键,特别适合自动驾驶感知、机器人视觉等实时性要求高的应用。NVIDIA Jetson Orin平台通过结构化稀疏技术,在ResNet50等模型上实现近2倍性能提升。开发实践中需注意算子支持、精度校准等关键点,结合TensorRT工具链可充分发挥DLA在低功耗场景的独特优势。

weixin_32999557的博客 398

DeerFlow 系列教程 第四篇 | Sandbox 沙箱与 Sub-agent 子智能体协作详解

DeerFlow 系列教程第四篇介绍了两个关键子系统:Sandbox 沙箱系统和Sub-agent子智能体协作机制。沙箱系统通过虚拟路径映射、权限白名单、命令审计和容器隔离四重机制,为Agent提供安全的代码执行环境,使其能在隔离环境中执行文件操作和脚本运行。系统采用分层架构设计,包含应用层、工具层、审计层等,核心是定义标准交互接口的抽象基类。虚拟路径系统将Agent操作的虚拟路径映射到实际路径,确保安全性。这些功能使DeerFlow从对话助手进化为能处理复杂任务的Super Agent平台。

weixin_43674738的博客 285

java实例化继承类_继承关系的类初始化和实例化的顺序

就像之前的一个评论.我们学习的是思路. 很多人都知道继承关系的类的初始化和实例化的顺序,但如果忘记了怎么办? 如何找到自己的答案? 又如果遇到的问题是关于泛型的擦除问题,又该如何去分析?思路,重点是思路.泛型擦除先不谈.看继承. 首先给出一个例子,看看它的输出是什么.publicclassA{privatestaticStringa="NA";privateStringi="NA";{i...

weixin_33363265的博客 422

移动支付APP(仿支付宝)

Toast.makeText(PayActivity.this, "支付失败:" + payResponse.getMsg(), Toast.LENGTH_SHORT).show();Toast.makeText(PayActivity.this, "支付失败:" + t.getMessage(), Toast.LENGTH_SHORT).show();Toast.makeText(PayActivity.this, "支付失败", Toast.LENGTH_SHORT).show();

寒寒豆豆软件公司的博客 136

从原理来理解继承关系的类初始化和实例化的顺序

为什么80%的码农都做不了架构师?>>> ...

weixin_34101784的博客 142

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

完数判断的三种实现方案与工程优化实践

完数(完全数)是数论中经典的正整数概念,指其所有真因子之和等于自身的数,如6、28。理解其数学本质——因子成对出现且最大枚举至√n——是设计高效算法的前提。基于该原理,可衍生出朴素枚举、优化枚举和预计算查表三类技术路径,分别对应教学演示、通用校验与高频查询等不同工程场景。其中优化枚举法以O(√n)时间复杂度兼顾正确性、可读性与性能,成为实际开发首选;而查表法依托完数极度稀疏的特性(已知仅5个在常规整型范围内),实现O(1)判定,体现典型的空间换时间权衡。这些方法共同映射出软件工程中的核心能力:数学建模、边界

weixin_34354173的博客 529

数学建模模型总结

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

java实例化继承类_Java继承关系的类的初始化和实例化的执行顺序

首先我们定义一个接口,如下:publicinterfacePeople{StringinterfaceName="People";}然后定义一个父类,如下:publicclassParent{{System.out.println("Parentcodeblock-1");}static{System.out.println("Parentstaticblock");}{...

weixin_39644146的博客 162

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

JAVA类的加载和初始化、对象的实例化

JAVA类的加载和初始化、对象的实例化

qq_37154145的博客 1073

java 类的实例化过程,其中的相关顺序 包括有继承的子类等复杂情况,静态成员变量的初始化顺序,这其中jvm在干什么

Java类的实例化过程涉及多个步骤,特别是在存在继承关系和静态成员的情况下。下面我将详细解释整个过程,包括JVM在其中的角色。

风雨无阻 604

全面了解JAVA类的初始化顺序 static修饰,静态代码块,继承等

面试中我们常常会问到关于类初始化的问题,那么关于一个类的初始化到底是按照怎么的顺序进行的呢 假如一个Son 类继承了 Parent 类 当我们实例化Son的时候是先执行父类还是先执行子类呢? 可能有的开发会说当然是先执行父类了 没错 就是先从父类开始执行的 那么当我们执行父类的时候 当父类和子类都有**有静态成员变量 有普通的成员变量时 静态代码块 构造器 时 ** 他们之间的执行顺序到底...

whb549819221的博客 255

继承下父子类初始化顺序及实例化

继承关系下父子类初始化顺序 父类静态变量 父类静态块 子类静态变量 子类静态块 父类非静态变量 父类非静态块 父类构造函数 子类非静态变量 子类非静态块 子类构造函数 为什么子类实例化时需要先调用父类构造方法 两种选择方式: 1.当不显式调用父类构造函数时,则默认调用父类的无参构造函数。如果父类声明了有参数的构造函数,而没写无参的构造函数,那么编译出错,提示父类没有默认构造函数 2.显示调用父类构造函数,你知道父类的哪个构造函数就用这个构造函数初始化父类。 理解:

weixin_45450987的博客 490

java-类的初始化顺序

 类的初始化过程与类的实例化过程 类的初始化与类的实例化是两个完全不同的概念 类的初始化是指类加载过程中的初始化阶段对类变量按照程序猿的意图进行赋值的过程; 类的实例化是指在类完全加载到内存中后创建对象的过程。 要想创建一个类的实例,必须先将该类加载到内存并进行初始化,也就是说,类初始化操作是在类实例化操作之前进行的,但并不意味着:只有类初始化操作结束后才能进行类实例化操作 public ...

好记性不如烂笔头 254

java中的实例化初始化

先类初始化 单个类 按照正常类的加载顺序加载,就是将类通过类加载器加载到内存 有继承 先加载父类再加载子类,就是先将父类通过类加载器加载到内存,然后就是子类 再成员属性 单个类 类初始化后,加载有静态的到方法区,然后没有静态的属性到栈空间 有继承 类初始化后,加载有父类静态的到方法区,然后子类静态的到方法区,再加载父类的没有静态的属性到栈空间,最后加载子类的没有静态的属性到栈空间 最后实例化初始化 首先实例化初始化必须要知道的知识 实列化之前会默认调用父类的无参构造 将没有静态的属性(成员

qq_43515464的博客 836

类初始化顺序

通过这种方式,Java确保了父类的初始化在子类之前完成,从而保证了继承关系中的正确性和一致性。在Java中,当一个子类被实例化时,其父类也会被初始化。按照从父类到子类的顺序,依次执行静态变量的初始化和静态初始化块。先执行父类的实例变量初始化和实例初始化块。再执行子类的实例变量初始化和实例初始化块。Parent 类的构造方法紧接着执行。Child 类的构造方法最后执行。Parent 类的静态块先执行。Parent 类的实例块先执行。Child 类的静态块后执行。Child 类的实例块后执行。

a624135_的博客 292

Java—类的实例化顺序

Java—类的实例化顺序 无继承关系时 1.静态成员变量-&gt;静态代码块-&gt;构造块-&gt;构造方法-&gt;普通变量初始化是在构造方法的第一条语句,如果有this()那么初始化在this()后 class Person{ private int a=10; public Person() { //private int a=10; 初始化的地方 ...

Brain的博客 244

java 函数初始化吗_Java中对象如何初始化(实例化)

学习JAVA这门面向对象的语言,实质就是不断地创建类,并把类实例化为对象并调用方法。对于初学JAVA的人总搞清楚对象是如何实例化的,假如类之间存在继承关系,那就更糊涂了.总结以下内容,可以得到对象初始化过程: 1、 如果存在继承关系,就先父类后子类; 2 、如果在类内有静态变量和静态块,就先静态后非静态,最后才是构造函数; 3 、继承关系中,必须要父类初始化完成后,才初始化子类。下面是一个例子:编...

weixin_39848007的博客 255
上一篇: Apache Digester(-)
下一篇: Tutorial: Hello World with Apache Ant
desmond_assis
博客等级 码龄14年 33粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值