Java初始化顺序
来源:互联网 发布:平板上绘图软件 编辑:程序博客网 时间:2024/04/28 06:35
来自:Java编程思想
了解包括继承在内的初始化全过程,以对所发生的一切有个全局的把握,是很有益的。
请看下例:
package org.easyliu.demo2.inittest;class Insect {private int i = 9;protected int j;Insect() {System.out.println("i = " + i + ", j = " + j);j = 39;}private int p = print("Insect.p initialized");private static int x1 = print("static Insect.x1 initialized");static { System.out.println("static block Insect");}static int print(String s) {System.out.println(s);return 47;}}public class Beetle extends Insect {private int k = print("Beetle.k initialized");public Beetle() {System.out.println("k = " + k);System.out.println("j = " + j);}private static void dd() {System.out.println("dd ");}private static int x2 = print("static Beetle.x2 initialized");static {System.out.println("static block Beetle");}public static void main(String[] args) {System.out.println("Beetle constructor");Beetle b = new Beetle();}}
static Insect.x1 initializedstatic block Insectstatic Beetle.x2 initializedstatic block BeetleBeetle constructorInsect.p initializedi = 9, j = 0Beetle.k initializedk = 47j = 39
分析:
首先当我们运行此程序的时候,主线程启动,所发生的第一件事情就是试图访问Beetle.main()(一个static方法),于是加载器开始查找Beetle.class这个类,找到这个类后,开始加载这个类,在加载的过程发现有extends关键字,所以加载器开始去加载insect.class这个类,(如果在加载这个类的时候如果发现这个类还有基类,那么insect的直接基类就会被加载,如果还有基类,以此类推)此时因为insect没有基类了,所以不需要再加载,此时(加载insect类时)insect类的静态代码将执行(静态成员的初始化x1),所以此时打印出: static Insect.x1 initialized, 然后是static块初始化(Static可以看做一个静态成员,其执行顺序和其在类中申明的顺序有关),所以打印出:static block Insect。当insect的静态代码执行完后, Beetle的静态代码开始执行 (初始化x2), 所以打印出:static Beetle.x2 initialized,然后是static块初始化,所以打印出:static block Beetle;
到现在为止,所有基类以及静态的初始化动作都已经执行完了,可以创建对象了。
这时候执行System.out.println("Beetle constructor");所以打印出:Beetle constructor;
下面开始执行Beetle b = new Beetle();此时首先为Beetle分配内存空间,并且都初始化为0,注意boolean类型变量初始化为false;
在Beetle内的代码执行前,首先会调用基类的构造器,在基类(insect)的构造器内的代码执行前,首先要执行基类的非静态成员的初始化,此时p被初始化为47,并且打印出:Insect.p initialized;当执行初始化后,基类的构造器里的代码System.out.println("i = " + i + ", j = " + j)开始执行,所以打印出:i = 9, j = 0;此时j被初始化为39;
当基类的构造器的代码执行完后,首先要对Beetle类的非静态成员进行显示的初始化,此时K被初始化为47,并且打印出:Beetle.k initialized;等初始化完成后,Beetle构造器里的代码开始执行,所以打印出:K=47;J=39,至此分析完毕!
总结一下初始化顺序:
类的静态成员(static子块也可以看做静态成员,静态成员的初始化顺序由定义的顺序决定)初始化(有父类的先父类,然后自己)->
然后main方法执行->
类初始化{非静态成员的初始化->构造函数(有父类的先父类的非静态成员初始化,然后构造函数)}
下面是框图:
- java-java初始化顺序
- Java初始化顺序
- JAVA 初始化顺序
- JAVA初始化顺序
- Java程序初始化顺序
- Java初始化顺序
- [java]初始化顺序
- java变量初始化顺序
- java 初始化顺序
- Java初始化的顺序
- JAVA对象初始化顺序
- java对象初始化顺序
- JAVA 类初始化顺序
- JAVA初始化顺序
- Java 静态初始化顺序
- Java类初始化顺序
- java初始化顺序
- JAVA初始化顺序
- SensorMananger
- 基于用户的协同过滤推荐算法原理和实现
- 不使用中间变量交换两个变量的值
- Spring实例一
- B、B+树
- Java初始化顺序
- boost智能指针
- Android技术积累:开发规范
- Android源码解析之(四)-->HandlerThread
- linux 信号阻塞和信号未决
- xmpp presence
- 第七天、判断三角形的类型
- Java 和Android 环境变量配置
- 详解C++右值引用