类初始化相关执行顺序

几个概念说明

代码块的含义与作用

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. 2年Java开发工作经验面试总结

    最近换了个公司,从三月底开始面,面到四月底,面了有快二十家公司.我是一个喜欢总结经验的人,每经过一场面试,我在回来的路上都会仔细回想今天哪些问题可以答的更好,或者哪些问题是自己之前没遇到过的,或者是哪 ...

  2. formData 无需form异步上传多个图片

    上周帮其它公司套一下一个web端微信投票系统的后台接口,遇到了一个图片以及视频上传报名的小问题,网上实现方式有很多但都不是ui上面的效果,于是自己动手改造了一个.先来看看效果图 流程很简单,就是点击每 ...

  3. 学习SVG 重点汇总

    什么是SVG? Δ  SVG 指可伸缩矢量图形 (Scalable Vector Graphics) Δ  SVG 用来定义用于网络的基于矢量的图形 Δ  SVG使用XML格式来定义图形 Δ  SVG ...

  4. 队列(存储结构数组)--Java实现

    /*队列:其实也是一种操作受限的线性表 *特点:先进先出 *队尾指针:负责元素的进队 *队头指针:负责元素的出队 *注意:普通队--容易浪费空间,一般队列使用最多的就是循环队列--指针环绕 *队列的实 ...

  5. 实验测试之------创建DBlink,查询远端的yang用户下的abcdedfa表,创建同义词

    --测试环境,20远端,30本地: --准备1,20远端建立表的同义词,用户信息: 1.11 ---------------------------------------------------准备 ...

  6. Linux系统Shell脚本编程

    1. shell脚本概念:C语言编写的.命令解释器.编程语言. 是用户使用linux的桥梁. shell脚本语言非常擅长处理文本类型的数据. 2. shell脚本作用:自动化管理.监控管理.日志数据处 ...

  7. transform 各种影响

    1.提升元素的z-index层级,下面这个例子会让前面的图片显示在上面,一般来说应该是后面的覆盖前面图片的 <img src="mm1" style="-ms-tr ...

  8. 移动端click事件延迟300ms的原因以及解决办法[转载]

    原文:http://www.bubuko.com/infodetail-822565.html 这要追溯至 2007 年初.苹果公司在发布首款 iPhone 前夕,遇到一个问题 —— 当时的网站都是为 ...

  9. 利用canvas 导出图片

    1.使用canvas绘制图片,并将图片导出. 在本地直接访问静态网页时,无法使用toDataURL(),需要将网页发布后,canvas才能使用toDataURL获取画布上的内容.因为canvas不允许 ...

  10. 乐视(LeTV)占用8080端口