类初始化相关执行顺序

几个概念说明

代码块的含义与作用

static静态代码块

  1. 一般用于初始化类中的静态变量。比如:给静态的数组或者list变量赋初值。使用static静态代码块进行初始化与直接在定义变量的时候初始化效果是一样的。
  2. static静态代码块其实完全可以看做是一个没有名字、没有参数、没有返回值的静态方法,这个静态方法会在main方法执行前执行,而且是主动执行的,不需要任何显示调用,除此之外它和普通的静态方法没有任何区别。

构造块(又称构造代码块)

  1. 没有static修饰的代码块;
  2. 主要用于普通变量的初始化。

类的初始化顺序

在一个独立的类中

优先按照如下的顺序执行初始化:

  1. 所有static修饰的全局变量(static、static final等)、静态代码块,按照代码顺序从上到下逐个执行一遍。
  2. 所有普通全局变量、普通代码块(又称为构造块、构造代码块),按照代码顺序从上到下逐个执行一遍。
  3. 构造函数。

如果new多个类对象,则只有第一个new对象的时候,会执行上述1中描述的代码初始化,后面new对象的时候,都只会执行2、3两个步骤。即:static修饰的静态变量、静态常量、静态代码块,在整个虚拟机生命周期中只会初始化一次

在子类中

对于子类的初始化,整体原则是优先执行父类的初始化,然后再执行子类的初始化,详细如下:

  1. 按照从最顶层父类逐层下钻,直到当前要初始化的子类的顺序,先将所有static修饰的全局变量(static、static final等)、静态代码块,按照代码顺序从上到下逐个执行一遍(即先执行父类中所有static相关代码,再执行子类中static相关代码)。
  2. 按照从最顶层父类逐层下钻,直到当前要初始化的子类的顺序,依次执行上述1个独立类初始化章节中提及的2、3步骤。

举个例子,class Child extends Parent,加载顺序如下:

  1. 加载Parent中所有的static相关代码;
  2. 加载Child中所有的static相关代码;
  3. 加载Parent中的普通变量或者普通代码块(又称为构造块、构造代码块);
  4. 加载Parent的构造函数;
  5. 加载Child中的普通变量或者普通代码块(又称为构造块、构造代码块);
  6. 加载Child中的构造函数。

    如果执行多次new对象操作,则从第二次new对象的时候,只会执行3、4、5、6四个步骤。

如果new多个类对象,则只有第一个new对象的时候,会执行上述1中描述的代码初始化,后面new对象的时候,都只会执行2步骤。即:static修饰的静态变量、静态常量、静态代码块,在整个虚拟机生命周期中只会初始化一次

JAVA基础2——类初始化相关执行顺序的更多相关文章

  1. Java 基础:继承中的执行顺序

    1.单独的父类测试 Java中,new一个类的对象,类里面的静态代码块.非静态代码.无参构造方法.有参构造方法.类的一般方法等部分, 它们的执行顺序相对来说比较简单,用程序也很容易验证. 比如新建一个 ...

  2. Java基础-继承-子类与父类执行顺序

    代码 public class Test { public static void main(String[] args) { new Circle(); } } class Draw { publi ...

  3. java初始化块执行顺序

    java中初始化块的执行顺序在构造器之前,多个初始化块之间定义在前的先执行.如下: public class InitialBlockTest { // The first one { System. ...

  4. Java基础-Calendar类常用方法介绍

    Java基础-Calendar类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Calendar类概念 Calendar 类是一个抽象类,它为特定瞬间与一组诸如 Y ...

  5. Java基础-StringBuffer类与StringBuilder类简介

    Java基础-StringBuffer类与StringBuilder类简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.StringBuffer类 在学习过String类之后 ...

  6. 第二十九节:Java基础知识-类,多态,Object,数组和字符串

    前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...

  7. java基础-BigDecimal类常用方法介绍

    java基础-BigDecimal类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.BigDecimal类概述 我们知道浮点数的计算结果是未知的.原因是计算机二进制 ...

  8. java基础-BigInteger类常用方法介绍

    java基础-BigInteger类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.BigInteger类概述 Java中long型为最大整数类型,对于超过long ...

  9. java基础-Arrays类常用方法介绍

    java基础-Arrays类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Array类的概念 此类包含用来操作数组(比如排序和搜索)的各种方法.需要注意,如果指定 ...

随机推荐

  1. jfinal拦截器配置

    实现aop @Before(Tx.class) public void index(){ // renderText("hello world!"); render("/ ...

  2. php7+apache2.4配置

    因为需要搭建一套discuz的程序,所以就扯到了php. 对于php完全没接触过,然后就百度了下php的容器,看到apache可以.机子上刚好有装,就干脆用它了. 测试环境:win10x64+php7 ...

  3. C#连接oracle数据库提示ORA-12154: TNS: 无法解析指定的连接标识符

    C#连接oracle数据库提示ORA-12154: TNS: 无法解析指定的连接标识符如果PLSQL Develope能连接上而用代码无法连接上则可以考虑sqlnet.ora文件中是否有NAMES.D ...

  4. LeetCode 461. Hamming Distance (汉明距离)

    The Hamming distance between two integers is the number of positions at which the corresponding bits ...

  5. JavaScript OOP 之 this指向

    今天给大家分享一个JavaScript OOP中关于分辨this指向对象的小技巧,很实用呦! 我们先来看一段代码: 大家能判断出func();和obj.func();这两句的this指向吗? 首先,我 ...

  6. 06-从零玩转JavaWeb-数组在内存当中的存放形式

    一.JVM的内存划分 想要了解数组的内存存储,先要了解JVM的整体内存划分,详细参见第04JVM内存详解 二.数组在JVM当中的存储详解  假如我们有如下代码: 上面代码当中,创建数组的过程我们可以把 ...

  7. 话说LightningChart是最快最美的图表控件,到底先进在哪里?

    LightningChart Ultimate v.8.2 最新版本新特征告诉你它先进在哪里! 1. Headless 模式 headless模式允许在没有GUI的情况下使用LC.例如,在Window ...

  8. Ignatius and the Princess II

    Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...

  9. AngularJS学习篇(一)

    AngularJS 使用 表达式 把数据绑定到 HTML. AngularJS 表达式 AngularJS 表达式写在双大括号内:{{ expression }}. AngularJS 表达式把数据绑 ...

  10. 获取标签的src属性兼容性

    获取节点如script标签的src属性时,针对非IE6,IE7可以直接使用src属性,但在IE6-7中存在问题,可以借助getAttribute方法 getAttribute(attr,iflag) ...