Java初始化过程学不会你打我

 

public class Example {
    // 静态变量
    public static int staticVar = 1;
    // 实例变量
    public int instanceVar = 2;

    // 静态初始化块
    static {
        System.out.println("执行静态初始化块");
        staticVar = 3;
    }

    // 实例初始化块
    {
        System.out.println("执行实例初始化块");
        instanceVar = 4;
    }

    // 构造方法
    public Example() {
        System.out.println("执行构造方法");
    }

    public static void main(String[] args) {
        System.out.println("执行main方法");

        Example e1 = new Example();
        Example e2 = new Example();

        System.out.println("e1的静态变量:" + e1.staticVar);
        System.out.println("e1的实例变量:" + e1.instanceVar);
        System.out.println("e2的静态变量:" + e2.staticVar);
        System.out.println("e2的实例变量:" + e2.instanceVar);
    }
}

 执行结果

执行静态初始化块
执行main方法
执行实例初始化块
执行构造方法
执行实例初始化块
执行构造方法
e1的静态变量:3
e1的实例变量:4
e2的静态变量:3
e2的实例变量:4

 从输出结果可以看出,静态初始化块在类加载时执行,只会执行一次,并且优先于实例初始化块和构造方法的执行;实例初始化块在每次创建对象时执行,在构造方法之前执行

 首先加在父类 Sup 静态变量 a =1,然后执行代码块b = 3, 然后 b =2(其实静态变量和静态代码块那个在前面就执行哪个),然后执行子类的静态变量 a = 11,b =22 ,然后加载 Test测试类new 

 Sub  a =6 ,b =9 然后加载到子类 ,执行super(a,b)到父类 执行父类中打印 a和b  1,2 ,执行this.a 把6,9接受,打印a,b  就是  6,9 执行完,返回子类执行 打印,此时 a= 11,b =22 

这时子类父类全部加载完成。返回测试类 执行 sub的打印 a,b 11 ,22 执行 sup的打印 6,9

 首先到父类加载静态变量a = 1,静态代码块b = 3,然后执行静态变量b =2,然后到测试类 new Sub  a=6,b=9  这会到sub中,加载Sbu的构造 a =6,b =9  ,执行下一条语句super(a,b)

打印,a,b  为 0,0 因为这会Sub中 int a =11,b =22,然后打印加载出来的a =1,b =2.

往后执行到this.a = a 这会a =6,b =7 传给this 执行打印 还没有加载所以 sub 的a,b还是0,0

super.a和b 这会是6,9 。

这会执行加载 int a = 11, b =22 ,然后执行Sub构造 中的打印 , 这会 super a =6 b =9,this 的 a=11,b =22. 

作业题

11
0
11
0
11
32

猜你喜欢

转载自blog.csdn.net/pachupingminku/article/details/132560063