接口初始化規(guī)則

在我們初始化一個類的時候,會先初始化它的父類,但是對于接口不是這樣的,在初始化一個類時,并不會先初始化它所實(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]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容