类加载顺序

若不用new 则只加载静态修饰的内容

静态变量>静态块>mian

public class Father {

    int i;

    static int staticI;

    static {System.out.println("Father 静态代码块1"+" (++staticI)="+(++staticI));}

    {System.out.println("Father 非静态代码块1"+" i="+i+" (++staticI)="+(++staticI));}

    public Father() {System.out.println("Father 构造器");}

    {System.out.println("Father 非静态代码块2"+" i="+i+" (++staticI)="+(++staticI));}

    static {System.out.println("Father 静态代码块2"+" (++staticI)="+(++staticI));}

    public static void main(String[] args) {System.out.println("main 方法"+" (++staticI)="+(++staticI));}

    {System.out.println("Father 非静态代码块3"+" i="+i+" (++staticI)="+(++staticI));}

    static {System.out.println("Father 静态代码块3"+" (++staticI)="+(++staticI));}

}

运行结果

Father 静态代码块1 (++staticI)=1
Father 静态代码块2 (++staticI)=2
Father 静态代码块3 (++staticI)=3
main 方法 (++staticI)=4

静态内容>非静态变量>非静态块>构造器

将main也归纳到静态内容

将上面代码的main改造:

public static void main(String[] args) {
    System.out.println("main 方法"+" (++staticI)="+(++staticI));
    new Father();
}

运行结果

Father 静态代码块1 (++staticI)=1
Father 静态代码块2 (++staticI)=2
Father 静态代码块3 (++staticI)=3
main 方法 (++staticI)=4
Father 非静态代码块1 i=0 (++staticI)=5
Father 非静态代码块2 i=0 (++staticI)=6
Father 非静态代码块3 i=0 (++staticI)=7
Father 构造器

结论

  1. 加载的顺序从上至下
  2. 静态变量>静态块>main>非静态变量>非静态块>构造器

有子类又会咋么样呢?

既然上面已经证明了在遵循加载规则的情况下顺序为从上至下

那么就可以简化代码了

public class CopyOfFather {

    int i;

    static int staticI;

    static {System.out.println("Father 静态代码块1"+" (++staticI)="+(++staticI));}

    {System.out.println("Father 非静态代码块1"+" i="+i+" (++staticI)="+(++staticI));}

    public CopyOfFather() {System.out.println("Father 构造器");}

    public static void main(String[] args) {
        System.out.println("main 方法");
        System.out.println("(++CopyOfSon.staticI)="+(++CopyOfSon.staticI));
    }
}

class CopyOfSon extends CopyOfFather {
    int i;

    static int staticI;

    public CopyOfSon() {System.out.println("Son 构造器");}

    static {System.out.println("Son 静态代码块1"+" (++staticI)="+(++staticI));}

    {System.out.println("Son 非静态代码块1"+" i="+i+" (++staticI)="+(++staticI));}

}

执行结果

Father 静态代码块1 (++staticI)=1
main 方法
Son 静态代码块1 (++staticI)=1
(++CopyOfSon.staticI)=2

结论:父类静态内容>子类静态内容

new 子类会怎么样

改造main:

public static void main(String[] args) {
    System.out.println("main 方法");
    new CopyOfSon();
}

运行结果

Father 静态代码块1 (++staticI)=1
main 方法
Son 静态代码块1 (++staticI)=1
Father 非静态代码块1 i=0 (++staticI)=2
Father 构造器
Son 非静态代码块1 i=0 (++staticI)=2
Son 构造器

结论

此处非静态内容不包括构造器

父类静态内容>子类静态内容>父类非静态内容>父类构造器>子类非静态内容>子类构造器

详细结论

父类静态变量>父类静态代码块>父类main>子类静态变量>子类静态代码块>父类非静态变量>父类非静态代码块>父类构造器>子类非静态变量>子类非静态代码块>子类构造器

请记住:

1.静态>非静态
2.变量>代码块: 先定义变量后在代码块使用
3.构造器在最后

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值