面试经常被问到的Interface的坑

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

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的,那么就无法处理多个接口有相同的变量名的问题

原文发布于微信公众号 - Android每日一讲(gh_f053f29083b9)

原文发表时间:2018-03-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏奔跑的蛙牛技术博客

java基本程序设计

保护对象实例域,提供黑盒的概念保护数据域的安全,体现了面向对象思想。数据>算法的思想

892
来自专栏老九学堂

最新Java高薪面试题+答案+解析!

今天老九君给大家分享一些Java面试需要的题目哟~ 01 anonymousinnerclass(匿名内部类)是否可以extends(继承)其它类,是否可以im...

4467
来自专栏IT可乐

Java的深拷贝和浅拷贝

  关于Java的深拷贝和浅拷贝,简单来说就是创建一个和已知对象一模一样的对象。可能日常编码过程中用的不多,但是这是一个面试经常会问的问题,而且了解深拷贝和浅拷...

3386
来自专栏HappenLee的技术杂谈

C++雾中风景4:多态引出的困惑,对象的拷贝?

上面是两个继承关系的类定义。penguin(企鹅)类继承了bird类。在bird类之中fly()函数是一个virtual函数,它可以被penguin覆盖。我们看...

804
来自专栏PHP在线

javascript函数

函数声明提升 执行代码前会先读取函数声明,可以把函数声明放在调用他的语句后面。 sayHi(); function sayHi(){ alert("Hi!");...

3119
来自专栏技术/开源

一道javascript面试题

下面表达式比较的结果分别是什么? 1. []=="0" 2. []==0 3. "0"==0 4. []==false 5. []==[] 大家可以...

22910
来自专栏IT派

Java面试中常被问到的几大技术难题

大家在平常面试java的过程中都会遇到哪些难题呢?还有一些即将去面试java的童鞋们,你们想知道技术面试中会涉及到哪些点吗?达妹为你整理Java面试中会被问到的...

1210
来自专栏专注 Java 基础分享

关于类的对象创建与初始化

今天,我们就来解决一个问题,一个类实例究竟要经过多少个步骤才能被创建出来,也就是下面这行代码的背后,JVM 做了哪些事情? Object obj = new ...

3365
来自专栏青青天空树

2034-人见人爱A-B(c++实现)

参加过上个月月赛的同学一定还记得其中的一个最简单的题目,就是{A}+{B},那个题目求的是两个集合的并集,今天我们这个A-B求的是两个集合的差,就是做集合的减法...

1262
来自专栏个人随笔

房上的猫:类的无参方法

一.类的无参方法  1.概述:   (1)类是由一组具有相同属性和共同行为的实体抽象而来的   (2)对象执行的操作是通过编写类的方法实现的   (3)类的每一...

37813

扫码关注云+社区

领取腾讯云代金券