인터페이스 초기화 규칙

2102 단어
우리가 하나의 클래스를 초기화할 때, 먼저 부류를 초기화하지만, 인터페이스에 대해서는 그렇지 않다. 하나의 클래스를 초기화할 때, 그것이 실현하는 인터페이스를 먼저 초기화하지 않는다. 다음 프로그램을 보자
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            
        {
            System.out.println("MyParent5 invoked");
        }
    };
}


class MyChild5 implements MyParent5{
    public static int b = 5;
}

프로그램 실행, 출력:
5

MyChild5가 구현한 인터페이스를 볼 수 있습니다. 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");
        }
    };
}

프로그램 실행, 출력:
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);
        }
    };
}

프로그램 실행, 출력:
MyParent5 invoked
MyGradpa invoked
Thread[Thread-1,5,main]
Thread[Thread-0,5,main]

좋은 웹페이지 즐겨찾기