接口是只是特殊的抽象类,它不包含普通方法,只包含抽象方法。而这些抽象方法就是多个类共同的公共行为规范,需要类去遵守,这些行为是与外部交流的通道,这就意味着接口通常定义的都是公共的用法,接口只关心这些类有没有遵守这些方法,而不去关心这些类的内部数据,也不关心这些类的方法实现细节。打个比方来说,接口就是一个公司的规章制度,部门就是类,那规章制度都是公开的要求大家遵守的,不可能把它私有起来不让别人看吧,那就没有意义了。

那怎么证明呢,可以用反射。

定义接口文件

1
2
3
4
5
6
7
8
9
10
11
12
package com.zhangqi.jvm;
 
import java.util.Date;
 
public interface ITest {
     
    double PI = 3.14;
    Date CREATE_TIME = new Date();
     
    void play();
    String getName();
}

接下来,测试方法来反射获取静态变量和方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.zhangqi.jvm;
 
import java.lang.reflect.Field;
import java.lang.reflect.Method;
 
public class ReflectTest {
 
    public static void main(String[] args) throws ClassNotFoundException {
 
        // 加载com.zhangqi.jvm.ITest类文件
        Class<?> clazz = Class.forName("com.zhangqi.jvm.ITest");
         
        // 获取类中所有方法
        Method[]  methods = clazz.getDeclaredMethods();
         
        // 遍历每个方法,并输出该方法
        for (Method method : methods) {
            System.out.println(method.toString());
        }
         
        System.out.println("~~~~~~~~~~~~~~~~~~~~~");
         
        // 获取类中所有静态变量
        Field[] fields = clazz.getDeclaredFields();
         
        // 遍历所有常量
        for (Field field : fields) {
            System.out.println(field);
        }
    }
}

执行之后得到结果如下:

1
2
3
4
5
public abstract java.lang.String com.zhangqi.jvm.ITest.getName()
public abstract void com.zhangqi.jvm.ITest.play()
~~~~~~~~~~~~~~~~~~~~~
public static final double com.zhangqi.jvm.ITest.PI
public static final java.util.Date com.zhangqi.jvm.ITest.CREATE_TIME