Java中类的加载顺序执行结果

Java中类的加载顺序执行结果在类的实例化时非常重要,正确的理解和使用可以避免程序出现各种问题。以下是完整的攻略:

类的加载过程

首先,当程序需要使用某个类时,Java虚拟机会首先在内存中查找该类是否已经被加载(被其他类引用时可能已经被加载),如果没有被加载则开始类的加载过程。

类的加载过程分为以下几个步骤:

  1. 加载:虚拟机通过ClassLoader类加载器读取class文件中的二进制数据,并转化为相应的格式,然后在内存中生成对应的Class对象。
  2. 验证:虚拟机对加载的类进行验证,包括语法验证、字节码验证、符号属性验证、类引用验证。
  3. 准备:虚拟机为类的静态变量分配并初始化默认值(零值),如int类型的默认值为0,对象类型的默认值为null。
  4. 解析:虚拟机将类中的符号引用转化为直接引用,包括类、接口、字段、方法等。
  5. 初始化:执行类的静态代码块和静态变量赋值操作,初始化过程只会执行一次,即第一次实例化或第一次访问静态成员时。

类的加载顺序执行结果

了解了类的加载过程,接下来考虑类的加载顺序执行结果。类的加载顺序分为了以下四个阶段:

  1. 父类静态代码块和静态变量赋值操作:如果当前类有父类,先执行父类的静态代码块和静态变量赋值操作。
  2. 当前类的静态代码块和静态变量赋值操作:执行当前类的静态代码块和静态变量赋值操作。
  3. 父类实例变量赋值操作和构造函数:如果当前类有父类,则执行父类的实例变量赋值操作和构造函数。
  4. 当前类实例变量赋值操作和构造函数:执行当前类的实例变量赋值操作和构造函数。

根据上述的类的加载顺序,我们可以进行以下两个示例说明:

示例一:

public class SuperClass {
    static {
        System.out.println("SuperClass init!");
    }

    public static int value = 123;
}

public class SubClass extends SuperClass {
    static {
        System.out.println("SubClass init!");
    }
}

public class Main {
    public static void main(String[] args) {
        System.out.println(SubClass.value);
    }
}

输出结果如下:

SuperClass init!
123

分析:在执行SubClass.value时,由于SubClass并没有被实例化,因此不会触发SubClass的初始化过程。而此时虚拟机会静态查询类的常量,由于value是一个编译期常量,因此不会触发SuperClass的初始化过程。因此只会执行SuperClass的静态代码块和静态变量赋值操作,输出“SuperClass init!”和“123”。

示例二:

public class SuperClass {
    static {
        System.out.println("SuperClass init!");
    }

    public static int value = 123;
}

public class SubClass extends SuperClass {
    static {
        System.out.println("SubClass init!");
    }

    public static int value = 456;
}

public class Main {
    public static void main(String[] args) {
        System.out.println(SubClass.value);
    }
}

输出结果如下:

SuperClass init!
SubClass init!
456

分析:在执行SubClass.value时,由于SubClass并没有被实例化,因此不会触发SubClass的初始化过程。由于value并不是一个编译期常量,因此会触发SuperClass的初始化过程。因此先执行SuperClass的静态代码块和静态变量赋值操作,输出“SuperClass init!”和“123”。接着执行SubClass的静态代码块和静态变量赋值操作,输出“SubClass init!”和“456”。最后输出SubClass.value的值,即“456”。

总结

了解类的加载过程和加载顺序能够帮助我们更好地理解Java程序的执行过程,以及在实际编程中如何避免出现各种问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中类的加载顺序执行结果 - Python技术站

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

相关文章

  • PHP中函数内引用全局变量的方法

    在PHP中,要在函数内引用全局变量,可以使用global关键字或者$GLOBALS超全局变量。下面是详细的攻略: 使用global关键字: 在函数内部,使用global关键字声明要引用的全局变量。 在函数内部使用该全局变量时,不需要使用$符号。 修改函数内部的全局变量会影响到全局作用域。 示例代码如下: “`php $globalVar = 10; fun…

    other 2023年7月29日
    00
  • Android BannerView通用封装详解

    Android BannerView通用封装详解 概述 BannerView 是一种常见的 Android 控件,它可以轮播显示一组图片或文本。为了方便开发者使用,我们可以对 BannerView 进行封装,实现通用的轮播控件,方便在不同的项目中使用。 本文将详细介绍如何封装一个 Android BannerView,并提供两个示例说明。 实现 布局文件 首…

    other 2023年6月25日
    00
  • python将两个数组合并成一个数组 多维数组变成一维数组

    Python将两个数组合并成一个数组 多维数组变成一维数组 在Python中,将两个数组合并成一个数组和将多维数组变成一维数组是常见的操作。本文将介绍两种常见的方法来解决这两个问题。 将两个数组合并成一个数组 方法一:使用”+”操作符 在Python中,可以使用”+”操作符将两个数组合并成一个数组。例如: a = [1, 2, 3] b = [4, 5, 6…

    其他 2023年3月28日
    00
  • jenkins忘记密码解决方案

    Jenkins忘记密码解决方案 Jenkins是一个流行的持续集成和交付工具,但是有时候我们忘记了管理员账户密码,该如何重置密码呢?本文将会介绍两种解决方案。 方案一:通过jenkins-cli重置密码 下载并安装jenkins-cli 打开终端并输入以下命令: bash java -jar jenkins-cli.jar -s http://jenkins…

    其他 2023年3月29日
    00
  • Mybatis中ResultMap解决属性名和数据库字段名不一致问题

    Mybatis中的ResultMap是用于解决属性名和数据库字段名不一致问题的重要工具。它允许我们自定义Java对象属性和数据库表字段之间的映射关系,并通过这种方式来解决名称不匹配的问题。下面是在Mybatis中使用ResultMap的步骤和示例。 第一步:定义ResultMap要定义一个ResultMap,可以在mapper.xml文件中使用<res…

    other 2023年6月25日
    00
  • .Net多进程通信共享内存映射文件Memory Mapped

    .NET多进程通信共享内存映射文件(Memory Mapped)攻略 简介 在多进程应用程序中,进程之间的通信是一项重要的任务。共享内存映射文件(Memory Mapped)是一种高效的通信机制,它允许多个进程共享相同的内存区域,从而实现数据的快速传输和共享。 步骤 1. 创建共享内存映射文件 首先,我们需要创建一个共享内存映射文件,以便多个进程可以访问它。…

    other 2023年8月2日
    00
  • MySQL约束constraint用法详解

    MySQL约束constraint用法详解 MySQL约束(constraint)是一种限制数据库中数据输入的规则,它可以保证数据的准确性和完整性。在MySQL中,常用的约束类型包括主键(primary key)、外键(foreign key)、唯一约束(unique)、非空约束(not null)、默认值约束(default)等。 主键(primary k…

    other 2023年6月25日
    00
  • 基于ERP程序的公共代码中出现的问题及过度封装不方便维护的解决办法

    下面是详细讲解“基于ERP程序的公共代码中出现的问题及过度封装不方便维护的解决办法”的完整攻略: 问题描述 在基于ERP程序开发中,通常会编写一些公共代码,用于实现各个模块之间的数据交互、统计分析等公共功能。然而,这些公共代码中常常存在以下问题: 代码重复冗余:由于各个模块有不同的需求,开发人员往往为了方便直接复制粘贴原有代码,导致公共代码中存在大量重复和冗…

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