Reputation: 21911
class A {
static int super_var = 1;
static {
System.out.println("super");
}
}
class B extends A {
static int sub_var = 2;
static {
System.out.println("sub");
}
}
public class Demo{
public static void main(String []args){
System.out.println(B.super_var);
}
}
outputs are :
super
1
this means that the child class not going to load or any other thing? how is it works?
Upvotes: 6
Views: 2684
Reputation: 1998
Checkout the answer to this question: In what order do static initializer blocks in Java run?
The static block gets called only when a class is accessed (either creating an instance or accessing a member field or static method). However, you access a member of class A only, so there is no reason for class B to be initialized yet. The static initializer of B will be called as soon as you access a member from that class (either a field or static method, or create an instance from class B).
The reason is that class B doesn't need to be initialized until you access one of its members. Because A doesn't know about B (and cannot access it) there's really no reason for B to initialize at that stage.
You will find out that when you access B.sub_var the static initializer of B will be executed.
Upvotes: 0
Reputation: 213411
When you access the static
fields of a super class on subclass reference, only the class that declares the field will be loaded and initialized, in this case it is A
. This is specified in JLS §12.4.1 - When Initialization Occurs:
A reference to a
static
field (§8.3.1.1) causes initialization of only the class or interface that actually declares it, even though it might be referred to through the name of a subclass, a subinterface, or a class that implements an interface.
Emphasis mine.
So in your code, class B
would not even be initialized, and hence its static
block would not be executed.
Upvotes: 12