学习学习类初始化的时候看到了下面关于接口的两大结论:

  • 在初始化一个类时,并不会初始化它所实现的接口
  • 在初始化一个接口时,并不会先初始化它的父接口
     因为接口中的变量都是 public static final 的,所以我一直在想,如何才能让接口初始化呢。直到我看到了网上的一个例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class InterfaceTest {
public static void main(String[] args) {
System.out.println(Parent.thread);
}
}

interface Parent {
public static final int a = 1;

public static Thread thread = new Thread(){
{
System.out.println(a);
}
};

public static Thread thread2 = new Thread(){
{
System.out.println(a + 1);
}
};

}

1
2
Thread[Thread-0,5,main]

 接下来我们来验证一下上面两个结论

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
interface Parent {

public static int a = 1;

public static Thread thread = new Thread(){
{
System.out.println("Thread...Parent");
System.out.println(a);
}
};

}

class Child implements Parent {
public static int b = 5;
}
1
2
3
4
5
6
public class InterfaceTest {

public static void main(String[] args) {
System.out.println(Child.b);
}
}

5

 对于上面那段程序,我们发现只输出了5,而没有输出"Thread…Parent",这就说明了在初始化一个类时,并不会初始化它所实现的接口

 我们修改一下程序,将Child改为接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
interface Child extends Parent {
public static int b = 5;
public static Thread thread = new Thread(){
{
System.out.println("Thread...Child");
System.out.println(a);
}
};
}

public class InterfaceTest {
public static void main(String[] args) {
System.out.println(Child.thread);
}
}

Thread…Child
1
Thread[Thread-0,5,main]

 对于修改后的程序,我们发现并没有输出“Thread…Parent",这就说明了在初始化一个接口时,并不会先初始化它的父接口