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