浅谈Java父子类加载顺序

yizhihongxing

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

相关文章

  • react-router-domV6嵌套路由实现详解

    React Router Dom V6 嵌套路由实现详解 React Router Dom 是一个用于在 React 应用中实现路由功能的库。它提供了一组组件,用于管理应用的不同页面和路由之间的导航。 在 React Router Dom V6 中,嵌套路由是一种常见的技术,用于在一个页面中嵌套显示其他页面。这种技术可以帮助我们构建复杂的应用程序布局,并使页…

    other 2023年7月28日
    00
  • android 之Spinner下拉菜单实现级联

    Android之Spinner下拉菜单实现级联攻略 在Android开发中,Spinner是一种常用的下拉菜单控件。实现级联的Spinner可以根据前一个Spinner的选择,动态改变后一个Spinner的选项。下面是实现级联Spinner的完整攻略。 步骤一:准备数据源 首先,我们需要准备两个Spinner的数据源。假设我们要实现一个级联选择省份和城市的功…

    other 2023年9月7日
    00
  • matlab实现高斯滤波

    当然,我可以为您提供有关“Matlab实现高斯滤波”的完整攻略,以下是详细说明: 什么是高斯滤波? 高斯滤波是一种线性平滑滤波器,它可以有效地去除图中的噪,同时保留图像的边缘信息。高斯滤波器的核心思想是使用高斯函数作为滤波器的卷积,对像进行卷积运算,从而实平滑滤波的效果。 Matlab实现高斯滤波 以下是Matlab实现高斯滤波基本步骤: 读取图像 matl…

    other 2023年5月7日
    00
  • dat文件用什么软件打开

    打开.dat文件需要以下两个步骤: 确定.dat文件的类型 选择使用合适的应用程序打开它 下面,我将详细讲解每个步骤。 第一步:确定.dat文件类型 .dat文件没有严格的文件类型,因此需要确定文件类型才能选择正确的应用程序打开它。 以下是一些常见的.dat文件类型: 数据库文件,例如Winmail.dat、Chrome Cookie文件等 游戏数据文件,例…

    其他 2023年4月16日
    00
  • javascript操作字符串的原生方法

    当我们在处理字符串时,经常需要使用一些函数。在JavaScript中,字符串是不可变的变量。这意味着一旦创建了一串字符串,您将无法更改其中任何一部分。但是,可以使用JavaScript中的许多原生字符串函数来转换,截取和重组字符串。 1. 字符串方法 字符串对象具有许多内置方法,用于字符串的处理。下面我们介绍一些常用的字符串方法: a. 字符串截取 slic…

    other 2023年6月20日
    00
  • Git操作规范之tag的使用技巧详解

    Git操作规范之tag的使用技巧详解 什么是tag? 在Git中,tag是用来标记特定的提交(commit)的。它可以用来标识项目的重要节点,如版本发布、里程碑等。使用tag可以方便地在代码库中找到特定的提交,也可以用来发布稳定的版本。 如何创建tag? 创建tag非常简单,只需使用git tag命令即可。以下是创建tag的步骤: 首先,确保你在要打tag的…

    other 2023年8月3日
    00
  • 前端JavaScript中的class类

    前端JavaScript中的class类 JavaScript中的class类是一种近年来新增的、用于实现面向对象编程(OOP)的语法。OOP是一种封装数据和行为的编程思想,它可以更容易地管理代码和提高代码的复用性。 基本语法 类声明和其他声明很相似。我们使用class关键字开头,后面接类名。类名的首字母要大写。然后我们用一对花括号{}来描述类的块。在花括号…

    other 2023年6月26日
    00
  • 使用ffmpeg的gpu加速视频处理

    以下是关于如何使用FFmpeg的GPU加速视频处理的完整攻略,包括基本知识和两个示例。 基本知识 FFmpeg是一个开源的平视频和音频处理工具,可以用于转换、编辑、压缩和解码视频和音频文件。FFmpeg支持使用GPU加速进行,可以大大提高视频处理的速度。 在使用FFmpeg进行GPU加速视频处理时,需要使用支持GPU加速的编解码器和镜。常用的支持GPU加速的…

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