java关于子类继承父类-创建一个子类对象时调用顺序

调用顺序:(这里基于无参构造器,暂且不考虑有参构造器的情况)

1.创建第一个子类对象时:

父类静态块->被调子类静态块->父类动态块->父类无参构造器->被调子类动态块->被调子类无参构造器

这里我定义了一个父类Person,一个子类Student,创建第一个Student对象:


运行结果如下:


这个很容易理解,因为静态块是在类被加载的时候而加载的,因此父类和子类静态块优先被调。接着,在创建对象时,率先调用父类当中的动态块和无参构造器,下来再调用子类的动态块和无参构造器。

2.创建第一个另一子类对象时:

被调子类静态块->父类动态块->父类无参构造器->被调子类动态块->被调子类无参构造器

注意:1.父类静态块只会被调用一次。

          2.这里是“另一子类”,就是与第一个子类不同名的子类。

同样,我定义了另一个子类Teacher,父类与Student相同都是Person,创建第一个Teacher对象:


运行结果如下:


由此可见,父类Person的静态块只被调用一次。

这个也不难理解,由于静态块是随着类的加载而加载,因此,静态块只会在第一次创建对象之前被调用,它是优于对象而存在。

3.创建第二个同名子类对象:

父类动态块->父类无参构造器->被调子类动态块->被调子类无参构造器

创建第二个Student对象x1:


运行结果如下:


显然,同名子类对象在第一次调用之后,其静态块不会再次被调。

为了方便理解,我再次创建了一个Teacher对象t1:

运行结果如下:


总结:

1.不同名子类之间的静态块不会相互调用,也没有任何联系。

2.不同名子类在创建对象之前,如果父类的静态块没有被调用过,那么就先调用父类静态块,此时再看本子类是不是第一次被加载,如果是,那么接着调用本子类静态块;如果在此之前父类静态块已被调用(即父类已被加载过一次),那么将不再调用父类静态块,然后再看是否调用自己的静态块。

猜你喜欢

转载自blog.csdn.net/baidu_38760069/article/details/79915652