JAVA基础2——类初始化相关执行顺序
类初始化相关执行顺序
几个概念说明
代码块的含义与作用
static静态代码块:
- 一般用于初始化类中的静态变量。比如:给静态的数组或者list变量赋初值。使用static静态代码块进行初始化与直接在定义变量的时候初始化效果是一样的。
- static静态代码块其实完全可以看做是一个没有名字、没有参数、没有返回值的静态方法,这个静态方法会在main方法执行前执行,而且是主动执行的,不需要任何显示调用,除此之外它和普通的静态方法没有任何区别。
构造块(又称构造代码块)
- 没有static修饰的代码块;
- 主要用于普通变量的初始化。
类的初始化顺序
在一个独立的类中
优先按照如下的顺序执行初始化:
- 所有static修饰的全局变量(static、static final等)、静态代码块,按照代码顺序从上到下逐个执行一遍。
- 所有普通全局变量、普通代码块(又称为构造块、构造代码块),按照代码顺序从上到下逐个执行一遍。
- 构造函数。
如果new多个类对象,则只有第一个new对象的时候,会执行上述1中描述的代码初始化,后面new对象的时候,都只会执行2、3两个步骤。即:static修饰的静态变量、静态常量、静态代码块,在整个虚拟机生命周期中只会初始化一次。
在子类中
对于子类的初始化,整体原则是优先执行父类的初始化,然后再执行子类的初始化,详细如下:
- 按照从最顶层父类逐层下钻,直到当前要初始化的子类的顺序,先将所有static修饰的全局变量(static、static final等)、静态代码块,按照代码顺序从上到下逐个执行一遍(即先执行父类中所有static相关代码,再执行子类中static相关代码)。
- 按照从最顶层父类逐层下钻,直到当前要初始化的子类的顺序,依次执行上述1个独立类初始化章节中提及的2、3步骤。
举个例子,class Child extends Parent,加载顺序如下:
- 加载Parent中所有的static相关代码;
- 加载Child中所有的static相关代码;
- 加载Parent中的普通变量或者普通代码块(又称为构造块、构造代码块);
- 加载Parent的构造函数;
- 加载Child中的普通变量或者普通代码块(又称为构造块、构造代码块);
- 加载Child中的构造函数。
如果执行多次new对象操作,则从第二次new对象的时候,只会执行3、4、5、6四个步骤。
如果new多个类对象,则只有第一个new对象的时候,会执行上述1中描述的代码初始化,后面new对象的时候,都只会执行2步骤。即:static修饰的静态变量、静态常量、静态代码块,在整个虚拟机生命周期中只会初始化一次。
JAVA基础2——类初始化相关执行顺序的更多相关文章
- Java 基础:继承中的执行顺序
1.单独的父类测试 Java中,new一个类的对象,类里面的静态代码块.非静态代码.无参构造方法.有参构造方法.类的一般方法等部分, 它们的执行顺序相对来说比较简单,用程序也很容易验证. 比如新建一个 ...
- Java基础-继承-子类与父类执行顺序
代码 public class Test { public static void main(String[] args) { new Circle(); } } class Draw { publi ...
- java初始化块执行顺序
java中初始化块的执行顺序在构造器之前,多个初始化块之间定义在前的先执行.如下: public class InitialBlockTest { // The first one { System. ...
- Java基础-Calendar类常用方法介绍
Java基础-Calendar类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Calendar类概念 Calendar 类是一个抽象类,它为特定瞬间与一组诸如 Y ...
- Java基础-StringBuffer类与StringBuilder类简介
Java基础-StringBuffer类与StringBuilder类简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.StringBuffer类 在学习过String类之后 ...
- 第二十九节:Java基础知识-类,多态,Object,数组和字符串
前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...
- java基础-BigDecimal类常用方法介绍
java基础-BigDecimal类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.BigDecimal类概述 我们知道浮点数的计算结果是未知的.原因是计算机二进制 ...
- java基础-BigInteger类常用方法介绍
java基础-BigInteger类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.BigInteger类概述 Java中long型为最大整数类型,对于超过long ...
- java基础-Arrays类常用方法介绍
java基础-Arrays类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Array类的概念 此类包含用来操作数组(比如排序和搜索)的各种方法.需要注意,如果指定 ...
随机推荐
- hdu4821 String
您也可以在我的个人博客中阅读此文章:跳转 题意 一个字符串S 问其中有几个子串能满足以下条件:1.长度为m*l2.可以被分成m个l长的不同的子串问题就变成了如何快速的判断着m个子串是否存在相同的 思路 ...
- IO基础内容(File)
JavaIO基础内容 IO技术概述 Output 把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作 Input 把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操 ...
- C#实现软件开机自启动原理与代码
1.软件自启动原理 软件自启动的原理要从Windows的注册表聊起,在Windows操作系统下,主要有2个文件夹和8个注册表键项控制程序的自启动,这部分的详细介绍可以参看博客http://www.cn ...
- 使用prettytable美化python的print输出
经常碰到需要将一些数据用表格形式输出来.自己手动写太麻烦. 用prettytable能很好解决这个问题. ...(未完)
- Angular服务的5种创建方式
config配置块 Angular应用的运行主要分为两部分:app.config()和app.run(),config是你设置任何的provider的阶段,从而使应用可以使用正确的服务,需要注意的是在 ...
- sqoop1.4.6从mysql导入hdfs\hive\hbase实例
//验证sqoop是否连接到mysql数据库sqoop list-tables --connect 'jdbc:mysql://n1/guizhou_test?useUnicode=true& ...
- Ionic3 启动页以及应用图标
将新的启动页和应用图标图片(最好是高清png)上传到根目录 resources 使用命令自动生成,通过CMD进入项目所在文件夹,分别执行 ionic cordova resources android ...
- Python函数篇:dict函数和列表生成式
1.dict函数语法:dict()dict(**kwarg) dict(mapping, **kwarg) dict(iterable, **kwarg) 第一种:dict()构造一个空字典 h=di ...
- NumPy基础练习(练一遍搞定NumPy)
import numpy as np import pandas as pd from numpy import random from numpy.random import randn ##### ...
- Node闲谈之Buffer
在刚接触Nodejs的时候,有些概念总让学前端的我感到困惑(虽然大学的时候也是在搞后端,世界上最好的语言,you know).我可以很快理解File System,Path等带有明显功能的模块,却一下 ...