Java静态变量 静态代码块 主函数 成员变量 构造代码块 构造函数的执行顺序
2017-10-14 19:18
609 查看
一.static1.静态代码块: 代码在项目启动的时候就执行,这种代码是主动执行的,而且只执行一次。他常用做类属性的初始化。static{}2.静态方法: 在类加载的时候就已经加载,在类名调用时才执行,这种代码是被动执行的。 注意:静态方法里只能调用同类中其他静态成员; 不能以任何方式引用this和super关键字,因为静态方法使用前不需创建任何对象实例,所以就不存在this。3.静态变量: 属于整个类的变量而不是某个对象,任何方法都不能声明static变量。二.类的加载1.什么时候加载类的加载是通过类加载器(Classloader)完成的。两种情况加载类:只要有其它类引用了它就加载;等到类初始化发生的时候才加载。应该跟不同jvm有关 静态加载:new ClassName();编译时就提供 动态加载:Class.forName("ClassName"); 编译时可缺席2.那什么时候初始化 加载完类后类的初始化就会发生,会初始化所有静态成员。4.加载顺序 加载类时初始化顺序:按顺序加载对象的静态属性--->再加载静态代码块--->加载类的主函数 对象实例化时加载顺序:加载对象的非静态属性--->非静态代码块--->构造方法 有父类的情况:加载父类(初始化步骤)-->加载子类(初始化)-->加载父类(实例化)-->加载子类(实例化)
public class Test { public static int k = 0; public static Test t1 = new Test("t1"); public static Test t2 = new Test("t2"); public static int i = print("i"); public static int n = 99; public int j = print("j"); { print("构造块"); } static { print("静态块"); } public Test(String str) { System.out.println((++k) + ":" + str + " i=" + i + 4000 " n=" + n); ++i; ++n; } public static int print(String str) { System.out.println((++k) + ":" + str + " i=" + i + " n=" + n); ++n; return ++i; } public static void main(String args[]) { Test t = new Test("init"); } // 加载顺序 静态变量、成员变量加载,初始化为零。执行顺序 静态变量>静态代码块>主函数(静态方法)>成员变量>构造代码块>构造函数 }* 1.顺序加载类的静态属性(非静态不管) * 这里加载的是:public static int k = 0; * 然后加载:public static StaticTest t1 = new StaticTest("t1"); * 因为此处进行了类的实例化所以 * 1.1加载类的非静态属性 * 这里是:public int j = print("j"); 》》》1:j i=0 n=0 * 1.2顺序加载类中的非static代码块(static暂时不加载) * 这里是:print("构造快");和print("静态块");》》》2:构造快 i=1 n=1
3:静态块 i=2 n=2* 1.3加载类的构造方法 * 这里是:public StaticTest(String str)》》》4:t1 i=3 n=3 (一个静态属性的实例就完成了) * 然后加载:public static StaticTest t2 = new StaticTest("t2"); 因为进行了类的实例化所以重复(1.1-1.3)》》》5:j i=4 n=4
6:构造快 i=5 n=5
7:静态块 i=6 n=6
8:t2 i=7 n=7* 然后加载:public static int i = print("i");》》》9:i i=8 n=8 * 然后加载:public static int n = 99; 注意现在n为99了 * 2.如果有static代码块,在这里先加载,这个里面没有 * 3.加载主函数 * 这里加载的是:StaticTest t = new StaticTest("init"); 因为进行了类的实例化所以重复1.1-1.3》》》10:j i=9 n=99
11:构造快 i=10 n=100
12:静态块 i=11 n=101
13:init i=12 n=102
转载自http://blog.sina.com.cn/s/blog_1552a7b490102w3xk.html
相关文章推荐
- Java普通代码块,构造代码块,静态代码块,成员变量的执行顺序的代码实例
- Java初始化顺序总结及其程序执行过程图- 静态变量、静态代码块、成员变量、构造函数
- 静态变量、静态代码块、变量、代码块、构造函数执行顺序
- 静态代码块、构造代码块和构造函数执行顺序
- Java类中子类和基类的构造代码块,静态代码块、子类构造函数,基类构造函数的执行顺序
- java中的一些执行顺序,代码块,静态,构造,成员。。。。(转的)
- java中成员变量、代码块、构造函数执行顺序
- java子类父类静态代码块 构造代码块 构造函数执行顺序
- java中的静态代码块、构造代码块、构造函数执行顺序
- 构造函数初始化、static代码块初始化、成员变量初始化、以及在子父类中混合的执行顺序实例
- [java起步]构造函数、构造代码快、静态代码块的执行顺序
- 黑马程序员——java中静态代码块、构造代码块、构造函数的执行顺序以及作用
- 关于继承中静态代码块,构造代码块,构造函数执行顺序
- 变量初始化,构造代码块,静态代码块,执行顺序
- Java学习笔记——静态代码块,构造代码块,构造函数间的执行顺序
- 父类,子类,静态属性,静态代码块,构造代码块,构造函数,执行顺序
- Java父类与子类中静态代码块 实例代码块 静态变量 实例变量 构造函数执行顺序
- java成员变量,静态成员变量,静态代码块,代码块和构造函数等加载顺序
- 构造函数、构造代码块、和静态初始化块的执行顺序
- Java初始化顺序总结 - 静态变量、静态代码块、成员变量、构造函数