浅谈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日

相关文章

  • 阴阳师式神培养优先级2022新手 阴阳师式神培养优先级2022平民

    阴阳师式神培养优先级2022新手攻略 简介 阴阳师是一款热门的RPG手游,其中式神的培养是玩家们关注的重要方面。在2022年,作为新手玩家,了解式神培养的优先级非常重要。本攻略将详细介绍新手玩家在阴阳师中的式神培养优先级,并提供两个示例说明。 1. 五星式神培养优先级 五星式神是阴阳师中最强力的单位,但培养五星式神需要耗费大量资源。作为新手玩家,建议将重点放…

    other 2023年6月28日
    00
  • windows93下载地址 极客版win93官方下载地址

    很抱歉,但是我必须告诉您,\”Windows93\”并不是一个官方的微软产品,而是一个基于网络的模拟器,旨在模拟Windows 93操作系统的外观和功能。因此,没有官方的下载地址。然而,您可以通过以下步骤访问和使用Windows93模拟器: 打开您的网络浏览器。 在地址栏中输入 \”https://www.windows93.net\”,然后按下回车键。 网…

    other 2023年8月4日
    00
  • C++结构体用法实例分析

    C++结构体用法实例分析 本文将详细介绍C++结构体的用法,并提供两个实例说明。 结构体 结构体是C++中一种用户自定义的数据类型,可以包含多个不同类型的数据成员。其定义方式如下: struct <结构体名称> { <数据类型> <数据成员1>; <数据类型> <数据成员2>; … <数据…

    other 2023年6月27日
    00
  • win7开机自动诊断修复无法进入系统重启无效的故障解决

    问题背景 在使用Windows 7电脑时,有时会遇到开机自动诊断修复无法进入系统重启无效的故障。这种情况下,电脑无法进入Windows系统,用户需要采取一些措施来解决这个问题。 解决方案 步骤一:重启电脑进入自动诊断修复模式 首先,需要重启电脑并进入自动诊断修复模式。具体的步骤如下: 在开机过程中按下F8键,进入启动选项菜单。 在启动选项菜单中选择“修复你的…

    other 2023年6月27日
    00
  • Java使用Thread创建多线程并启动操作示例

    下面是“Java使用Thread创建多线程并启动操作示例”的完整攻略: 1. 基本概念 在介绍如何使用Thread创建多线程并启动之前,我们首先来了解一些基本概念。 Java中的线程是程序执行中的一条执行路径,可以同时执行多个线程实现多个任务的效果。Java中的多线程机制可以通过继承Thread类或实现Runnable接口来实现。 Java中的Thread类…

    other 2023年6月27日
    00
  • WindowsXP系统 CMD常用命令大全

    Windows XP系统CMD常用命令大全 简介 CMD,全称为Windows Command Prompt,是Windows操作系统中的命令行工具,可以在不使用图形化界面的情况下,通过命令来操作系统。本文介绍了Windows XP系统下CMD常用命令,包括常用的文件管理、网络连接、系统配置等命令,方便用户更好地使用Windows XP系统。 常用命令 文件…

    other 2023年6月26日
    00
  • 微信小程序canvas实现刮刮乐效果

    微信小程序canvas实现刮刮乐效果攻略 1. 简介 微信小程序提供了Canvas组件,可以用于绘制图形和实现一些特效。本攻略将详细讲解如何使用Canvas组件实现刮刮乐效果。 2. 实现步骤 2.1 创建Canvas组件 首先,在小程序的页面中创建一个Canvas组件,用于绘制刮刮乐效果。在wxml文件中添加以下代码: <canvas id=\&qu…

    other 2023年7月29日
    00
  • Linux修改fstab文件后 系统无法启动的解决方法

    下面是关于“Linux修改fstab文件后系统无法启动的解决方法”的具体攻略: 问题描述 当我们对Linux系统进行一些配置后,比如挂载新的磁盘、分区等操作,就需要修改fstab文件来使其永久化。但是,如果在修改fstab文件时出现错误,可能就会导致系统无法启动,无法进入操作系统界面。 解决方案 为了解决这个问题,我们可以按照以下步骤进行操作: 1.使用Li…

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