在我們初始化一個類的時候,會先初始化它的父類,但是對于接口不是這樣的,在初始化一個類時,并不會先初始化它所實(shí)現(xiàn)的接口,我們看下面的程序
public class MyTest5 {
public static void main(String[] args) {
System.out.println(MyChild5.b);
}
}
interface MyParent5{
public static int a = new Random().nextInt(3);
public static Thread thread = new Thread(){
//每個C的實(shí)例創(chuàng)建時都會執(zhí)行一次
{
System.out.println("MyParent5 invoked");
}
};
}
class MyChild5 implements MyParent5{
public static int b = 5;
}
運(yùn)行程序,輸出:
5
可以看到MyChild5實(shí)現(xiàn)的接口MyParent5沒有初始化
初始化一個接口時,并不要求其父接口都完成了初始化
public class MyTest5 {
public static void main(String[] args) {
System.out.println(MyParent5.thread);
}
}
interface MyGradpa{
public static int a = new Random().nextInt();
public static Thread thread = new Thread(){
{
System.out.println("MyGradpa invoked");
}
};
}
interface MyParent5 extends MyGradpa{
public static Thread thread = new Thread(){
{
System.out.println("MyParent5 invoked");
}
};
}
運(yùn)行程序,輸出:
MyParent5 invoked
Thread[Thread-0,5,main]
但是不代表一定不初始化父接口,在真正使用到父接口的時候(如引用接口中所定義的常量時),才會初始化
public class MyTest5 {
public static void main(String[] args) {
System.out.println(MyParent5.thread);
}
}
interface MyGradpa{
public static Thread threadGradpa = new Thread(){
{
System.out.println("MyGradpa invoked");
}
};
}
interface MyParent5 extends MyGradpa{
public static Thread thread = new Thread(){
{
System.out.println("MyParent5 invoked");
System.out.println(threadGradpa);
}
};
}
運(yùn)行程序,輸出:
MyParent5 invoked
MyGradpa invoked
Thread[Thread-1,5,main]
Thread[Thread-0,5,main]