Java 程序初始化顺序

Java 中的类有一个初始化顺序,这决定了类中的字段和静态代码块的初始化顺序。要理解这个初始化顺序,需要了解以下方法和静态变量的初始化规则,以及如何保持正确的初始化顺序。

1. 静态变量初始化

在 Java 类中,静态变量是在类被加载时初始化的。这意味着当 JVM 加载类时,会先初始化静态变量,然后才会初始化普通变量。

以下是初始化静态变量的示例代码:

public class MyClass {

    //静态变量声明
    static int myInt = 5;

    // 静态代码块中初始化静态变量
    static {
        myInt = 10;
    }
}

2. 静态代码块

在类加载时,Java 还允许使用静态代码块初始化静态变量,如上述示例代码所示。这些代码块会在静态变量之前执行。

以下是使用静态代码块进行初始化的代码示例:

public class MyClass {

    static int myInt;

    static {
        myInt = 10;
    }

    //此处使用 myInt 变量
}

3. 父类初始化

在子类中调用父类的构造函数之前,父类必须被先初始化。这意味着父类中的静态变量、静态代码块、以及构造函数都必须在子类的成员变量和构造函数之前初始化。

以下是父类和子类的示例代码:

public class ParentClass {

    static int parentInt = 10;

    static {
        System.out.println("ParentClass static block");
    }

    ParentClass() {
        System.out.println("ParentClass constructor");
    }
}

public class ChildClass extends ParentClass {

    static int childInt = 20;

    static {
        System.out.println("ChildClass static block");
    }

    ChildClass() {
        System.out.println("ChildClass constructor");
    }

    public static void main(String[] args) {
        ChildClass child = new ChildClass();
    }
}

当运行 ChildClass 的 main 方法时,由于继承关系,ParentClass 将首先被加载和初始化。因此将打印以下输出:

ParentClass static block
ChildClass static block
ParentClass constructor
ChildClass constructor

4. 示例说明

以下示例解释了如何使用静态代码块和静态变量进行初始化。

public class MyClass {

    //声明静态变量
    static int myInt;

    static {
        myInt = 20;
        System.out.println("Static block: " + myInt);
    }

    public static void main(String[] args) {
        System.out.println("Main method: " + myInt);
    }
}

输出:

Static block: 20
Main method: 20

在 MyClass 类被加载时,myInt 变量首先被声明,然后静态代码块将其初始化为 20。main 方法随后被调用,打印 myInt 的值为 20。

以下示例解释了如何使用父类和子类的构造函数和静态变量进行初始化。

public class ParentClass {

    //静态变量
    static int parentInt = 10;

    static {
        System.out.println("Parent Class Static block");
        System.out.println("Static variable parentInt = "+parentInt);
    }

    ParentClass() {
        System.out.println("Parent Class constructor");
    }
}

public class ChildClass extends ParentClass {

    //静态变量
    static int childInt = 20;

    static {
        System.out.println("Child Class Static block");
        System.out.println("Static variable childInt = "+childInt);
    }

    ChildClass() {
        super();
        System.out.println("Child Class constructor");
    }

    public static void main(String[] args) {
        ChildClass child = new ChildClass();
    }
}

输出:

Parent Class Static block
Static variable parentInt = 10
Child Class Static block
Static variable childInt = 20
Parent Class constructor
Child Class constructor

在 main 方法运行时,ChildClass 首先被加载。由于继承关系,ParentClass 首先进行初始化,所以将打印出:

Parent Class Static block
Static variable parentInt = 10

然后会初始化 ChildClass,并打印输出:

Child Class Static block
Static variable childInt = 20

