您的位置:首页 > 其它

为什么接口中的成员变量非得是public static final?

2017-12-22 17:00 204 查看
前言,这是今年面试的时候被问到的一个题目。我没有答得很完整。好惭愧。

一年来一直做项目,却没有好好留点时间静下心来思考为什么是这样,那么以后自己做出来的产品想必会存在漏洞,因为我对有些事情欠缺完整的思考。知道是缺点了,便要改。

 

为什么接口中的成员变量非得是public static final的呢?

 

首先明白一个原理,就是接口的存在意义。接口就是为了实现多继承的抽象类,是一种高度抽象的模板、标准或者说协议。规定了什么东西该是这样,如果你继承了我这接口,就必须这样。比如USB接口,就是小方口,两根电源线和两根数据线,不能多不能少。

1public

 既然是公共的模板或者协议,那么如果定义成private就没有意义了,因为所有继承了你这接口的类都不能用,并且接口中的方法是不能够被具体实现的,因此,接口内部中也没有任何方法可使用。因此,为了让所有实现了该接口的类能够使用,就必须是public的。接口中定义的所有东西就应该是对所有用户开放的东西。

 

2static

所谓static,顾名思义,它代表着静态,静止不动的,都知道JVM内存中除了程序计数器,堆内存,栈内存,还有一块不大的内存区,叫做静态存储区。这块区域就是用来存储所有静态的方法和变量的。我想,java一开始设计static的原因也许是不想和实例捆绑在一起。你想想,java的主类中一定会有个public
static main()方法,那是程序的执行入口。当初我在想,为什么一定要有个static呢?如果没有static,那么就必须先实例化main方法所在类对象,可是在哪实例化呢?JVM这样就找不到入口,因为没有static就必须先实例化分配内存后,才有main方法。如此死循环。

有了static就不一样了,JVM加载类的时候,首先开始加载的就是静态的成员变量和方法。而main()方法就在里面,JVM不需要加载任何实例对象,就能开始执行了,因此main方法是必须static的。

好,罗嗦了。回到题目,如果接口中的成员变量是非静态的,那么每一个实现了该接口的类都会有这么一个变量。那么,因为接口是多继承的,那么如果另一个接口也是有同样这样一个变量呢,那你用哪一个?所以,因为是标准,所以我规定从一开始,这个东西只能有一份,只能放在静态存储区,如果第二个接口也想同命名这么一个变量,那么存储时候就会报错,因为我静态存储区已经有一份了。你改名吧。

 

 

3final

 想想,如果不是final的,那么意味着每一个实现了该接口的子类都可以去修改这个变量。我们开头说了,接口就是标准规范,也改也只能是制定该接口的架构师来改,如果某类随便改的话,那么其他也继承了该接口的类就会受到影响。牵一发而动全身!!因此,既然是标准,那么就不能改,方便管理。

 

最后归纳:

public是因为接口是标准,必须对外完全开放,自己藏着掖着没意义;

static是因为要确保该变量只有一份,避免重名;

final是因为接口的东西是大家共用的,不能随便修改,因此干脆不然你有修改的权限!

 

至此,解释完毕。这次分析后,对接口的存在意义更深刻了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: