接口是只是特殊的抽象类,它不包含普通方法,只包含抽象方法。而这些抽象方法就是多个类共同的公共行为规范,需要类去遵守,这些行为是与外部交流的通道,这就意味着接口通常定义的都是公共的用法,接口只关心这些类有没有遵守这些方法,而不去关心这些类的内部数据,也不关心这些类的方法实现细节。打个比方来说,接口就是一个公司的规章制度,部门就是类,那规章制度都是公开的要求大家遵守的,不可能把它私有起来不让别人看吧,那就没有意义了。
那怎么证明呢,可以用反射。
定义接口文件
package com.zhangqi.jvm; import java.util.Date; public interface ITest { double PI = 3.14; Date CREATE_TIME = new Date(); void play(); String getName(); }
接下来,测试方法来反射获取静态变量和方法。
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); } } }
执行之后得到结果如下:
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