零零碎碎的java知识:static属性、普通属性、static代码块、普通代码块、构造函数

本文中结论仅经本机测试,不保证在别的环境下成立。如果有什么不成立的地方务必告诉我_(:_」∠)_

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
原文地址:https://www.cnblogs.com/jennawu/p/8591765.html