When A Course Of Written Report Is Loaded Too Initialized Inwards Jvm - Java
Classloading too initialization inward Java
Understanding of when a bird is loaded too initialized inward JVM is 1 of the key concept of Java programming language. Thanks to Java linguistic communication specification nosotros receive got everything clearly documented too explained, but many Java programmer yet doesn't know when a bird is loaded or when a bird is initialized inward Java. Class loading too initialization seems confusing too complex to many beginners too its truthful until having approximately sense inward belt its non e'er slow to instruct into subtle details of How JVM industrial plant inward Java. In this Java tutorial nosotros volition encounter when bird loading occurs inward Java too when too how class too interface are initialized inward Java. I volition non become into especial of ClasLoader or How ClassLoader industrial plant in Java, that is acre of report of approximately other postal service I am planning. only to croak along this article focused too concise. There are several articles on Java fundamentals inward similar How HashMap industrial plant inward Java too How Garbage collection industrial plant inward Java. If you lot are interested you lot tin dismiss besides cheque those.
When Class is loaded inward Java
Class loading is done yesteryear ClassLoaders inward Java which tin dismiss hold upwards implemented to eagerly charge a bird equally before long equally approximately other bird references it or lazy load the bird until a withdraw of bird initialization occurs. If Class is loaded earlier its genuinely beingness used it tin dismiss sit down within earlier beingness initialized. I believe this may vary from JVM to JVM. While its guaranteed yesteryear JLS that a bird volition hold upwards loaded when at that topographic point is a withdraw of static initialization.
When a Class is initialized inward Java
After bird loading, initialization of bird takes house which agency initializing all static members of class. Influenza A virus subtype H5N1 Class is initialized inward Java when :
1) an Instance of bird is created using either new() keyword or using reflection using class.forName(), which may throw ClassNotFoundException inward Java.
2) an static method of Class is invoked.
3) an static acre of Class is assigned.
4) an static acre of bird is used which is non a constant variable.
5) if Class is a travel yesteryear bird floor too an assert statement lexically nested within bird is executed.
Reflection tin dismiss besides motility initialization of class. Some methods of java.lang.reflect parcel may motility bird to hold upwards initialized. JLS Strictly says that a bird should non hold upwards initialized yesteryear whatsoever argue other than above.
How Class is initialized inward Java
static too non static), block (static an non static), diverse classes (sub bird too super class) too diverse interfaces (sub interface, implementation bird too super interface) is initialized inward Java. Infact many Core Java interview question too SCJP inquiry based on this concept because it impact terminal value of whatsoever variable if its initialized on multiple places. Here are approximately of the rules of bird initialization inward Java:
1) Classes are initialized from top to bottom too then acre declared on travel yesteryear initialized earlier acre declared inward bottom
2) Super Class is initialized earlier Sub Class or derived bird inward Java
3) If Class initialization is triggered due to access of static field, exclusively Class which has declared static acre is initialized too it doesn't trigger initialization of super bird or sub bird fifty-fifty if static acre is referenced yesteryear Type of Sub Class, Sub Interface or yesteryear implementation bird of interface.
4) interface initialization inward Java doesn't motility super interfaces to hold upwards initialized.
5) static fields are initialized during static initialization of bird piece non static fields are initialized when instance of bird is created. It agency static fields are initialized earlier non static fields inward Java.
6)non static fields are initialized yesteryear constructors inward Java. sub bird constructor implicitly telephone outcry upwards super bird constructor earlier doing whatsoever initialization, which guarantees that non static or instance variables of super bird is initialized earlier sub class.
Examples of class initialization inward Java:
Here is an illustration of when bird is initialized inward Java. In this illustration nosotros volition encounter which classes are initialized inward Java.
/**
* Java computer program to demonstrate class loading too initialization inward Java.
*/
public class ClassInitializationTest {
public static void main(String args[]) throws InterruptedException {
NotUsed o = null; //this bird is non used, should non hold upwards initialized
Child t = new Child(); //initializing sub class, should trigger super bird initialization
System.out.println((Object)o == (Object)t);
}
}
/**
* Super bird to demonstrate that Super bird is loaded too initialized earlier Subclass.
*/
class Parent {
static { System.out.println("static block of Super bird is initialized"); }
{System.out.println("non static blocks inward super bird is initialized");}
}
/**
* Java bird which is non used inward this program, consequently non loaded yesteryear JVM
*/
class NotUsed {
static { System.out.println("NotUsed Class is initialized "); }
}
/**
* Sub bird of Parent, demonstrate when precisely sub bird loading too initialization occurs.
*/
class Child extends Parent {
static { System.out.println("static block of Sub bird is initialized inward Java "); }
{System.out.println("non static blocks inward sub bird is initialized");}
}
Output:
static block of Super class is initialized
static block of Sub class is initialized inward Java
non static blocks inward super class is initialized
non static blocks inward sub class is initialized
false
* Java computer program to demonstrate class loading too initialization inward Java.
*/
public class ClassInitializationTest {
public static void main(String args[]) throws InterruptedException {
NotUsed o = null; //this bird is non used, should non hold upwards initialized
Child t = new Child(); //initializing sub class, should trigger super bird initialization
System.out.println((Object)o == (Object)t);
}
}
/**
* Super bird to demonstrate that Super bird is loaded too initialized earlier Subclass.
*/
class Parent {
static { System.out.println("static block of Super bird is initialized"); }
{System.out.println("non static blocks inward super bird is initialized");}
}
/**
* Java bird which is non used inward this program, consequently non loaded yesteryear JVM
*/
class NotUsed {
static { System.out.println("NotUsed Class is initialized "); }
}
/**
* Sub bird of Parent, demonstrate when precisely sub bird loading too initialization occurs.
*/
class Child extends Parent {
static { System.out.println("static block of Sub bird is initialized inward Java "); }
{System.out.println("non static blocks inward sub bird is initialized");}
}
Output:
static block of Super class is initialized
static block of Sub class is initialized inward Java
non static blocks inward super class is initialized
non static blocks inward sub class is initialized
false
Observation:
1) Super bird is initialized earlier sub bird inward Java.
2) Static variables or blocks are initialized earlier non static blocks or fields.
3) Not used bird is non initialized at all because its non been used, none of the cases mentioned on JLS or inward a higher house which triggers initialization of bird is non happened here.
Let's receive got a hold off on approximately other illustration of bird initialization inward Java:
/**
* Another Java computer program illustration to demonstrate bird initialization too loading inward Java.
*/
public class ClassInitializationTest {
public static void main(String args[]) throws InterruptedException {
//accessing static acre of Parent through child, should exclusively initialize Parent
System.out.println(Child.familyName);
}
}
class Parent {
//compile fourth dimension constant, accessing this volition non trigger bird initialization
//protected static terminal String familyName = "Lawson";
protected static String familyName = "Lawson";
static { System.out.println("static block of Super bird is initialized"); }
{System.out.println("non static blocks inward super bird is initialized");}
}
Output:
static block of Super class is initialized
Lawson
* Another Java computer program illustration to demonstrate bird initialization too loading inward Java.
*/
public class ClassInitializationTest {
public static void main(String args[]) throws InterruptedException {
//accessing static acre of Parent through child, should exclusively initialize Parent
System.out.println(Child.familyName);
}
}
class Parent {
//compile fourth dimension constant, accessing this volition non trigger bird initialization
//protected static terminal String familyName = "Lawson";
protected static String familyName = "Lawson";
static { System.out.println("static block of Super bird is initialized"); }
{System.out.println("non static blocks inward super bird is initialized");}
}
Output:
static block of Super class is initialized
Lawson
Observation
1. Here bird initialization occurs because static acre is accessed which is non a compile time constant. had you lot declare "familyName" compile fourth dimension constant using final keyword inward Java (as shown inward commented section) bird initialization of super bird would non receive got occurred.
2) Only super bird is initialized fifty-fifty though static acre is referenced using sub type.
There is approximately other example of bird initialization related to interface on JLS which explains clearly that initialization of sub interfaces does non trigger initialization of super interface. I highly recommend reading JLS 14.4 for understating bird loading too initialization inward to a greater extent than detail.
That's all on When a bird is initialized too loaded inward Java. We receive got seen clear guidelines shape JLS regarding bird initialization. We receive got besides seen the guild on which super type too sub type are initialized too guild of initialization for both static too non static fields too blocks inward Java.
Further Learning
Java Memory Management
10 Object oriented pattern principles Java programmer should know
Belum ada Komentar untuk "When A Course Of Written Report Is Loaded Too Initialized Inwards Jvm - Java"
Posting Komentar