多态:子类与父类构造器调用关系、静态非静态代码块的加载顺序

本文详细探讨了Java中类的加载顺序,包括静态和非静态代码块的执行顺序以及构造器的调用规则。总结了类的加载分为静态部分和非静态部分,静态部分按照顺序执行父类和子类的静态代码块,非静态部分则在构造器中先调用父类构造器再执行子类构造器。无论子类构造器是否有参数,若未显式调用父类有参构造器,都会默认调用父类无参构造器。
摘要由CSDN通过智能技术生成

首先把结论贴出来:

1. 类的加载顺序。

(1) 父类静态代码块(包括静态初始化块,静态属性,但不包括静态方法)

(2) 子类静态代码块(包括静态初始化块,静态属性,但不包括静态方法 )

(3) 父类非静态代码块( 包括非静态初始化块,非静态属性 )

(4) 父类构造函数

(5) 子类非静态代码块 ( 包括非静态初始化块,非静态属性 )

(6) 子类构造函数

Point1:关于静态代码块(包括静态属性的声明和静态的代码块),是严格按照在类中的出现顺序执行的。如果你在前面声明了一个静态属性 static int mm = 1; 那么你可以在这句声明位置之后的静态代码块中引用该属性,如 static { mm += 1}; ,但是绝对不能在声明该静态属性之前引用该属性,否则编译不会通过,而是会报前向引用的错误。

Point2:对于类的非静态代码块(非静态代码块和非静态属性的声明),我们可以简单地将它们全部按照顺序写在该类的所有的构造器方法(不管有参还是无参)的开头,在执行顺序上与P1一样,也是严格按照出现顺序执行的

Point3:根据以上两个结论,对于一个要分析加载顺序的类,可以把它改写成只有两个部分的类,即静态部分和非静态部分。静态部分是将所有的static属性以及static代码块全部按照顺序写在一起,非静态部分则是把非static的属性和非static的代码块全部按照顺序写在所有的构造器方法的最开头。 这样就可以把类的加载顺序合成为:

  1. 父类静态代码块部分
  2. 子类静态代码块部分
  3. 父类构造器
  4. 子类构造器

2. 我们知道,如果调用子类的无参构造器,则会在子类的构造器方法的开头默认调用父类的构造器方法super();那么,如果调用子类的含参构造器方法,是否会调用父类的有参构造器方法或是无参构造器?

答案是:  不管调用的子类构造器方法是有参还是无参的,只要没有在构造器方法的开头显式地写出super(a,b,c)这样调用有参父类构造

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值