浅谈为什么Java接口中不允许定义变量

开发 后端
大家都知道,Java 中接口里定义的成员变量都自动是 final static 的,为什么?这样有什么好处?为什么不能定义变量?这里为大家简单说说。

接口就是提供一种统一的”协议”,而接口中的属性也属于“协议”中的成员。它们是公共的,静态的,最终的常量。相当于全局常量。抽象类是不“完全”的类,相当于是接口和具体类的一个中间层。即满足接口的抽象,也满足具体的实现。

如果接口可以定义变量,但是接口中的方法又都是抽象的,在接口中无法通过行为来修改属性。有的人会说了,没有关系,可以通过实现接口的对象的行为来修改接口中的属性。这当然没有问题,但是考虑这样的情况。如果接口 A 中有一个public 访问权限的静态变量 a。按照 Java 的语义,我们可以不通过实现接口的对象来访问变量 a,通过 A.a = xxx; 就可以改变接口中的变量 a 的值了。正如抽象类中是可以这样做的,那么实现接口 A 的所有对象也都会自动拥有这一改变后的 a 的值了,也就是说一个地方改变了 a,所有这些对象中 a 的值也都跟着变了。这和抽象类有什么区别呢,怎么体现接口更高的抽象级别呢,怎么体现接口提供的统一的协议呢,那还要接口这种抽象来做什么呢?所以接口中不能出现变量,如果有变量,就和接口提供的统一的抽象这种思想是抵触的。所以接口中的属性必然是常量,只能读不能改,这样才能为实现接口的对象提供一个统一的属性。

通俗的讲,你认为是要变化的东西,就放在你自己的实现中,不能放在接口中去,接口只是对一类事物的属性和行为更高层次的抽象。对修改关闭,对扩展(不同的实现 implements)开放,接口是对开闭原则的一种体现。

【编辑推荐】

  1. Java语言入门初学者不得不看的几条建议
  2. Java项目开发笔记与开发过程中的问题总结
  3. Java EE 6遥遥无期 预览版两极分化
  4. 几种典型的Java内存泄漏
  5. Java内存溢出的详细解决方案
责任编辑:彭凡 来源: javaeye博客
相关推荐

2023-08-22 20:43:09

HashMap单线程null

2022-05-08 18:18:40

JDKValueHashMap

2022-01-27 07:02:52

JavaHashMap单线程

2015-08-17 10:16:00

CentOSDocker命令root

2021-08-23 12:54:12

开发技能代码

2010-11-11 16:53:28

SQL Server视

2020-08-20 11:12:14

iOS 13.6苹果降级

2014-06-30 14:53:49

Android定制google

2011-04-22 10:15:56

Novell专利

2011-03-01 14:12:12

FreebsdProftpd

2010-11-02 15:08:40

设置db2主键

2010-06-01 16:12:00

2010-05-20 13:03:52

IIS父路径

2009-09-22 15:54:42

CCIE笔试

2012-01-04 21:24:13

Android 4.0

2023-05-23 08:54:43

SRESLO运营

2021-02-16 00:25:45

比特币货币加密货币

2018-06-13 10:08:05

苹果数据开发者

2021-07-26 16:18:08

Windows 11Windows微软

2023-02-01 14:47:00

模型
点赞
收藏

51CTO技术栈公众号