init与clinit 与 类的初始化顺序
这两种方法有什么区别呢?
首先:这两个方法一个是虚拟机在装载一个类初始化的时候调用的(clinit)。另一个是在类实例化时调用的(init)
首先说说类的初始化:
在Java代码中,一个正确的初始值是通过类变量初始化语句或者静态初始化语句给出的。一个类变量初始化语句是
变量声明后的等号和表达式:
- class Example {
- static int size = 3 * (int) (Math.random() * 5.0);
- }
静态初始化语句是一个以static开头的语句块:
- class Example{
- static int size;
- static {
- size = 3 * (int) (Math.random() * 5.0);
- }
- }
所有的类变量初始化语句和类型的静态初始化语句都被Java编译器收集到了一起,放在一个特殊的方法中。这个方法就是<clinit>
我们在来看看<init>这个方法:
<init>方法是在一个类进行对象实例化时调用的。实例化一个类有四种途径:调用new操作符;调用Class或java.lang.reflect.Constructor对象的newInstance()方法;调用任何现有对象的clone()方法;通过java.io.ObjectInputStream类的getObject()方法反序列化。
Java编译器会为它的每一个类都至少生成一个实例初始化方法。在Class文件中,被称为"<init>"
现在知道了吧, 一个是用于初始化静态的类变量, 一个是初始化实例变量!
<init>
与<clinit>
<init>
Java在编译之后会在字节码文件中生成<init>
方法,称之为实例构造器,该实例构造器会将语句块,变量初始化,调用父类的构造器等操作收敛到<init>
方法中,收敛顺序(这里只讨论非静态变量和语句块)为:
1. 父类变量初始化
2. 父类语句块
3. 父类构造函数
4. 子类变量初始化
5. 子类语句块
6. 子类构造函数
所谓收敛到<init>
方法中的意思就是,将这些操作放入到<init>
中去执行
<clinit>
Java在编译之后会在字节码文件中生成<clinit>
方法,称之为类构造器,类构造器同实例构造器一样,也会将静态语句块,静态变量初始化,收敛到<clinit>
方法中,收敛顺序为:
1. 父类静态变量初始化
2. 父类静态语句块
3. 子类静态变量初始化
4. 子类静态语句块
<clinit>
方法是在类加载过程中执行的,而<init>
是在对象实例化执行的,所以<clinit>
一定比<init>
先执行。所以整个顺序就是:
1. 父类静态变量初始化
2. 父类静态语句块
3. 子类静态变量初始化
4. 子类静态语句块
5. 父类变量初始化
6. 父类语句块
7. 父类构造函数
8. 子类变量初始化
9. 子类语句块
10. 子类构造函数
初始化顺序
如下父类代码
public class Parent {static int a = 1;int b = 1;static {System.out.println("parent static block(a):" + (++a));}{System.out.println("parent block(b):" + (++b));}public Parent() {System.out.println("parent construction");}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
子类代码
public class Child extends Parent {static int a = 1;int b = 1;static {System.out.println("child static block(a):" + (++a));}{System.out.println("child block(b):" + (++b));}public Child() {System.out.println("child construction");}public static void main(String[] args) {new Child();}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
最终输出结果为
parent static block(a):2
child static block(a):2
parent block(b):2
parent construction
child block(b):2
child construction
- 1
- 2
- 3
- 4
- 5
- 6
init与clinit 与 类的初始化顺序相关推荐
- java类成员初始化_简单了解Java类成员初始化顺序
这篇文章主要介绍了简单了解Java类成员初始化顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 类中包含7中成员: 1.静态变量 static 2 ...
- java 初始化参数_JAVA类的初始化顺序与initialize参数
JAVA类的初始化顺序依次是:(静态变量.静态初始化块)->(变量.初始化块)->构造函数, 相同级别的以定义顺序为准, 且静态变量和静态初始化块只初始化一次.通过下面的代码来验证. p ...
- Java 类的初始化顺序
Java 类的初始化顺序 Java中类的初始化顺序是:父类静态代码块-->子类静态代码块-->父类非静态代码块-->父类构造器-->子类非静态代码块-->子类构造器. 测 ...
- Java类的初始化顺序
对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是(静态变量.静态初始化块)>(变量.初始化块)>构造器. 初始化顺序图示: 我们也可以通过下面的测试代码来验证这一 ...
- Java的,与类的初始化顺序
转载自 https://blog.csdn.net/sujz12345/article/details/52590095 <init>与<clinit> <init> ...
- java基础之——类的初始化顺序(转载)
原文地址:http://www.cnblogs.com/chrischennx/p/3612295.html 由浅入深,首先,我们来看一下,一个类初始化有关的都有些啥米: 静态成员变量.静态代码块.普 ...
- Java类的初始化顺序 (静态变量、静态初始化块、变量、初始...
很有意思的一篇文章 1.没有继承 静态变量->静态初始化块->变量->变量初始化块->构造方法 2.有继承的情况 父类静态变量->父类静态初始化块->子类静态变量- ...
- java类初始化顺序_Java 类的初始化顺序
静态代码块:用staitc声明,jvm加载类时执行,仅执行一次 构造代码块:类中直接用{}定义,每一次创建对象时执行 执行顺序优先级:静态块,main(),构造块,构造方法 1. 构造函数 publi ...
- java 面试题解惑一 类的初始化顺序
大家在去参加面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量,构造器里可能还有一段代码对变量值进行了某种运算,另外还有一些将变量值输出到控制台 ...
- android 初始化类,Android 常用编程技巧/Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造器)...
1.设置屏幕的亮度: WindowManager.LayoutParams lp=getWindow().getAttributes(); lp.screenBrightness=1.0f; getW ...
最新文章
- 【收集】Web开发工具
- Python高阶函数(map,reduce,filter)
- docker进阶 一键安装wordpress
- EOS从入门到精通-账户体系(文字稿)
- Git / git clone 、git pull 和 git fetch
- 7-4 递增序列 (15 分)
- div+css布局必了解的列表元素ul ol li dl dt dd详解
- 开发必备知识点--django项目启动时,url加载之前,执行某个.py文件
- NET报表工具 EastReport
- 微软发布Visual Studio 2010 SP1公测版
- SQL LIKE通配符 模糊查询
- 餐厅扫码点餐系统源码 外卖订餐小程序源码
- 汽车电工及电子技术基础【3】
- 常见文件文件头文件尾格式总结及各类文件头
- 海外侨胞代表建议广东各市抱团出海开设名优特产品实体店
- 【破解三网】iphone5 国行 A1429
- Linux学习3 :用户及文件权限管理
- JVM内存管理及垃圾回收
- Python+PIL 轻松制作九宫格图片
- python如何提取数据中的年月_Python数据处理笔记——Pandas时间数据提取处理
热门文章
- 在iMac上如何轻松去掉程序坞中最近打开过的应用--小技巧
- 人人都可以用Mac--安装和卸载应用软件
- 系统引导管理 之 以WinGrub 引导安装Fedora 4.0 为例,详述用WinGrub来引导Linux的安装...
- centos7系统搭建DNS服务器
- 关于scala中lazy val的几个注意事项
- 思科将技术团队拆分为四块:安全、物联网、云与网络
- 每个Java开发者应该知道(并爱上)的8个工具
- 「leetcode」39. 组合总和【回溯算法】详解!
- poj japan 数状数组解决逆序数
- 如何在 iPhone 和 iPad 上使用与你共享?