子类实体化过程

子类实体化的过程有以下几个步骤:

1.先执行父辈类的静态资源(static 修饰的代码块和属性赋值)在执行子类的静态资源。

2.后执行父类的属性赋值同时执行非静态代码块,然后在执行构造方法

3.最后执行子类的属性赋值同时执行非静态代码块,最后再来执行子类的构造方法

总结如下:

先后顺序:父类的静态资源(包括静态代码和静态属性赋值)-->子类的的静态资源(包括静态代码和静态属性赋值)-->父类的非静态属性赋值和非静态代码块-->父类的构造方法-->子类的非静态属性赋值和非静态代码块-->子类的构造方法

1.父类优先于子类

2.静态优先于非静态

3.属性赋值和代码块同时进行且优先于构造方法

4.优先级相同时,从上往下执行

5.静态资源全局只执行一次

示例:

class Bowl {
    Bowl(int marker) {
        System.out.println("Bowl(" + marker + ")");
    }
}

class Tableware {
    static Bowl bowl7 = new Bowl(7);
    static {
        System.out.println("Tableware静态代码块");
    }
    Tableware() {
        System.out.println("Tableware构造方法");
    }
    Bowl bowl6 = new Bowl(6);
}
class Table extends Tableware {
    {
        System.out.println("Table非静态代码块_1");
    }
    Bowl bowl5 = new Bowl(5);    // 9
    {
        System.out.println("Table非静态代码块_2");
    }
    static Bowl bowl1 = new Bowl(1);
    static {
        System.out.println("Table静态代码块");
    }
    Table() {
        System.out.println("Table构造方法");
    }
    static Bowl bowl2 = new Bowl(2);
}
 
class Cupboard extends Tableware {
    Bowl bowl3 = new Bowl(3);
    static Bowl bowl4 = new Bowl(4);
    Cupboard() {
        System.out.println("Cupboard构造方法");
    }
 
    void otherMethod(int marker) {
        System.out.println("otherMethod(" + marker + ")");
    }
    static Bowl bowl5 = new Bowl(5);
}
public class StaticInitialization {
    public static void main(String args[]) {
        System.out.println("main()");
        cupboard.otherMethod(1);
    }
    static Table table = new Table();
    static Cupboard cupboard = new Cupboard();
}

idea运行结果图如下:

详解如下:

执行该语句 static Table table = new Table();对子类Table进行实例化

1.由于要先执行他父类中的静态资源,所以先执行Tableware中的static Bowl bowl7 = new Bowl(7);对静态属性进行赋值,然后输出–> Bowl(7)

2.优先级相同时,从上往下执行。所以执行父类Tableware中的静态代码块 static {
        System.out.println("Tableware静态代码块");
    }输出-->Tableware静态代码块

3.父类Tableware中的静态资源执行完之后,执行子类Table中的静态资源,从上往下执行,所以执行static Bowl bowl1 = new Bowl(1);,然后输出-->Bowl(1)

4.再执行子类Table中的 静态代码块static {
        System.out.println("Table静态代码块");
    }然后输出-->Table静态代码块

5.然后执行子类的static Bowl bowl2 = new Bowl(2);输出--> Bowl(2)

6.子类中的静态资源执行结束后,执行父类Tableware中的非静态代码块和非静态属性赋值,同样从上往下,所以执行非静态属性赋值Bowl bowl6 = new Bowl(6);输出-->Bowl(6)

7.执行完父类Tableware中的非静态代码块和非静态属性赋值后,执行父类的构造方法Tableware() {
        System.out.println("Tableware构造方法");
    }输出-->Tableware构造方法

8.父类Tableware中的非静态代码块和非静态属性赋值执行完后,执行子类中的非静态代码块和非静态属性赋值, {
        System.out.println("Table非静态代码块_1");
    }输出-->Table非静态代码块_1

9.然后从上往下执行 ,执行非静态属性赋值Bowl bowl5 = new Bowl(5);输出--> Bowl(5)

10.从上往下执行,所以执行  {
        System.out.println("Table非静态代码块_2");
    }非静态代码块,输出-->Table非静态代码块_2

11.执行完子类中的非静态代码块和非静态属性赋值之后,执行子类的构造方法 Table() {
        System.out.println("Table构造方法");
    }输出-->Table构造方法

//到此子类Table的实例化过程完成。开始执行 static Cupboard cupboard = new Cupboard();子类CupBoard的实例化过程,由于是同一个父类,且父类中的静态资源,全局只执行一次,依此类推:

12.执行子类Cupboard的静态资源static Bowl bowl4 = new Bowl(4);输出-->Bowl(4)

13同样的从小往下,然后执行static Bowl bowl5 = new Bowl(5);输出-->Bowl(5)

14.执行完子类中的静态资源,然后开始执行父类的非静态代码块和非静态属性赋值 Bowl bowl6 = new Bowl(6);输出-->Bowl(6)

15.父类的非静态代码块和非静态属性赋值执行完后,开始执行父类的构造方法Tableware() {
        System.out.println("Tableware构造方法");
    }输出-->Tableware构造方法

16父类的构造方法执行完后,执行子类的非静态代码块和非静态属性赋值Bowl bowl3 = new Bowl(3);输出-->Bowl(3)

17子类的非静态代码块和非静态属性赋值执行完后,执行子类的构造方法 Cupboard() {
        System.out.println("Cupboard构造方法");
    }输出-->Cupboard构造方法

//到此为止,子类Cupboard的实例化过程结束,main方法中的静态资源执行完毕,开始执行非静态资源

18.执行main方法中的非静态资源System.out.println("main()");输出main()

19.然后往下执行cupboard.otherMethod(1);调用此方法 void otherMethod(int marker) {
        System.out.println("otherMethod(" + marker + ")");
    }其中marker的值为1,所以输出-->otherMethod(1)

//到此程序执行结束。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值