对象的初始化过程

class Test
{
    int num = 8;
    static  //静态代码块
    {
        System.out.println("静态代码");
    }
    {   //构造代码块
        System.out.println(num);
    }
    public Test(int num)  // 构造方法
    {
        this.num = num;
    }
}
class TestDemo
{
    public static void main(String[] args)
    {
        Test t = new Test(3);
        System.out.println(t.num);
    }
}

输出结果:
   静态代码
   8
   3

Test t = new Test(3);这句话都干了什么

1、new用到Test.class,先找到Test.class文件并加载到内存中 (若如上num在类中静态初始化,则num的值初始化为8,则下文的默认初始化就没了)

2、执行该类的静态代码块(静态的成员随类加载而执行)

3、在堆内存中开辟内存空间,分配内存地址,并在栈中创建变量p。

4、在堆内存中建立对象的特有属性,并进行默认初始化。

5、对属性进行显示初始化(即用语句对变量进行的初始化,这里指上句中的3)

6、对对象的构造代码段初始化。

7、对对象的对应构造函数初始化。

8、将内存地址赋给内存中的变量。

这也可以解释为什么静态方法不能调用非静态成员了

注意:静态的成员是按语句顺序进行执行的,若代码如下: 

1 static
2 {
3     System.out.println("静态代码"+num);
4 }
5 static int num = 8;

则会出现非法向上引用的错误

原文地址:https://www.cnblogs.com/fantasy01/p/3572530.html