1. 程式人生 > >JAVA - 深入JAVA 虛擬機 3

JAVA - 深入JAVA 虛擬機 3

try string 時機 深入 load lock () args int

類的初始化時機

技術分享

package practise;

class Parent{
    
    static int a =3;
    static{
        
        System.out.println("Parent static block");
    }
}
class Child extends Parent
{
    static int b = 4;
    static{
        
        System.out.println("Child static block");
    }
}
public class Test4 {
    
    
static{ System.out.println("Test4 static block"); } public static void main(String[] args) { System.out.println(Child.b); } }

Result:
Test4 static block
Parent static block
Child static block
4
package practise;

class Parent5{
    
    static int a =3;
    
static{ System.out.println("Parent5 static block"); } } class Child5 extends Parent5 { static int b = 4; static{ System.out.println("Child5 static block"); } } public class Test5 { static{ System.out.println("Test5 static block"); }
public static void main(String[] args) { Parent5 parent = new Parent5(); System.out.println(Parent5.a); System.out.println(Child5.b); } }

Result:
Test5 static block
Parent5 static block
3
Child5 static block
4

程序中對子類的“主動使用”會導致父類被初始化;但對父類的“主動”使用並不會導致子類
初始化。

調用 ClassLoader類的loadClass方法加載一個類,並不是對類的主動使用,不會導致類的初始化。

package practise;

class C{
    
    static{
        
        System.out.println("Class C");
    }
}

public class Test6 {
    public static void main(String[] args) {
        
        ClassLoader loader = ClassLoader.getSystemClassLoader();
        
        try {
            Class<?> clz = loader.loadClass("practise.C");
            System.out.println("----------------");
            clz = Class.forName("practise.C");
            
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Result:
----------------
Class C

JAVA - 深入JAVA 虛擬機 3