I am preparing myself for Java certification test and I have found an interesting question related to the execution of Java static blocks. I have spent a lot of time reading about this topic, but I didn't find the answer I was looking for.
I know that static blocks are executed when the class is loaded into JVM or when the main method is invoked, but...
package oneClassTasks;
class Parent {
static int age;
}
class Child extends Parent {
static {
age = 5;
System.out.println("child's static block");
}
}
public class XXX {
public static void main(String args[]) {
System.out.println("Child age is : "+ Child.age);
}
}
The output is:
Child age is : 0
If I include verbose output with -verbose:class
, then the output is:
...
[Loaded java.security.BasicPermissionCollection from C:\Program Files\Java\jre1.8.0_161\lib\rt.jar]
[Loaded oneClassTasks.XXX from file:/D:/temp/bin/]
[Loaded sun.launcher.LauncherHelper$FXHelper from C:\Program Files\Java\jre1.8.0_161\lib\rt.jar]
[Loaded java.lang.Class$MethodArray from C:\Program Files\Java\jre1.8.0_161\lib\rt.jar]
[Loaded java.lang.Void from C:\Program Files\Java\jre1.8.0_161\lib\rt.jar]
[Loaded oneClassTasks.Parent from file:/D:/temp/bin/]
[Loaded oneClassTasks.Child from file:/D:/temp/bin/]
Child age is : 0
[Loaded java.lang.Shutdown from C:\Program Files\Java\jre1.8.0_161\lib\rt.jar]
[Loaded java.lang.Shutdown$Lock from C:\Program Files\Java\jre1.8.0_161\lib\rt.jar]
We can see here that Child class is loaded into JVM.
Can someone explain why the static block from Child
class is not executed?
Static blocks in Java are executed automatically when the class is loaded in memory. Static blocks are executed before the main() method. Static blocks are executed only once as the class file is loaded to memory. A class can have any number of static initialization blocks.
A static block is a block of code with a static keyword. In general, these are used to initialize the static members. JVM executes static blocks before the main method at the time of class loading.
2. Static Block. Static initializer block or static initialization block, or static clause are some other names for the static block. Static block code executes only once during the class loading.
Order of execution When you have all the three in one class, the static blocks are executed first, followed by constructors and then the instance methods.
You saw that Child
class was loaded, but it wasn't initialized.
Accessing Child.age
doesn't cause the initialization of the Child
class, since age
is a member of Parent
class. Therefore only Parent
class is initialized, and age
remains 0
.
12.4.1. When Initialization Occurs
A class or interface type T will be initialized immediately before the first occurrence of any one of the following:
T is a class and an instance of T is created.
A static method declared by T is invoked.
A static field declared by T is assigned.
A static field declared by T is used and the field is not a constant variable (§4.12.4).
T is a top level class (§7.6) and an assert statement (§14.10) lexically nested within T (§8.1.3) is executed.
In your case you accessed a static field declared by Parent
, so only Parent
is initialized.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With