曾经有一次面试被问到一个问题,Java的接口中能否定义一个非静态变量。当时我就懵了,一直只知道接口变量一定是静态,但从来没思考过为什么。不知道你有没有思考过这个问题呢?
先来看一个接口声明代码,
public interface JavaInterfaceTest {
public String TAG = "test";
public void test();
}
这个接口简单的声明了一个方法和一个变量TAG,我们没有把它声明为static,那么是否意味着它的值可以改变呢?
我们把它编译一下,然后看看生成的字节码,
javac JavaInterfaceTest.java javap -c JavaInterfaceTest.class
下面是class类的字节码
public interface JavaInterfaceTest {
public static final java.lang.String TAG;
public abstract void test();
}
发现了吗,虽然我们没有声明这个变量是staitc和final的,但是生成的字节码还是自动的变成了静态变量。
其实思考一下接口的定义和它的作用就明白了,可以理解为以下几个点 · 接口是不带任何实现的约束定义,如果它的变量不是final,那么任何类都可以修改它,这样就失去了约束的意义 · 可以从字节码看出来,static的变量TAG是属于接口的,而不属于它的实现类 · 因为一个类可以实现多个接口,如果不是static的,那么就无法处理多个接口有相同的变量名的问题