资讯专栏INFORMATION COLUMN

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

legendmohe / 3177人阅读

摘要:先说结论对于具有继承关系的类,它们的类和对象构造顺序为父类的类构造器子类的类构造器父类成员变量的赋值和实例代码块父类的构造函数子类成员变量的赋值和实例代码块子类的构造函数。类实例块是放在该类构造函数最前面和父类构造函数之后执行的。

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

实验代码如下:

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这个类的一个对象,而要构造这个对象,首先必须把这个类的描述、定义加载进内存(类加载)。因此要先加载这个类(不过此时还未初始化)。
加载完这个类之后,想要构造这个类的对象。但是此时这个类的静态变量还未被初始化,因此要先初始化这个类,但是初始化这个类需要先初始化它的父类,因此此时就变成了,加载父类->初始化父类(调用静态块,即类构造块)
->初始化子类(调用静态块,即类构造块)。
然后就可以构造这个类的对象了,构造这个类的对象之前,要先构造父类对象,因此会先调用父类的构造函数,而调用父类构造函数之前又会先调用父类的实例块。
然后就到了子类构造函数,然而执行之前一样要先调用子类的实例块,最后才是子类的构造函数的函数体。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73403.html

相关文章

  • Java™ 教程(类)

    类 在标题为面向对象的编程概念课程中对面向对象概念的介绍以自行车课为例,以赛车,山地自行车和双人自行车为子类,下面是可能实现Bicycle类的示例代码,为你提供类声明的概述,本课程的后续部分将逐步备份和解释类声明,目前,不要关心细节。 public class Bicycle { // the Bicycle class has // three fields ...

    vvpvvp 评论0 收藏0
  • java基础小记

    摘要:看到的只是,而由泛型附加的类型信息对来说是不可见的。然后再加载执行类的静态变量以及静态语句块。接口中基本数据类型为而抽类象不是的。本地方法接口主要是调用或实现的本地方法及返回结果。用户自定义类加载器,在程序运行期间,通过的子类动态加载。 编译机制  编译主要是把 .Java文件转换为 .class 文件。其中转换后的 .class 文件就包含了元数据,方法信息等一些信息。比如说元数据就...

    ruicbAndroid 评论0 收藏0
  • Java 面向对象(上)

    摘要:对象的引用关键字总是指向调用该方法的对象。根据出现位置的不同,作为对象的默认引用有两种情形。构造器中引用该构造器正在初始化的对象。如果同一个类中包含了两个或两个以上方法的方法名相同,但形参列表不同,则被称为方法重载。 类和对象 定义类 面向对象的程序设计过程中有两个重要概念:类(class)和对象(object,也被称为实例,instance),其中类是某一批对象的抽象,可以把类理解成...

    SimonMa 评论0 收藏0
  • java面向对象(上)

    摘要:根据出现的位置,作为对象的默认引用有两种情形构造器中引用该构造器正在初始化的对象。在构造器中代表该构造器正在初始化的对象。用于限定该对象调用它从父类得到的实例变量和方法。 子类继承父类就可以继承到父类的成员变量和方法。如果访问控制允许,子类实例可以直接调用父类里定义的方法。 如果多个重载的构造器里包含了相同的初始化代码,则可以把这些初始化代码放置在普通代码块里完成,初始化块总在构...

    liaosilzu2007 评论0 收藏0
  • Java 理解面向对象

    摘要:面向对象面向对象的三种基本特征继承封装多态结构化程序设计简介主要原则自顶向下逐步求精模块化。在面向对象方法中,类之间共享属性和操作的机制称为继承。 面向对象 面向对象的三种基本特征:继承、封装、多态 结构化程序设计简介 主要原则:自顶向下、逐步求精、模块化。 结构化分析SA方法对系统进行需求分析;结构化设计SD方法对系统进行概要设计、详细设计;结构化编程SP方法来实现系统。 结构化程序...

    NSFish 评论0 收藏0

发表评论

0条评论

legendmohe

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<