Java接口中的成员变量为什么必须是public static final?在interface里面的变量默认都是public static fina
Java接口中的成员变量为什么必须是public static final?
在interface里面的变量默认都是public static final 的。所以可以直接省略修饰符:
String param="ssm";//变量需要初始化
?
为什么接口要规定成员变量必须是public static final的呢?
?
答:
首先接口是一种高度抽象的"模版",,而接口中的属性也就是’模版’的成员,就应当是所有实现"模版"的实现类的共有特性,所以它是public static的,是所有实现类共有的.假如可以是非static的话,因一个类可以继承多个接口,出现重名的变量,如何区分呢?
?
其次,接口中如果可能定义非final的变量的话,而方法又都是abstract的,这就自相矛盾了,有可变成员变量但对应的方法却无法操作这些变量,虽然可以直接修改这些静态成员变量的值,但所有实现类对应的值都被修改了,这跟抽象类有何区别? 又接口是一种更高层面的抽象,是一种规范、功能定义的声明,所有可变的东西都应该归属到实现类中,这样接口才能起到标准化、规范化的作用。所以接口中的属性必然是final的。
?
最后,接口只是对事物的属性和行为更高层次的抽象。对修改关闭,对扩展(不同的实现implements)开放,接口是对开闭原则(Open-Closed Principle)的一种体现。
?
不知道大家能否认同?请畅所欲言!
?
1 楼 sling2007 2011-04-12 你说的都对
接口可以理解成一个高度抽象化的约定,凡是实现该接口的都要遵循这个约定,如果约定中的内容随便改,那怎么通信呢......
2 楼 Crusader 2011-04-13 看接口的定义就知道了
接口本来就是实现封装的一种手段,它的目的就是将类的使用说明与类的实现相分离
如果接口中出现实例变量,那接口就变驴子了 3 楼 cjh_ubuntu 2011-04-13 我不知道有人投隐的原因。 4 楼 dengyuan 2011-04-13 要怎么样才能投贴呢?? 5 楼 kjj 2011-04-13 接口就像标准,不开放定义这破玩意有啥用处......................... 6 楼 咖啡豆子 2011-04-13 cjh_ubuntu 写道我不知道有人投隐的原因。
说句不好听的话,很多投隐的人其实自己本身也就是个半罐水,技术讨论本来就不应该分层次,恰恰我认为现在很多人最缺的就是扎实的基础。 7 楼 optimism_best 2011-04-13 接口是一种抽象化,起到标准化、规范化的作用。赞同 8 楼 稍纵即逝 2011-04-14 这是java的规范,没为什么,不需要为什么。。王八的屁股,龟腚~ 9 楼 dwbin 2011-04-14 楼主想多了。static是为了开始的时候初始化,final是为了编译期间的优化,怎么也没有觉得太高深的东西。 10 楼 shaomeng95 2011-04-14 dwbin 写道楼主想多了。static是为了开始的时候初始化,final是为了编译期间的优化,怎么也没有觉得太高深的东西。
你说的这是语法层面的,我是从接口为什么要这样设计来分析的,仅仅是大家讨论交流而已。 11 楼 shaomeng95 2011-04-14 cjh_ubuntu 写道我不知道有人投隐的原因。
我也纳闷了,高手可以略过,为啥非要隐藏呢。 12 楼 kuaileqingfeng 2011-04-14 引用
首先接口是一种高度抽象的"模版",,而接口中的属性也就是’模版’的成员,就应当是所有实现"模版"的实现类的共有特性,所以它是public static的 ,是所有实现类共有的 .假如可以是非static的话,因一个类可以继承多个接口,出现重名的变量,如何区分呢?
对于楼主的这点,我不能认同,接口中的属性是static的,是因为接口不能实例化,所以如果要引用接口中的属性,只能通过接口去引用,和引用类中的静态变量的方式一样,例如:BigDecimal.ZERO 13 楼 kuaileqingfeng 2011-04-14 补充一下,并不会出现重名变量无法区分的问题 14 楼 shaomeng95 2011-04-14 kuaileqingfeng 写道引用
首先接口是一种高度抽象的"模版",,而接口中的属性也就是’模版’的成员,就应当是所有实现"模版"的实现类的共有特性,所以它是public static的 ,是所有实现类共有的 .假如可以是非static的话,因一个类可以继承多个接口,出现重名的变量,如何区分呢?
对于楼主的这点,我不能认同,接口中的属性是static的,是因为接口不能实例化,所以如果要引用接口中的属性,只能通过接口去引用,和引用类中的静态变量的方式一样,例如:BigDecimal.ZERO
我说的是:假如可以是非static的话,怎么区分? 不知道你是否能理解我的意思 呵呵,共同讨论 15 楼 s929498110 2011-04-14 不内涵。
搞java里面相当一部分人都是思维懒惰的机器人
只知道how、 而不想知道why
什么事情有果就有因、 只知道果的人永远都是傀儡
java规范不是天朝制度, 不是不能剖析里面的原理
LZ这篇帖子很简约而不简单
只不过太多人侧重于炫耀知识而不是探索知识,所以也出现那么多的人投隐藏票了、或许他们认为不投隐藏或者新手对不起“他们丰富的开发经验和熟练的java使用技巧” 16 楼 kongruxi 2011-04-14 s929498110 写道不内涵。
搞java里面相当一部分人都是思维懒惰的机器人
只知道how、 而不想知道why
什么事情有果就有因、 只知道果的人永远都是傀儡
java规范不是天朝制度, 不是不能剖析里面的原理
LZ这篇帖子很简约而不简单
只不过太多人侧重于炫耀知识而不是探索知识,所以也出现那么多的人投隐藏票了、或许他们认为不投隐藏或者新手对不起“他们丰富的开发经验和熟练的java使用技巧”
就是:知其然,但不知其所以然 17 楼 micheel37 2011-04-14 接口==协议 18 楼 lancelotly 2011-04-15 s929498110 写道不内涵。
搞java里面相当一部分人都是思维懒惰的机器人
只知道how、 而不想知道why
什么事情有果就有因、 只知道果的人永远都是傀儡
java规范不是天朝制度, 不是不能剖析里面的原理
LZ这篇帖子很简约而不简单
只不过太多人侧重于炫耀知识而不是探索知识,所以也出现那么多的人投隐藏票了、或许他们认为不投隐藏或者新手对不起“他们丰富的开发经验和熟练的java使用技巧”
引用兄台的话,这帖子确实简约而不简单。这样的帖子最有意思。
既然事情是这个道理,就要知道为什么是这个道理,做事要知因果。
投隐的人除非你确实是超级大牛,在那里装清高,要么就是一群半桶水装深沉。