先看代码案例

package com.exemple.demo.test.preciate;public class Father {private int i = test();private static int j = method();public Father() {System.out.print("(3)");}static {System.out.print("(1)");}{System.out.print("(2)");}private static int method() {System.out.print("(4)");return 0;}public int test() {System.out.print("(5)");return 0;}}class Son extends Father{private int i = test();private int k = test();private static int j = method();static {System.out.print("(6)");}{System.out.print("(7)");}public Son() {System.out.print("(8)");}public Son(int i) {this.i = i;}public Son(int i, int k) {this(i);this.k = k;}private static int method() {System.out.print("(9)");return 0;}public int test() {System.out.print("(10)");return 0;}public static void main(String[] args) {Son son = new Son();System.out.println();Son son2 = new Son();}}

执行结果

(4)(1)(9)(6)(5)(2)(3)(10)(7)(8)
(5)(2)(3)(10)(7)(8)

静态上下文的执行时机

类加载场景

常见的主动加载情况

  • 实例化一个对象时
  • 通过反射加载一个类
  • 调用一个类的静态方法/属性
  • 读写一个类的静态属性
  • 实例化子类对象时(会触发父类的加载)

类加载过程

  • 加载阶段:类加载器ClassLoader从网络或本地文件系统中加载字节码文件到JVM中
  • 链接阶段:将验证Class文件中的字节流包含的信息是否符合当前虚拟机的要求,为静态域分配存储空间并设置类变量的初始值(默认的零值)
  • 初始化:到了此阶段,才真正开始执行类中定义的java程序代码(字节码层面即执行clinit)。clinit即按在代码中出现的顺序执行该类的静态变量初始化和类的静态代码块,如果该类有父类的话,则优先对其父类进行初始化

字节码clinit案例

以Son类的cinit方法为例

构造器

为了初始化成员属性,而不是初始化对象,初始化对象是通过new关键字实现的,new关键字会在堆上为对象开辟一块空间用来存储对象自己的属性、方法,如果有父类的话也会存储父类相关的非private的属性和方法,因为创建子类对象会调用父类构造方法但不会创建父类对象,只是调用父类构造方法初始化父类成员属性并一块存入到子类对象中

特殊案例

抽象类可以有构造方法,但抽象类不能实例化

字节码init方法

java中的构造器代码会编译为init方法,init方法中的内容首先是执行父类的init方法(子类构造器第一行其实就是super,只不过父类没有多参构造器、或者在有多参构的情况下显示定义了无参构造,那么子类构造器第一行的super()可以省略),随后按代码顺序初始化类属性、普通代码块,(始终)最后执行构造方法,构造方法的执行始终是最后一步去执行的,和代码顺序无关,这意味着构造器赋值拥有最终解释权,实例对象属性最后的值是通过构造器赋予的,一个构造器对应一个init方法,一个类有n个构造器,就会对应n个init方法。

init方法执行过程注意点

init方法按代码顺序初始化类属性的过程中,可能会受到子类重写方法的影响,因为我们在main方法中实例化的是Son类的对象,在实例化Son之前初始化父类Father时,加载父类属性i的时需要执行test方法,看test方法是否被子类给重写了,如果发生了重写,那么此时默认执行的是子类方法中的test,代码执行结果为

(4)(1)(9)(6)(10)(2)(3)(10)(7)(8)
(10)(2)(3)(10)(7)(8)

作为对比,由于我们上述案例中父类中的test方法修饰符是private,所以子类并未发生重写,所以此时执行的还是父类的test,代码执行结果为

(4)(1)(9)(6)(5)(2)(3)(10)(7)(8)
(5)(2)(3)(10)(7)(8)

通过this调用构造器

init方法案例

以Son类的构造器init方法为例

