There are two variants of an initialization block in Java -
Static initialization block.
Instance Initialization block.
Static initialization block
Static initialization block is used to initialize class variables, which are defined with the static keyword. You can define a static initialization block in your class and it is automatically called when your class loads, i.e. when you run your program.Static initialization block precedes with the keyword static.
Static initialization block example
//Static initialization block
class A
{
//Static Initializaton Block
static
{
System.out.println("Hello from the static block");
}
public static void main(String... ar)
{
}
}
Output:
Hello from the static block
We have defined a static initialization block in class A and it is executed as soon as we run our program.
Static initialization block can only access static variable of a class
Similar to the principle of static method, a static initialization block can only access static variables and static methods defined in the class.
class A
{
static int i;
static //static initialization block
{
i=10;
System.out.println("A class is loaded");
System.out.println("value of i = "+ i);
}
public static void main(String... ar)
{
}
}
Output:
A class is loaded
value of i = 10
Static initialization block cannot access instance variables
Just like a static method, a static initialization block cannot access instance variables and doing so, gives a compile error.
class A
{
int a=20;
static //static initialization block
{
System.out.println("A class is loaded");
System.out.println(a);
}
public static void main(String... ar)
{
}
}
Output:
A.java:8: error: non-static variable a cannot be referenced from a static context
System.out.println(a);
^
1 error
Multiple static initialization blocks
You can define multiple static initialization blocks within your class and the order(starting from top) in which they are defined is the order in which they are executed at the time when the class loads.
//multiple static initialization blocks.
class A
{
//first static initialization block
static
{
System.out.println("First hello from static block");
}
public static void main(String... ar)
{
}
//second static initialization block
static
{
System.out.println("Second hello from static block");
}
//third static initialization block
static
{
System.out.println("Third hello from static block");
}
}
Output:
First hello from static block
Second hello from static block
Third hello from static block
Static initialization block in inheritance
When a class which has extended another class, is executed. A static initialization block of a superclass is always executed before the static initialized block of a subclass.
class B
{
static //static initialization block of A
{
System.out.println("Static block of B");
}
}
class A extends B
{
static //static initialization block of B
{
System.out.println("Static block of A");
}
public static void main(String... ar)
{
}
}
Output:
Static block of B
Static block of A
Class A extended class B. On execution of class A, the static initialization block of its superclass B is executed before its own static initialization block.
本文深入探讨了Java中静态初始化块的使用,包括其如何初始化类变量,执行时机,以及在继承中的行为。同时,文章提供了多个代码示例,帮助读者理解静态初始化块的特性及其限制。
205

被折叠的 条评论
为什么被折叠?



