对待这个问题,我建议用辩证的角度去看待!首先我们来看只有final没有static的情况,也就是说每个实现类里面都会有一个名字和值都一样的变量(final强调不准改变引用地址),那么在初始化相关实现类的时候,都会单独为这个属性开辟一个存储空间,这个时候问题就来了--》不觉得很浪费内存吗?如果我用static关键字修饰了,不管你创建多少个实现类实例,他们都共享这个成员属性并且内存中也只会开销紧够存储这一个属性的内存,而不会每个实例都去开销这个属性所需的内存,这是为毛要用static。反过来,我们看看不用final,只用static的情况,打个比方我们有A,V(名字取的不错)两个实现类,A类中的某个函数需要改变这个属性的值为50才能使逻辑正确,B类中的某个函数需要改变这个属性的值为100才能使逻辑正确,那么问题来了,A类中的函数改成了50美滋滋,B类中的属性也要变成50啊!所以B类在被运用的时候就报错了,这个时候就造成了属性歧义的问题,然而我们加上final这个关键字就不一样了,开发看到这个属性就知道不能再依赖这个属性写逻辑了,所以就自己另写属性,也就避免了后面的奇异性问题。。。或者我们从书本的角度来说,接口本来就是最高层次的抽象,你给我在里面定义普通变量(我至少觉得变量一点不具抽象概念),玩呢?所以直接定死属性值,他的作用我们暂时不用考虑,但是乱用它的风险我们还是规避,仅此而已。或许现在隔壁老王出来说,那我既不用static也不用final为毛也不行呢?我就想说你这个脑子是怎么做到绿万千男人的大事的?接口本来就是为了充分利用多态特性来增加框架扩展性,你在接口里面定义一个name属性,实现类都要去利用它,那万一有的需求根本不需要用到这个属性,而只是单纯的想扩展架构呢?放在这里好看吗?对于这个情况,无论是官方还是个人意见都是在实现类定义自己需要的属性,避免属性值歧义和没有必要的耦合度,所以你在接口中不能也是没有必要去定义一个普通属性,解答完毕,话说市面上的解答花样多的我都看晕了,但是麻烦不能讲清楚真心别乱说,容易误导人。谢谢。
为什么java接口中的成员变量必须被static关键字和final关键字修饰
最新推荐文章于 2024-06-27 15:05:51 发布