静态代码块和静态属性的加载

 class B
{
    public static B t1 = new B();
    public static B t2 = new B();

    {
        System.out.println("构造块");

    }
    static
    {
        System.out.println("静态块");
    }


    public static void main(String[] args)
    {
        //它是在静态代码块,静态属性,非静态代码块之后才打印出来的
        //说明是先加载类,再运行的主函数
        System.out.println("1");
        B t = new B();
        System.out.println("12");
    }
}

前几天做这道题 ,很不理解 ,但是想了半天懂了 。

首先在说这个代码的运行过程前,先说一下这道题 需要的 知识点 :
静态代码块和静态属性是 随着类的第一次加载而加载。静态代码块就是对类的一个初始化
普通代码块和属性是 随着每次对象的产生而产生。普通代码块就是对对象的一个初始化
静态代码块和静态属性的优先级一样高,按照顺序加载
创建静态的 当前类 的 类型 的属性 时,默认它是把类已经加载完了(这个很重要)

个人通过DeBug 观察过程 ,发现整个加载过程是这样的:
1.首先,类的加载先按照顺序,先加载静态的 , 静态的属性和方法块的优先级一样高 ,
所以按照顺序先加载 t1 .
2.加载t1的时候,默认 静态代码块 是执行了的,所以不执行静态代码块,接着执行下面的,那么
就有问题了,为什么不去创建t2呢?对的,和静态代码块是一样的,也是 默认 为 这一个静态属性 是已经执行的
3.执行代码块
4.此时 t1已经创建好了,就按照顺序执行,创建t2,同上,认为 这些静态的都执行好了,所以就执行代码块的
5.这个类加载到这时,只有静态代码块没有执行了,就运行它
6.这时,类的加载才结束.我们在主函数创建对象的代码开始执行,因为这个类已经被加载过了,静态不会执行,所以就只执行了代码块
注 : 这道题表面上看好像打破了常规,看起来不是静态的优先级最高,其实不然,要点 就是 在 类里面创建 静态的类型为这个类的属性
的时候,会默认这个类已经加载完成了,用加载完成之后的步骤来创建这个属性.

额外补充一些知识点:
子类要初始化需要先初始化父类
初始化父类是从上往下全部执行,包括空参构造·方法 ,有一点非常重要,就是 如果有方法被重写 , 在父类还被调用了 ,就会用子类的,这也是多态的一种表现
也就是说 初始化 是由 非静态实例变量显示赋值代码和非静态代码块和对应的构造器组成

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值