本文中结论仅经本机测试,不保证在别的环境下成立。如果有什么不成立的地方务必告诉我_(:_」∠)_
java的内存是动态分配的,其机制和c/c++相当不一样……emmm在此不表。
static:
·static属性:每个类只分配一次内存,构造(new)类的对象、调用类的static方法、调用类的static属性时分配内存。
·static代码块:每个类只执行一次,构造(new)类的对象、调用类的static方法、调用类的static属性时(对,和static属性条件一样)时执行。
·在上述条件下,按照在类中书写顺序依次执行代码块中代码/为属性分配内存。
普通:
·普通属性:构造(new)类的对象时分配内存。
·普通代码块:构造(new)类的对象时按照类中代码块的书写顺序执行。
第一次构造(new)类的对象时,各活动执行顺序为:先static,后普通,最后构造函数。
其实不用知道得这么细致的……只是习惯性地好奇了一下。
测试代码(无视丑陋的格式吧):
1 class Hello{ 2 static int i = 0; 3 4 Hello(){ 5 System.out.println("hello " + (++i)); 6 } 7 } 8 9 class HelloWrapper{ 10 { 11 System.out.println("block 1"); 12 } 13 static { 14 System.out.println("static block 1"); 15 } 16 static Hello h = new Hello(); 17 private Hello h2 = new Hello(); 18 static { 19 System.out.println("static block 2"); 20 } 21 HelloWrapper(){ 22 System.out.println("construct"); 23 } 24 { 25 System.out.println("block 2"); 26 } 27 } 28 29 public class Test { 30 31 public static void main(String[] args) { 32 HelloWrapper hw = new HelloWrapper(); 33 } 34 }
输出:
static block 1 hello 1 static block 2 block 1 hello 2 block 2 construct