當Java虛擬機初始化一個類時,要求它的全部父類都已經初始化,可是這條規則不適於接口java
1) 當初始化一個類時,並不會先初始化它所實現的類的接口。blog
2) 在初始化一個接口時,並不會先初始化它的父接口接口
所以,一個父接口並不會由於它的子接口或者實現類的初始化而初始化。只有當程序首次使用特定接口的鏡頭變量時,纔會致使該接口的初始化。虛擬機
當初始化一個類時,並不會先初始化它所實現的類的接口 Sampleclass
public class MyTest5 { public static void main(String[] args) { System.out.println(MyChild5.b); } } interface MyParent5{ public static Thread thread = new Thread(){ { //實例化代碼塊 System.out.println("MyParent 5 invoked "); } }; } class MyChild5 implements MyParent5{ public static int b = 6; }
打印結果thread
6
若是接接口改成class變量
public class MyTest5 { public static void main(String[] args) { System.out.println(MyChild5.b); } } class MyParent5{ public static Thread thread = new Thread(){ { //實例化代碼塊 System.out.println("MyParent 5 invoked "); } }; } class MyChild5 extends MyParent5{ public static int b = 6; }
那麼就會打印出程序
MyParent 5 invoked 這句話。im
在初始化一個接口時,並不會先初始化它的父接口static
public class MyTest5 { public static void main(String[] args) { System.out.println(MyParent5_1.thread); } } interface MyGrandpa5_1 { public static Thread thread = new Thread(){ { //實例化代碼塊 System.out.println("MyGrandpa5_1 invoked "); } }; } interface MyParent5_1 { public static Thread thread = new Thread(){ { //實例化代碼塊 System.out.println("MyParent5_1 invoked "); } }; }
打印結果
MyParent5_1 invoked Thread[Thread-0,5,main]