I am trying to use static blocks like this:
I have a base class called Base.java
public class Base { static public int myVar; }
And a derived class Derived.java
:
public class Derived extends Base { static { Base.myVar = 10; } }
My main
function is like this:
public static void main(String[] args) { System.out.println(Derived.myVar); System.out.println(Base.myVar); }
This prints the out put as 0 0
where as I expected 10 0
. Can somebody explain this behavior? Also, if I want my derived classes to set the values for a static variable how can I achieve that?
Static initialzier blocks are not inherited . Static blocks are executed when class is loaded since your base class extends a super class , even the super class definition will be loaded by JVM when referring to your class. Lastly,the instance block can also never be inherited.
Static variables are inherited as long as they're are not hidden by another static variable with the same identifier.
The static block has been called. 67. A class named Demo contains a static integer value and a normal integer value. In a static block, a value is defined, and in the main class, an instance of the Demo class is created and the static integer is accessed from there.
Unlike C++, Java supports a special block, called a static block (also called static clause) that can be used for static initialization of a class. This code inside the static block is executed only once: the first time the class is loaded into memory.
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.
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