最后,将打印出每个类的构造函数调用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 程序初始化顺序 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • Java超详细梳理IO流的使用方法上

    Java超详细梳理IO流的使用方法上 在Java中,I/O流是非常重要的概念,可以让我们在程序中读写数据。Java的I/O库提供了各种类型的流,例如字节流、字符流和缓冲流。在本文中,我们将详细讲解Java中I/O流的使用方法。 前置知识 在学习Java中I/O流的使用方法之前,我们需要掌握以下基础知识: Java中的输入输出流的概念及基本操作; Java中的…

    Java 2023年5月24日
    00
  • 线程优先级的作用是什么?

    以下是关于线程优先级的作用的完整使用攻略: 线程优先级的作用 线程优先级是指线程在竞争 CPU 资源时的优先级程优先级越高,就有可能得 CPU 资源,从而更快地执行任务。线程优先级的取值范围是 1~10,其中 1 表示低先级,10 表示高先级。 线程优先级的作用主要有以下几个方面: 1. 提高程序的响应速度和吞吐量 线程优先级可以用来提高程序的响应速度和吞吐…

    Java 2023年5月12日
    00
  • SpringBoot自动配置特点与原理详细分析

    一、SpringBoot自动配置特点与原理分析 自动配置原理 SpringBoot的自动配置背后的原理是,通过条件注解来根据已有的bean、属性和类路径等来做出判断,自动调整项目的配置。 自动配置特点 约定优于配置:SpringBoot的自动配置遵循约定优于配置的原则,框架尽量避免使用XML等外置文件进行配置,采用内置默认配置的方式进行配置。 基于条件注解:…

    Java 2023年5月15日
    00
  • ShardingSphere jdbc集成多数据源的实现步骤

    下面是详细讲解“ShardingSphere jdbc集成多数据源的实现步骤”的完整攻略: 前言 ShardingSphere 是一个开源的、易于使用的分布式数据库解决方案。它为用户提供了数据分片、读写分离、跨库分页、数据加解密等功能,可以帮助用户轻松地构建分布式数据库系统。 本文将介绍如何在一个项目中使用 ShardingSphere JDBC 集成多数据…

    Java 2023年6月16日
    00
  • spring boot实战之本地jar包引用示例

    下面就为大家详细讲解 “spring boot实战之本地jar包引用示例”的完整攻略。 1. 前置知识 在介绍本地Jar包引用之前,我们需要先掌握以下基础知识: Java的classpath概念,即classpath的含义与用法 Maven的本地仓库,即本地仓库的含义与配置 Maven的工作原理,即pom.xml文件的作用 2. 引用本地Jar包示例 2.1…

    Java 2023年5月20日
    00
  • Spring源码:Bean的生命周期(二)

    前言 让我们继续讲解Spring的Bean实例化过程。在上一节中,我们已经讲解了Spring是如何将Bean定义加入到IoC容器中,并使用合并的Bean定义来包装原始的Bean定义。接下来,我们将继续讲解Spring的 getBean() 方法,特别是针对 FactoryBean 的解析。 在 getBean() 方法中,Spring还支持对 Factory…

    Java 2023年5月1日
    00
  • Java JDK 1.8 lambda的用法详解

    以下是”Java JDK 1.8 lambda的用法详解”的完整攻略。 Java JDK 1.8 lambda的用法详解 什么是Lambda表达式 在Java JDK 1.8中,加入了一种新的语言特性——Lambda表达式。Lambda表达式可以将函数作为方法传递或将代码作为方法来处理,并且可以使代码更加简洁易读。 Lambda表达式常用于处理集合或数组中的…

    Java 2023年5月26日
    00
  • JavaSpringBoot报错“NotAllowedException”的原因和处理方法

    原因 “NotAllowedException” 错误通常是以下原因引起的: 请求方法不允许:如果您的请求方法不允许,则可能会出现此错误。在这种情况下,需要检查您的请求方法并确保它们正确。 请求路径不允许:如果您的请求路径不允许,则可能会出现此错误。在这种情况下,需要检查您的请求路径并确保它们正确。 请求头不允许:如果您的请求头不允许,则可能会出现此错误。在…

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