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日

相关文章

  • Springboot如何通过yml配置文件为静态成员变量赋值

    在Spring Boot应用程序中,我们可以使用yml配置文件为静态成员变量赋值。在本文中,我们将详细讲解如何使用yml配置文件为静态成员变量赋值,并提供两个示例来说明这个过程。 步骤 要使用yml配置文件为静态成员变量赋值,我们需要遵循以下步骤: 在yml配置文件中定义静态成员变量的值。 在Java类中定义静态成员变量,并使用@Value注解将其与yml配…

    Java 2023年5月18日
    00
  • Hibernate+Spring+Struts扩展Struts

    本文将为大家介绍如何在一个Web应用中使用Hibernate、Spring和Struts三个框架,并扩展Struts框架,以实现一个完整的MVC架构。下面我们将一步步讲解如何搭建这个Web应用。 环境准备 在开始之前,请确保已经安装了以下环境: JDK 1.8 Tomcat 8.5 MySQL 5.x 创建工程 在Eclipse中创建一个动态Web工程,命名…

    Java 2023年6月15日
    00
  • Java8到Java19的一些变化分析详解

    Java8到Java19变化分析详解 随着Java版本的不断更新,Java8到Java19经历了多次重大变革,本文将针对这些变化进行详细讲解和分析。 Lambda表达式 Java8引入了Lambda表达式,这是Java8最具革命性的改变之一。Lambda表达式可以简化代码并使代码更具可读性。下面是一个示例说明: List<String> list…

    Java 2023年5月25日
    00
  • Java杂谈之类和对象 封装 构造方法以及代码块详解

    Java杂谈之类和对象 封装 构造方法以及代码块详解 类和对象 Java是面向对象编程的语言,类是Java强大的概念之一。类是一组字段和方法的集合,用于表示某些相关的状态和行为。 在Java中,对象是类的实例。对象是通过类构造函数创建的,类构造函数定义了如何创建对象。按照惯例,类名应该以大写字母开头。 在Java中,类可以有任意数量的方法和成员,这些方法和成…

    Java 2023年5月26日
    00
  • MyBatis插件机制超详细讲解

    MyBatis插件机制超详细讲解 什么是MyBatis插件机制 MyBatis插件机制指的是MyBatis框架提供了一种扩展机制,可以在执行SQL语句的各个环节进行拦截,并在拦截到这些环节时进行自定义的操作,以实现更自定义的功能,例如SQL日志拦截、自定义SQL追踪、自定义SQL执行等。 插件机制最主要的功能是拦截方法并执行自定义操作。 MyBatis插件机…

    Java 2023年5月19日
    00
  • JavaWeb简单文件上传流程的实战记录

    JavaWeb简单文件上传实战攻略 简介 本攻略基于JavaWeb开发,帮助初学者快速入门文件上传功能。我们将介绍一个基于Servlet/JSP的简单文件上传例子,包含完整的代码示例、攻略细节和实践体验。 文件上传流程 JavaWeb文件上传可以分为以下几个步骤: 表单设计 – 创建一个包含 file type input 元素的表单,实现文件上传UI. 解…

    Java 2023年5月19日
    00
  • springboot项目快速搭建的方法步骤

    下面我会为您详细讲解使用 Spring Boot 快速搭建项目的方法步骤。 准备工作 在开始使用 Spring Boot 快速搭建项目之前,需要准备以下软件: JDK 1.8 或以上版本 Maven 3.x 或以上版本 步骤一:创建Spring Boot项目 使用Spring官方提供的构建工具Spring Initializr,可以快速创建一个 Spring…

    Java 2023年5月15日
    00
  • 如何实现线程安全的缓存?

    以下是关于线程安全的缓存的完整使用攻略: 什么是线程安全的缓存? 线程安全的缓存是指在多线程环下,多个线程可以同时访问缓存的数据而不会出不一致或程序崩溃等问题。在多线程编程中,程安全的缓存是非常重要的,因为多个线程访问缓存,会出现线程争用的问题,导致数据不一致或程序崩溃。 如何实现线程安全的缓存? 为了实现线程安全缓存,需要使用同步制来保证多个线程对缓存的访…

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