Behavior of static blocks with inheritance

后端 未结 5 832
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-02 20:13

I am trying to use static blocks like this:

I have a base class called Base.java

public class Base {

    static public int myVar;

}
         


        
5条回答
  •  [愿得一人]
    2020-12-02 20:52

    As I understand. You don't call any Derived properties (myVar belongs to Base, not to Derived). And java is not running static block from Derived. If you add some static field to Derived and access it, then java executes all static blocks.

    class Base {
    
        static public int myVar;
    
    }
    
    
    class Derived extends Base {
    
        static public int myVar2;
    
        static
        {
            Base.myVar = 10;
        }
    }
    
    
    public class Main {
        public static void main( String[] args ) throws Exception {
            System.out.println(Derived.myVar2);
            System.out.println(Base.myVar);
        }
    }
    

    From java specification, when class is initialized (and static block got executed):

    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.
    • T is a class and 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.

提交回复
热议问题