浅谈Java父子类加载顺序

浅谈Java父子类加载顺序

在Java中,每个类都需要被加载才能被使用。这个过程中,父类和子类的加载顺序会对最终的运行结果产生影响。下面我们来详细讲解Java父子类加载顺序的完整攻略。

1. Java类加载机制

Java类加载器按照从上往下、从父到子的顺序,依次进行类加载:

  1. 引导类加载器:JVM自带的类加载器,主要用来加载Java核心库,比如rt.jar等。
  2. 扩展类加载器(Extension ClassLoader):加载Java的扩展类库,默认加载JAVA_HOME/jre/lib/ext/目下的jar包,也可以用java.ext.dirs系统变量指定。
  3. 应用程序类加载器(Application ClassLoader):加载当前应用的classpath下所有的类。
  4. 自定义类加载器:用户自己定义的类加载器。

类的加载过程包括加载、链接、初始化三个步骤:

  1. 加载(Loading):查找并加载类的二进制数据(.class文件)。加载阶段需要完成以下三件事情:
  2. 通过一个类的全限定名来获取定义该类的二进制字节流。
  3. 将该字节流所代表的静态存储结构转换为方法区的运行时数据结构。
  4. 在Java堆中生成一个代表该类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。
  5. 链接(Linking):将Java类的二进制代码合并到JVM的运行状态之中的过程。
  6. 验证(Verification):确保被加载的类的正确性。
  7. 准备(Preparation):为类的静态变量分配内存,并将其初始化为默认值。
  8. 解析(Resolution):把类中的符号引用转换为直接引用。
  9. 初始化(Initialization):为类的静态变量赋予正确的初始值。

2. Java父子类加载顺序

Java虚拟机会根据类的全限定名称进行类加载,当在父和子类中都找到同一个类时,父子类加载的顺序会对最终的运行结果产生影响,具体可以分为以下两种情况:

2.1 子类中引用父类的静态变量

当子类引用父类的静态变量时,Java虚拟机会先加载父类的静态变量,再加载子类的静态变量。示例如下:

public class Parent {
    public static String name = "Parent";
    static {
        System.out.println("Parent static block");
    }
}

public class Child extends Parent {
    public static String name = "Child";
    static {
        System.out.println("Child static block");
    }
}

public class Test {
    public static void main(String[] args) {
        System.out.println(Child.name);
    }
}

输出结果:

Parent static block
Child static block
Child

可以看到,先输出父类的静态代码块,再输出子类的静态代码块,最后输出子类的静态变量值。

2.2 子类中重写父类的方法

当子类重写父类的方法时,Java虚拟机会优先加载子类的方法。示例如下:

public class Parent {
    public void sayHello() {
        System.out.println("Hello, Parent!");
    }
}

public class Child extends Parent {
    public void sayHello() {
        System.out.println("Hello, Child!");
    }
}

public class Test {
    public static void main(String[] args) {
        Parent p = new Child();
        p.sayHello();
    }
}

输出结果:

Hello, Child!

可以看到,创建子类对象时,会先加载子类的方法,如果子类中重写了父类的方法,则会调用子类的方法,而不是父类的方法。

3. 总结

Java类加载顺序按照从上到下、从父到子的顺序依次加载。当父子类中都含有同一个类时,父子类的加载顺序会影响最终的运行结果。子类的静态变量和父类的静态变量的加载顺序为:先加载父类的静态变量,再加载子类的静态变量。子类重写父类的方法时,Java虚拟机会优先加载子类的方法。

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

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

相关文章

  • ES6新特性七:数组的扩充详解

    ES6新特性七:数组的扩充详解 概述 在ES6中,数组得到了很多的扩充和新增特性,这些特性可以让数组更加灵活和实用。在本篇攻略中,我们将深入了解数组的扩充。 新增的方法 Array.from() Array.from()方法可以将一个类似数组或可迭代对象转换为一个新的数组实例。它还可以接收一个函数作为第二个参数,对浅拷贝的数组进行一些额外的操作。 示例代码:…

    other 2023年6月25日
    00
  • centos所有版本镜像下载地址集合

    CentOS所有版本镜像下载地址集合攻略 CentOS是一种流行的Linux发行版,提供了各种版本的镜像供用户下载。本攻略将详细介绍如何获取CentOS所有版本的镜像下载地址。 步骤一:访问CentOS官方网站 首先,打开浏览器并访问CentOS官方网站:https://www.centos.org/。 步骤二:导航到下载页面 在CentOS官方网站上,找到…

    other 2023年8月4日
    00
  • Android中GridView插件的使用方法

    Android中GridView插件的使用方法攻略 简介 GridView是Android中常用的布局控件之一,它可以以网格形式展示数据,并支持用户交互。本攻略将详细介绍如何在Android中使用GridView插件。 步骤 步骤1:添加GridView到布局文件 首先,在你的布局文件中添加GridView控件。可以使用以下代码示例: <GridVie…

    other 2023年8月26日
    00
  • Mysql计算字段长度函数之CHAR_LENGTH函数

    当我们在使用 MySQL 数据库时,可能需要使用到字符串的长度,MySQL 提供了多个计算字符串长度的函数。其中一个函数就是 CHAR_LENGTH。以下是 CHAR_LENGTH 函数的详细攻略。 CHAR_LENGTH 函数的概述 CHAR_LENGTH 函数用于计算指定字符串中的字符数量,以 Unicode 字符集中的编码计算。即,如果字符串中包含中文…

    other 2023年6月25日
    00
  • Android 夜间模式的实现代码示例

    当实现Android夜间模式时,可以通过以下步骤进行操作: 创建夜间模式资源文件夹:首先,在项目的res目录下创建一个新的资源文件夹,用于存放夜间模式的资源文件。可以将其命名为res-night。 创建夜间模式样式文件:在res-night文件夹下创建一个新的样式文件,例如styles.xml。在该文件中,定义夜间模式下的样式属性,如背景颜色、文字颜色等。以…

    other 2023年9月7日
    00
  • 使用Kotlin开发Android应用的初体验

    使用Kotlin开发Android应用的初体验攻略 1. 安装Kotlin插件和配置开发环境 首先,确保你已经安装了最新版本的Android Studio。然后,按照以下步骤安装Kotlin插件: 打开Android Studio,点击菜单栏的“File”(文件)选项。 选择“Settings”(设置)。 在弹出的对话框中,选择“Plugins”(插件)选项…

    other 2023年7月27日
    00
  • win10nvidiacontainer占用cpu高的处理方法

    win10nvidiacontainer是NVIDIA驱动程序中的一个组件,它负责管理NVIDIA容器。在某些情况下,win10nvidiacontainer可能会占用高CPU,导致系统变慢。下面是两个示例说明如何处理这个问题: 示例一:禁用NVIDIA服务 按下Win + R键,打开运行窗口。 输入services.msc,按下回车键,打开服务管理器。 找…

    other 2023年5月8日
    00
  • SignalR Self Host+MVC等多端消息推送服务(一)

    “SignalR Self Host+MVC等多端消息推送服务(一)”是一篇介绍使用SignalR实现消息推送服务的教程。它包括了从安装SignalR到在MVC网站上实现消息推送的完整过程。 以下是该教程的详细攻略: 第一步:安装SignalR 在开始之前,我们应该下载并安装SignalR,可以通过NuGet包管理器来安装。使用以下命令来安装: Instal…

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