JAVA构造器、静态上下文的执行时机与代码执行顺序详解相关推荐

  1. java aio事件模型_IO模型之AIO代码及其实践详解

    当打开通道失败时,会抛出一个IOException异常. 1.2 绑定地址和端口 通过调用AsynchronousServerSocketChannel.bind(SocketAddress)方法来绑 ...

  2. Java: static,final,代码块 的详解

    Java: static,final,代码块 的详解 每博一文案 山本文绪说过这样一句话:哪些决定放弃了的事,就请放弃得干干净净.哪些决定再也不见面的人,就真 的不要再见面了,不要再做背叛自己的事,如 ...

  3. java docker 持续集成_最佳实战Docker持续集成图文详解

    前言 关于Docker的文章铺天盖地,但精品文章往往翻译居多.都说Docker天生适合持续集成/持续部署,但同样,可落地.实际可操作性的文章也很罕见. 基于这些情况,虽然我们专栏定位为运维管理性文字, ...

  4. 【JAVA秘籍心法篇-Spring】Spring XML解析源码详解

    [JAVA秘籍心法篇-Spring]Spring XML解析源码详解 所谓天下武功,无坚不摧,唯快不破.但有又太极拳法以快制慢,以柔克刚.武功外式有拳打脚踢,刀剑棍棒,又有内功易筋经九阳神功.所有外功 ...

  5. java中北大学ppt总结+课后习题第二章(小宇特详解)

    java中北大学ppt总结+课后习题第二章(小宇特详解) 基本数据类型 Java语言有8种基本数据类型. 逻辑类型:boolean.1字节 整数类型: 1字节整数类型:byte. 2字节整数类型:sh ...

  6. java 注释 超链接_java_Java代码注释规范详解,代码附有注释对程序开发者来 - phpStudy...

    Java代码注释规范详解 代码附有注释对程序开发者来说非常重要,随着技术的发展,在项目开发过程中,必须要求程序员写好代码注释,这样有利于代码后续的编写和使用. 基本的要求: 1.注释形式统一 在整个应 ...

  7. java获取request body_HttpServletRequest获取body内容(字符串/二进制)详解

    首页 > Java Web > SpringMvc应用 > HttpServletRequest HttpServletRequest获取body内容(字符串/二进制)详解 获取HT ...

  8. java中String s=abc及String s=new String(abc)详解

    java中String s="abc"及String s=new String("abc")详解 1.   栈(stack)与堆(heap)都是Java用来在R ...

  9. 蓝桥杯java B组历年省赛真题汇总及题目详解

    蓝桥杯java B组历年省赛真题汇总及题目详解 2019年第十届蓝桥杯省赛真题详解 2018年第九届蓝桥杯省赛真题详解 2017年第八届蓝桥杯省赛真题详解 2016年第七届蓝桥杯省赛真题详解 2015 ...

最新文章

  1. arcgis server 开发
  2. AES加密_ js与C#互通
  3. 万万没想到,我居然在机器人大会遇到了这些奇葩物种
  4. android 对象数据库中,解析嵌套的JSON对象,并存储在数据库中的Android
  5. ACL 2019 开源论文 | 基于知识库和大规模网络文本的问答系统
  6. CRMEB系统使用协议
  7. Sublime Text快捷键去除空白行
  8. python所有的父类_python获取父类的子类(遍历,递归),并循环执行所有子类的某一方法...
  9. plsql 误删表,使用flashback query恢复被删除plsql
  10. 【Spark】SparkStreaming-如何使用checkpoint
  11. js中的异步与同步,解决由异步引起的问题
  12. Optisystem应用:光电检测器灵敏度建模
  13. JAVA学习笔记_StringUtil.isEmpty_null不是null
  14. 云计算学习网站都有哪些?学习云计算的方法
  15. 换位密码 java_矩形柱状换位加密方法
  16. vs+html教学,VS Code怎么运行html文件
  17. 串口驱动中使用FIFO
  18. 单人被罩标准的尺寸是多少
  19. 【BZOJ5314】【JSOI2018】—潜入行动(树形dp)
  20. 详尽全面而又简单易懂的Scala学习笔记(参上)【不适合零基础】

热门文章

  1. NET MVC5第三方验证——FluentValidation
  2. 华为服务器修改root密码,华为esc服务器root密码
  3. 怎么用命令远程重启服务器,使用命令行重启Windows服务器的方法
  4. <Android开发> Android vold - 第四篇 vold 的NetlinkHandler类简介
  5. linux h3c 802.1客户端,OH3C 的安装及使用 H3C 802.1x Client for OpenWrt
  6. Linux下常用压缩 解压命令和压缩比率对比
  7. html表格一行设置颜色,更改表格中一行的颜色,html
  8. 利用C#编写一个高斯正反算程序
  9. oracle财务软件导出报表,OracleFusion财务会计中心报表云服务-UAO.PDF
  10. 【原创】基于TensorFlow2识别人是否配戴眼镜的研究