浅谈Java中父类与子类的加载顺序详解

浅谈Java中父类与子类的加载顺序详解

在Java中,当我们定义了一个类时,JVM会按照一定的顺序进行类的加载。这个加载的过程中包含了类的初始化、父子类的加载、静态成员变量的赋值等内容。父类与子类的加载顺序是其中一项比较重要的内容。下面我们就来详细讲解一下Java中父类与子类的加载顺序。

父类的加载顺序

父类的加载顺序总是在子类之前。当我们定义一个子类时,如果没有明确指定父类,则默认继承Object类。父类的加载顺序依次为:

  1. 加载父类的静态变量,包括静态方法;
  2. 父类初始化;
  3. 子类加载。

例如,我们有如下的父类:

public class Parent {
    public static String parentStr = "Parent static variable";
    static {
        System.out.println(parentStr);
        System.out.println("Parent static code block!");
    }
    public Parent() {
        System.out.println("Parent constructor!");
    }
}

当我们定义一个子类并实例化时,父类的静态变量和静态代码块会最先被加载执行,并依次输出"Parent static variable"和"Parent static code block!"。随后进行父类的初始化,输出"Parent constructor!"。最后进行子类的加载、初始化等操作。

子类的加载顺序

子类在继承了父类之后,会在父类初始化完成之后进行加载。子类的加载顺序依次为:

  1. 加载子类的静态变量,包括静态方法;
  2. 子类初始化。

例如,我们有如下的子类:

public class Child extends Parent {
    public static String childStr = "Child static variable";
    static {
        System.out.println(childStr);
        System.out.println("Child static code block!");
    }
    public Child() {
        System.out.println("Child constructor!");
    }
}

当我们实例化子类时,首先会加载子类的静态变量和静态代码块,依次输出"Child static variable"和"Child static code block!"。随后进行子类的初始化,输出"Child constructor!"。

需要注意的是,如果我们定义了多层的继承关系,那么类的加载顺序同样遵循父类优先的原则。

示例说明

接下来,我们来看一下具体的示例说明。

示例一

public class Parent {
    public static String parentStr = "Parent static variable";
    static {
        System.out.println(parentStr);
        System.out.println("Parent static code block!");
    }
    public Parent() {
        System.out.println("Parent constructor!");
    }
}

public class Child extends Parent {
    public static String childStr = "Child static variable";
    static {
        System.out.println(childStr);
        System.out.println("Child static code block!");
    }
    public Child() {
        System.out.println("Child constructor!");
    }
}

public class TestClass {
    public static void main(String[] args) {
        Child child = new Child();
    }
}

运行以上的代码,输出如下:

Parent static variable
Parent static code block!
Parent constructor!
Child static variable
Child static code block!
Child constructor!

从输出结果中可以看出,先执行了父类的静态变量和静态代码块,输出"Parent static variable"和"Parent static code block!",然后进行了父类的初始化,输出"Parent constructor!"。随后执行了子类的静态变量和静态代码块,输出"Child static variable"和"Child static code block!",然后进行了子类的初始化,输出"Child constructor!"。

示例二

public class Parent {
    public static String parentStr = "Parent static variable";
    static {
        System.out.println(parentStr);
        System.out.println("Parent static code block!");
    }
    public Parent() {
        System.out.println("Parent constructor!");
    }
}

public class Child extends Parent {
    public static String childStr = "Child static variable";
    public static void print() {
        System.out.println("Child static method!");
    }
    static {
        System.out.println(childStr);
        System.out.println("Child static code block!");
    }
    public Child() {
        System.out.println("Child constructor!");
        print();
    }
}

public class TestClass {
    public static void main(String[] args) {
        new Child();
    }
}

运行以上的代码,输出如下:

Parent static variable
Parent static code block!
Parent constructor!
Child static variable
Child static code block!
Child constructor!
Child static method!

从输出结果中可以看出,先执行了父类的静态变量和静态代码块,输出"Parent static variable"和"Parent static code block!",然后进行了父类的初始化,输出"Parent constructor!"。随后执行了子类的静态变量和静态代码块,输出"Child static variable"和"Child static code block!",然后进行了子类的初始化,输出"Child constructor!"。子类的构造方法print()输出"Child static method!"。

结论

