前言,这是今年面试的时候被问到的一个题目。我没有答得很完整。好惭愧。
一年来一直做项目,却没有好好留点时间静下心来思考为什么是这样,那么以后自己做出来的产品想必会存在漏洞,因为我对有些事情欠缺完整的思考。知道是缺点了,便要改。
为什么接口中的成员变量非得是public static final的呢?
首先明白一个原理,就是接口的存在意义。接口就是为了实现多继承的抽象类,是一种高度抽象的模板、标准或者说协议。规定了什么东西该是这样,如果你继承了我这接口,就必须这样。比如USB接口,就是小方口,两根电源线和两根数据线,不能多不能少。
(1)public
(2)static
所谓static,顾名思义,它代表着静态,静止不动的,都知道JVM内存中除了程序计数器,堆内存,栈内存,还有一块不大的内存区,叫做静态存储区。这块区域就是用来存储所有静态的方法和变量的。我想,java一开始设计static的原因也许是不想和实例捆绑在一起。你想想,java的主类中一定会有个public static main()方法,那是程序的执行入口。当初我在想,为什么一定要有个static呢?如果没有static,那么就必须先实例化main方法所在类对象,可是在哪实例化呢?JVM这样就找不到入口,因为没有static就必须先实例化分配内存后,才有main方法。如此死循环。
有了static就不一样了,JVM加载类的时候,首先开始加载的就是静态的成员变量和方法。而main()方法就在里面,JVM不需要加载任何实例对象,就能开始执行了,因此main方法是必须static的。
好,罗嗦了。回到题目,如果接口中的成员变量是非静态的,那么每一个实现了该接口的类都会有这么一个变量。那么,因为接口是多继承的,那么如果另一个接口也是有同样这样一个变量呢,那你用哪一个?所以,因为是标准,所以我规定从一开始,这个东西只能有一份,只能放在静态存储区,如果第二个接口也想同命名这么一个变量,那么存储时候就会报错,因为我静态存储区已经有一份了。你改名吧。
(3)final
最后归纳:
- public是因为接口是标准,必须对外完全开放,自己藏着掖着没意义;
- static是因为要确保该变量只有一份,避免重名;
- final是因为接口的东西是大家共用的,不能随便修改,因此干脆不然你有修改的权限!
至此,解释完毕。这次分析后,对接口的存在意义更深刻了。