面试经常被问到的Interface的坑

1,730 阅读2分钟
原文链接: mp.weixin.qq.com

欢迎推荐人才赚取三位数以上的佣金,活动规则,只要邀请被推荐人关注公众号点击"面试内推",同时回复他的ID给小A,小A会在被推荐人成功入职后跟你分享佣金。佣金有多少呢?文末有惊喜!下面进入今天的正题。

曾经有一次面试被问到一个问题,Java的接口中能否定义一个非静态变量。当时我就懵了,一直只知道接口变量一定是静态,但从来没思考过为什么。不知道你有没有思考过这个问题呢?

Java 中变量为什么是静态的

先来看一个接口声明代码,

public interface JavaInterfaceTest {    public String TAG = "test";    public  void test();}

这个接口简单的声明了一个方法和一个变量TAG,我们没有把它声明为static,那么是否意味着它的值可以改变呢?

我们把它编译一下,然后看看生成的字节码,

javac JavaInterfaceTest.javajavap -c JavaInterfaceTest.class

下面是class类的字节码

public interface JavaInterfaceTest {  public static final java.lang.String TAG;  public abstract void test();}

发现了吗,虽然我们没有声明这个变量是staitc和final的,但是生成的字节码还是自动的变成了静态变量。

原因

其实思考一下接口的定义和它的作用就明白了,可以理解为以下几个点· 接口是不带任何实现的约束定义,如果它的变量不是final,那么任何类都可以修改它,这样就失去了约束的意义· 可以从字节码看出来,static的变量TAG是属于接口的,而不属于它的实现类· 因为一个类可以实现多个接口,如果不是static的,那么就无法处理多个接口有相同的变量名的问题

请随意转发下图到微信群或朋友圈,内推成功的同学,小A将与你分享4位数的佣金哦,最低也有1000大洋!