Home >Java >javaTutorial >How are Static and Instance Initializer Blocks Ordered in Java?

How are Static and Instance Initializer Blocks Ordered in Java?

DDD
DDDOriginal
2024-11-29 06:32:20210browse

How are Static and Instance Initializer Blocks Ordered in Java?

Initialization Order of Static and Instance Initializer Blocks in Java

Java initializes static and instance initializer blocks in a specific order, ensuring the correct loading and execution of classes. This ordering is crucial for managing dependencies and resource allocation.

Static Initializers

Java initializes static initializer blocks for a class only when that class or a static member of that class is first used. The following trigger the initialization of static blocks:

  • Instantiating a class
  • Invoking a static method of a class
  • Assigning a value to a static field
  • Using a non-constant static field
  • Executing an assert statement in a top-level class

Instance Initializers

Instance initializer blocks, on the other hand, are executed immediately before the constructor of the class. The order of execution is determined by the appearance of these blocks within the class definition.

Example

Consider the following code snippet:

class Parent {
    // Static initializer
    static {
        System.out.println("static - parent");
    }

    // Instance initializer
    {
        System.out.println("instance - parent");
    }

    // Constructor
    public Parent() {
        System.out.println("constructor - parent");
    }
}

class Child extends Parent {
    // Static initializer
    static {
        System.out.println("static - child");
    }

    // Instance initializer
    {
        System.out.println("instance - child");
    }

    // Constructor
    public Child() {
        System.out.println("constructor - child");
    }
}

When the Child class is instantiated, the following output is generated:

static - parent
static - child
instance - parent
constructor - parent
instance - child
constructor - child

This demonstrates that the static initializer of the parent class (in this case, Parent) is executed before that of the child class (Child). Within each class, the instance initializer blocks are executed before the constructor.

Exception for Unused Classes

In Java, classes that are not used are never loaded or initialized. This applies to both static and instance initializer blocks. In the example code provided, adding a new class (IAmAClassThatIsNeverUsed) that is never referenced does not affect the initialization order of the other classes.

The above is the detailed content of How are Static and Instance Initializer Blocks Ordered in Java?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn