前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试经常被问到的Interface的坑

面试经常被问到的Interface的坑

作者头像
PhoenixZheng
发布2018-08-07 16:47:42
2840
发布2018-08-07 16:47:42
举报

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

Java 中变量为什么是静态的

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

代码语言:javascript
复制
public interface JavaInterfaceTest {
    public String TAG = "test";
    public  void test();
}

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

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

javac JavaInterfaceTest.java javap -c JavaInterfaceTest.class

下面是class类的字节码

代码语言:javascript
复制
public interface JavaInterfaceTest {
  public static final java.lang.String TAG;

  public abstract void test();
}

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

原因

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android每日一讲 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java 中变量为什么是静态的
  • 原因
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档