类加载Demo

3 篇文章 0 订阅

demo1-赋值

public class TestClassLoader {
    public static TestClassLoader classLoader = new TestClassLoader();

    public static int a;

    public static int b = 0;

    public static final int c = 2;

    public static int d = 5;

    public TestClassLoader() {
        a++;
        b++;
        d++;
        System.out.println("instance. a=" + a + ",b=" + b + ",c=" + c + ",d=" + d);
    }

    static {
        System.out.println("static. a=" + a + ",b=" + b + ",c=" + c + ",d=" + d);
        a++;
        b++;
        d = 2;
    }

    public static void main(String[] args) {
        System.out.println("main. a=" + a + ",b=" + b + ",c=" + c + ",d=" + d);
    }
}

demo1结果

 instance. a=1,b=1,c=2,d=1
 static. a=1,b=0,c=2,d=5
 main. a=2,b=1,c=2,d=2

demo1结果分析

  • 准备阶段,classLoader是null,a、b、d被初始化0值,c因为被final修饰,所以被初始化并赋值2
  • 初始化阶段有好几步(先执行构造,再赋初始值)
    先初始化classLoader执行构造函数,a,b,d都被加1,所以instance日志,a=1,b=1,c=2,d=1
    之后给b赋值0,d赋值5,所以static日志,a=1,b=0,c=2,d=5
  • 执行完静态代码块,a被加1,b被加1,d被赋值成2,所以最后main日志,a=2,b=1,c=2,d=2

demo2-执行顺序

public class TestClassLoader2 {

    public static void main(String[] args) {
        B b = new B();
    }
}

class A {
    static {
        System.out.println("父类A静态代码块");
    }
    {
        System.out.println("父类A非静态代码块");
    }
    public A() {
        System.out.println("父类A构造方法");
    }
}

class B extends A {
    static {
        System.out.println("子类B静态代码块");
    }
    {
        System.out.println("子类B非静态代码块");
    }
    public B() {
        System.out.println("子类B构造方法");
    }
}

demo2结果

父类A静态代码块
子类B静态代码块
父类A非静态代码块
父类A构造方法
子类B非静态代码块
子类B构造方法

demo2结果分析

初始化子类(父类会被先初始化)

静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类构造代码块和构造方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李_杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值