java中具有继承关系的类及其对象初始化顺序

栏目: Java · 发布时间: 5年前

内容简介:先说结论对于具有继承关系的类,它们的类和对象构造顺序为:父类的类构造器() -> 子类的类构造器() -> 父类成员变量的赋值和实例代码块 -> 父类的构造函数 -> 子类成员变量的赋值和实例代码块 -> 子类的构造函数。实验代码如下:

先说结论

对于具有继承关系的类,它们的类和对象构造顺序为:父类的类构造器() -> 子类的类构造器() -> 父类成员变量的赋值和实例代码块 -> 父类的构造函数 -> 子类成员变量的赋值和实例代码块 -> 子类的构造函数。

实验代码如下:

public class ExtensionTest {

    public static void main(String[] args) {
        new SubClass();
    }
}

class SuperClass
{
    {
        System.out.println("我是父类实例块");
    }
    static {
        System.out.println("我是父类类构造块");
    }
    public SuperClass()
    {
        System.out.println("我是父类构造函数块");
    }
}
class SubClass extends SuperClass
{
    {
        System.out.println("我是子类实例块");
    }
    static {
        System.out.println("我是子类类构造块");
    }
    public SubClass()
    {
        System.out.println("我是子类构造函数块");
    }

}

结果:

我是父类类构造块

我是子类类构造块

我是父类实例块

我是父类构造函数块

我是子类实例块

我是子类构造函数块

解释:

类构造块是初始化类的时候执行的,而初始化类首先得加载类(不加载类进内存当然没法初始化)。

类实例块是放在该类构造函数最前面和父类构造函数之后执行的。因为子类的构造函数调用之前,会先调用父类的构造函数。

基于上述两条规则,我们再来看执行顺序。

new SubClass()也就是要构造SubClass这个类的一个对象,而要构造这个对象,首先必须把这个类的描述、定义加载进内存(类加载)。因此要先加载这个类(不过此时还未初始化)。

加载完这个类之后,想要构造这个类的对象。但是此时这个类的静态变量还未被初始化,因此要先初始化这个类,但是初始化这个类需要先初始化它的父类,因此此时就变成了,加载父类->初始化父类(调用静态块,即类构造块)

->初始化子类(调用静态块,即类构造块)。

然后就可以构造这个类的对象了,构造这个类的对象之前,要先构造父类对象,因此会先调用父类的构造函数,而调用父类构造函数之前又会先调用父类的实例块。

然后就到了子类构造函数,然而执行之前一样要先调用子类的实例块,最后才是子类的构造函数的函数体。


以上所述就是小编给大家介绍的《java中具有继承关系的类及其对象初始化顺序》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

我是一只IT小小鸟

我是一只IT小小鸟

胡江堂、李成、唐雅薇、秦琴、蒋宇东、刘未鹏、居振梁、刘帅、温卫斌、张弦、张凯峰、庄表伟、宋劲杉、程露、黄小明、易晓东、简朝阳、林健、高昂、徐宥、辜新星 / 电子工业出版社 / 2009 / 29.80

一群IT小小鸟—— 来自十几所院校,或男生,或女生;或科班,或半路转行。 分布在不同的公司,或外企,或国企,或民企,老板有土有洋。 有失意,有快意;有泪水,有欢笑。在失望中追求希望,在迷茫中辨别方向。 他们用自己的成长故事,告诉在校的师弟师妹们: 青春太宝贵,千万别浪费;要想不浪费,万事早准备。一起来看看 《我是一只IT小小鸟》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试