Java自主学习(三):类的加载顺序

 1.主方法在加载类外时

public class Test05 {
    public static void main(String[] args) {
        System.out.println("main start");
        new StaticInit();
        System.out.println("main end");
    }
}

class StaticInit {
    public static StaticInit si = new StaticInit();
    public StaticInit() {
        System.out.println("constructor");
        m1();
        System.out.println(si);}
    public static void m1() {System.out.println("static method"); }
    { System.out.println("instance block"); }
    static { System.out.println("static"); }
}

/*结果为
main start
instance block
constructor
static method
null
static
instance block
constructor
static method
com.zzxx.test.StaticInit@282ba1e
main end
 */
注:
 1.主方法中 想要new StaticInit(); 先要加载类
 2.加载类:
       再按顺序加载静态成员
      a.先加载si = new StaticInit(); (代码块是在所有构造器执行之前调用)
        在构造方法内部输出si, 此时si还没有赋值成功 所以是null
      b.加载静态方法 - 不会主动执行
      c.加载代码块
 3.new对象: 调用构造器(代码块是在所有构造器执行之前调用)
      在构造方法内部输出si, 此时si已经加载并赋值成功, 所以输入地址

 2.主方法在加载类内时

public class Test06 {
    static { System.out.println("static"); }
    public static Test06 si = new Test06();
    public Test06() {
        System.out.println("constructor");
        m1();
        System.out.println(si);
    }
    public static void m1() {
        System.out.println("static method");
    }
    { System.out.println("instance block"); }
    public static void main(String[] args) {
        System.out.println("main start");
        new Test06();
        System.out.println("main end");
    }
}

/*结果为
 static
instance block
constructor
static method
null
main start
instance block
constructor
static method
com.zzxx.test.Test06@75412c2f
main end
*/

注:主方法要执行, 先要加载Test06类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值