Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Behavior of static blocks with inheritance

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?

like image 370
Asha Avatar asked May 22 '12 08:05

Asha


People also ask

Do static blocks get inherited?

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.

Can static variables be inherited?

Static variables are inherited as long as they're are not hidden by another static variable with the same identifier.

What is static block explain with example?

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.

How does a static block work?

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.


1 Answers

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.

like image 77
Mikita Belahlazau Avatar answered Oct 11 '22 04:10

Mikita Belahlazau