在Java中,父类总是先于子类进行加载。父类的静态变量和静态代码块会最先被加载执行,然后进行父类的初始化,最后进行子类的加载、静态变量和代码块的加载、子类的初始化。需要注意的是,子类的构造方法也是在它的静态方法和静态代码块执行完之后才会执行。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈Java中父类与子类的加载顺序详解 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • Linux文件系统中的inode节点详细介绍

    介绍 在Linux文件系统中,inode是指索引节点(index node),每个文件或目录都有一个对应的inode,用于标识文件或目录的元数据信息。使用inode可以描述Linux文件系统的基本组织和结构,包括了文件的创建时间、访问时间、修改时间、权限等。 inode节点结构 inode是一个由固定大小的记忆体所组成的数组,通常存放在文件系统的数据区。每个…

    other 2023年6月26日
    00
  • QT开发应用程序的欢迎界面实例

    非常高兴能为你讲解“QT开发应用程序的欢迎界面实例”的完整攻略。 开发应用程序时,欢迎界面是非常重要的。它是用户界面的第一印象,可以吸引用户的注意力,提高用户体验。本攻略将向你展示如何使用QT框架创建一个漂亮的欢迎界面。 一、创建项目 1.新建一个QtWidgets应用程序项目。 2.在新项目向导的“项目配置”页面,勾选“创建欢迎界面”选项,并指定其为“Ma…

    other 2023年6月25日
    00
  • r语言igraph包-构建网络图

    R语言igraph包-构建网络图 igraph是一个用于分析和可视化复杂网络的R语言包。它提供了一系列的函数和工具,可以用于构建、分析和可视化各种类型的网络图。本文将提供一个完整的攻略,介绍igraph包的基础知识,并提供两个示例说明。 igraph包基础 igraph包的基础知识包括以下内容: 节点和边:igraph包中的网络图由节点和边组成。节点可以是任…

    other 2023年5月8日
    00
  • rasrc4aes加密md5

    以下是关于RSA、RC4、AES加密和MD5哈希算法的完整攻略,包括算法原理、加密过程、示例说明等。 1. RSA加密算法 RSA加密算法是一种公钥加密法,它使用一对公钥和私钥来进行加密和解密操作。以下是RSA加密算法加密过程: 密钥:生成一对公钥和私钥。 加密:使用公钥对明文进行加密。 解密:使用私钥对密文进行解密。 以下是一个使用RSA加密算的示例说明:…

    other 2023年5月7日
    00
  • win10提示taskmgr.exe文件系统错误1073741792代码怎么办?

    当遇到Windows 10提示“taskmgr.exe文件系统错误1073741792代码”的问题时,可以尝试下面的方法进行解决。 1. 运行SFC扫描 打开CMD命令行工具,以管理员身份运行。输入以下命令并按回车键: sfc /scannow SFC命令是系统文件检查器,用于扫描和修复Windows操作系统中的损坏文件。该命令需要一些时间来完成。完成后,重…

    other 2023年6月27日
    00
  • ajax异步加载图片实例分析

    针对“ajax异步加载图片实例分析”的完整攻略,我将分为以下几个方面进行讲解: ajax异步加载图片的方式和原理 ajax异步加载图片的实现代码 ajax异步加载图片的应用实例 ajax异步加载图片的方式和原理 ajax(异步JavaScript和XML)技术是基于JavaScript和XML的一种异步数据交互技术,可以实现页面的异步无刷新加载。在实现异步加…

    other 2023年6月25日
    00
  • Shell命令之数组表示语法学习

    Shell命令之数组表示语法学习 1. 数组的定义 数组是一种特殊的变量,它包含了多个元素,每个元素可以存储一个值。在Shell中定义数组的语法格式如下: 数组名=(元素1 元素2 ……) 其中,数组名是用户任意定义的名称,元素可以是数字、文本或其他Shell变量。定义数组时,元素之间用空格分隔。 例如,我们可以定义一个包含5个元素的数组: fruit=(&…

    other 2023年6月25日
    00
  • Vue验证用户名是否可用的方法

    下面是关于“Vue验证用户名是否可用的方法”的完整攻略: 需求 在Vue中验证用户名是否可用,如果当前用户名已经被使用,显示提示信息。 方法 1.在模板中添加校验规则 首先,在模板中添加校验规则,并通过v-model指令绑定数据。比如用input元素来输入用户名,然后使用v-model绑定一个名为username的数据: <template> &…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部