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

yizhihongxing

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

相关文章

  • html5的localstorage详解

    HTML5的LocalStorage详解 LocalStorage是HTML5提供的一种在浏览器端存储数据的机制。它可以在浏览器关闭后仍然保留数据,并且可以在同一域名下的不同页面之间共享数据。在本攻略中,我们将详细介绍LocalStorage的使用方法和示例。 使用LocalStorage存储数据 LocalStorage使用键值对的方式存储数据。可以使用J…

    other 2023年10月17日
    00
  • 关于c#中readonly

    readonly是C#中的一个关键字,用于声明只读字段。只读字段是指在声明时必须初始化,并且不能在运行时更改其值。以下是关于C#中readonly的完整攻略。 声明只读字段 要声明只读字段,请使用readonly关键字。以下是一个示例: public class MyClass { public readonly int MyReadOnlyField = …

    other 2023年5月6日
    00
  • nginx按天生成日志文件的简易配置

    nginx按天生成日志文件的简易配置 在Nginx的日志配置中,我们可以指定日志文件的存放位置及文件名称,以及日志记录的格式。但是默认情况下,日志文件是按照大小进行切分的,这样会导致较长时间内的日志集中在一个文件中,难以分析和查询。为了更好地管理日志文件,我们可以将日志文件按照时间进行切分,即每天生成一个新的日志文件。 配置步骤 在 nginx.conf 配…

    其他 2023年3月29日
    00
  • “劲舞团服务器端”配置文件分析

    配置文件分析的目的和意义 在劲舞团游戏中,服务器端的配置文件被用来控制游戏的各种功能和参数。因此,对配置文件进行分析,可以帮助管理员和开发人员理解游戏的内部结构和原理,进而做出相应的优化和改进。 配置文件格式简介 劲舞团服务器端配置文件采用了INI格式,其中每个节(section)表示一个模块,每个键值对(key-value pair)表示一个参数和其对应的…

    other 2023年6月27日
    00
  • 视频网站加速解决方案

    视频网站加速解决方案可以分为以下几个步骤: 步骤一:优化视频文件 使用视频编码器:使用流行的视频编码器(如FFmpeg)对视频进行压缩和编码。压缩视频文件可以大大减小文件大小,从而减少视频传输所需的带宽。 尽可能减少视频时长:将视频保持简洁并控制好长度,这可以加快视频文件的上传和下载速度。例如,在电子商务网站上,对于产品视频介绍,只需展示产品的主要功能和特点…

    other 2023年6月26日
    00
  • ip和端口的相关检测

    IP和端口的相关检测 在网络通信中,我们经常需要检测IP和端口的可用性,以确保网络连接的稳定性和安全性。以下是IP和端口的相关检测的完整攻略。 步骤 以下是IP和端口的相关检测的步骤: 使用ping命令检测IP的可用性。 使用telnet命令检测端口的可用性。 示例 以下是两个示例,演示如何使用ping和telnet命令检测IP和端口的可用性。 示例1:使用…

    other 2023年5月6日
    00
  • php单例模式示例分享

    下面是关于“PHP单例模式示例分享”的完整攻略。 理解单例模式 单例模式是一种设计模式,它保证一个类只有一个实例,并提供一个全局访问该实例的方法。在 PHP 中,单例模式的实现方式包括静态变量和静态方法等。 实现单例模式 以下是一个简单的 PHP 单例模式示例: class Singleton { private static $instance; priv…

    other 2023年6月27日
    00
  • C++实现LeetCode(141.单链表中的环)

    下面我就为您详细讲解“C++实现LeetCode(141.单链表中的环)”的完整攻略。 问题描述 给定一个链表,判断链表中是否有环。 若链表中有环,则返回true,否则返回false。 示例输入与输出: 示例1: 输入: head = [3,2,0,-4], pos = 1 输出: true 解释: 链表中有一个环,其尾部连接到第二个节点。 示例 2: 输入…

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