A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邹颖 初级黑马   /  2012-5-27 21:16  /  6234 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 邹颖 于 2012-5-27 21:17 编辑

为什么接口中声明的变量默认都会有static final来修饰? 新手求解~

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
static变量是类变量,不属于某个具体的对象,  
接口是一系列抽象方法的集合,无法实例化,所以必须是static类型;  
接口功能的实现必须依赖实现接口的类,一个类可以实现多个接口,而一个接口又可以被多个类实现,  
为了避免出现c++中多重继承基类中相同成员域的处理问题,java中就把接口中的成员域定义为static final类型。

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
接口是一组常量和抽象方法的集合。与抽象方法类似,接口只声明抽象方法头,不给出方法体,由实现接口的类实现的抽象方法。接口提供了方法声明与实现相分离的机制,使实现接口的多各类表现出相同的行为模式。每个实现接口的类可以根据各自的要求,给出抽象方法的具体实现。所以接口中声明的抽象方法在实现接口的各类中表现出多态性。正因为如此,才要有public、static、final修饰,而且他们也都可以省略。

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
2楼正解!赞一个!

补充下:
在设计方面,接口是对外暴漏的规则,既然是规则,则接口的成员属性不能随意被修改,所以是final型。
而接口里存在大量的抽象方法,无法被实例化,接口中的成员变量只能通过定义成static,才能被外界访问。
回复 使用道具 举报
接口不能够产生对象,把成员变量声明为static是会随着类的加载而加载,只要通过接口名就可以调用,而将其声明为final是因为防止多处调用该变量,因为为static修饰,所以所有的子类对象也是共享一个成员变量,而其如果是可变的话就会使变量的改变引起其它地方的改变,所以将其声明为静态常量,用static final修饰。
回复 使用道具 举报
我是这样认为的 接口需要让很多子类去实现它的方法以便完成功能调用,如果常量没static 和final修饰的话,即使没有访问常量方法,但也有可能通过反射拿到常量,然后修改之,这样会带来严重的不安全问题;反之用static 和final修饰后,就不会再发生改变,提高了安全性;所以即使你没添加static 和final修饰,接口通过自己的机制也会默认添加;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马