昨天的面试题,请指教 发表: 2006年10月21日 10:24 回复
昨天去面试,问到了一个接口问题,为什么接口中定义的变量必须为常量?请指点!
<script type="text/javascript">
</script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script>
Re: 昨天的面试题,请指教 发表: 2006年10月23日 15:26 回复
我只知道这是Java规定,另外接口是行为抽象,不是属性抽象。
Re: 昨天的面试题,请指教 发表: 2006年11月16日 16:10 回复
接口不能被实例化,所以其成员变量必须为不可修改的,就是常量。
回复:昨天的面试题,请指教 发表: 2007年01月25日 17:32 回复
re:昨天的面试题,请指教 发表: 2007年01月31日 10:58 回复
因为接口定义处方法以外都 final static的所以必须为常量
re:昨天的面试题,请指教 发表: 2007年01月31日 16:24 回复
三楼的:接口不能被实例化,所以其成员变量必须为不可修改的,就是常量。 这个是正解
re:昨天的面试题,请指教 发表: 2007年01月31日 18:46 回复
楼上的 "接口不能被实例化" 与 "其成员变量必须为不可修改的" 有必然的联系吗? 抽象类也不能实例化,但它就可以定义变量 另外,接口是可以定义变量的,偶刚才试过了,可以通过编译
re:昨天的面试题,请指教 发表: 2007年01月31日 18:56 回复
续上,干脆把代码也贴出来 public abstract class Word{ public int i; } class Test extends Word { public static void main(String[] args) { Test test=new Test(); System.out.println(test.i); test.i=2; System.out.println(test.i); } } ------------ PS:把WORD抽象类标识也可改为接口标识,但里面的变量i必须赋初值,可以不用fanil来声明为常量
re:昨天的面试题,请指教 发表: 2007年02月01日 08:47 回复
re:昨天的面试题,请指教 发表: 2007年02月01日 18:00 回复
因为接口不包含任何实现细节,所以他们不能定义普通的字段——这样的定义会把实现策略强加给选择实现该接口的类。
回复:昨天的面试题,请指教 发表: 2007年02月02日 09:37 回复
首先你要弄清接口的含义.接口就是提供一种统一的'协议',而接口中的属性也属于'协议'中的成员.它们是公共的,静态的,最终的常量.相当于全局常量. 抽象类是不'完全'的类,相当于是接口和具体类的一个中间层.即满足接口的抽象,也满足具体的实现. [该贴被leoyu于2007年02月02日 09:40修改过]
re:昨天的面试题,请指教 发表: 2007年02月02日 13:37 回复
回复:昨天的面试题,请指教 发表: 2007年02月02日 20:56 回复
re:昨天的面试题,请指教 发表: 2007年02月03日 21:05 回复
什么公司啊,无不无聊了一点。管它为什么,只要知道接口里面只能声明常量不就得了。 他如果问: 接口里面能定义变量吗? 这样还说得过去。
re:昨天的面试题,请指教 发表: 2007年02月05日 03:39 回复
re:昨天的面试题,请指教 发表: 2007年02月09日 13:26 回复
接口不能被实例化,所以其成员变量必须为不可修改的,就是常量。 jiu shi l
回复:re:昨天的面试题,请指教 发表: 2007年03月09日 14:48 回复
re:昨天的面试题,请指教 发表: 2007年03月11日 11:20 回复
如果接口中定义的是变量,而且接口中的变量可是public static的 那么如果一个方法改变了该接口的变量的值的话,这样破坏了封装性,所有当前程序中访问该接口的方法,所有实现了该接口的对象的值都会跟着变,这会引起很大的混乱的。 [该贴被icen于2007年03月11日 11:22修改过]
re:昨天的面试题,请指教 发表: 2007年03月11日 22:51 回复
Java因为不支持多继承而广泛使用接口,可能这条规定也只是为了简化语言本身,除此之外我想不出还有什么特别的意义。 一个接口实例的改变不会对其它程序有影响,也没听说有理论强调在"接口"中定义变量就不好。
re:昨天的面试题,请指教 发表: 2007年03月12日 09:06 回复
在接口中定义常量基本上意义不大 除了为了一些特殊的标识
re:昨天的面试题,请指教 发表: 2007年03月28日 11:29 回复
JAVA在接口定义中,会将接口中的所有变量默认定义为public static final,就算你只是定义int i = 0; java也会将它转化为public static final int i = 0;
re:昨天的面试题,请指教 发表: 2007年03月28日 12:36 回复
这 种公司不去也就那样了! 不会是 isofts。。。。。。 这个 垃圾公司吧
re:昨天的面试题,请指教 发表: 2007年04月08日 08:22 回复
re:昨天的面试题,请指教 发表: 2007年04月08日 15:43 回复
re:昨天的面试题,请指教 发表: 2007年04月08日 23:03 回复
回复:回复:昨天的面试题,请指教 发表: 2007年05月26日 14:26 回复
leoyu的说法是正确的,我补充以下。 如果接口可以定义变量,但是接口中的方法又都是抽象的,在接口中无法通过行为来修改属性。有的人会说了,没有关系,可以通过实现接口的对象的行为来修改接口中的属性。这当然没有问题,但是考虑这样的情况。如果接口A中有一个public访问权限的静态变量a。按照java的语义, 我们可以不通过实现接口的对象来访问变量a,通过A.a = xxx;就可以改变接口中的变量a的值了。正如抽象类中是可以这样做的,那么实现接口A的所有对象也都会自动拥有这一改变后的a的值了,也就是说一个地方改变了a,所有这些对象中a的值也都跟着变了。这和抽象类有什么区别呢,怎么体现接口更高的抽象级别呢,怎么体现接口提供的统一的协议呢,那还要接口这种抽象来做什么呢?所以接口中不能出现变量,如果有变量,就和接口提供的统一的抽象这种思想是抵触的。所以接口中的属性必然是常量,只能读不能改,这样才能为实现接口的对象提供一个统一的属性。 通俗的讲,你认为是要变化的东西,就放在你自己的实现中,不能放在接口中去,接口只是对一类事物的属性和行为更高层次的抽象。对修改关闭,对扩展(不同的实现implements)开放,接口是对开闭原则的一种体现。
re:昨天的面试题,请指教 发表: 2007年06月23日 14:52 回复
re:昨天的面试题,请指教 发表: 2007年07月25日 09:20 回复
re:昨天的面试题,请指教 发表: 2007年07月30日 14:06 回复
哈哈 这个题目相当高明 不能简单回答说 java规范规定了不能在interface中定义变量。 因为规范这么规定肯定是有他的thinking 当然了java规范里确实还有很多不可理解的定义。。 interface里定义变量 比如定义一个 publc string name; 那还不如定义getName or/and setName 方法来的好 因为直观的表明了这个interface的行为是能供查询name 还是可以修改name。 abstract class 可以的定义变量 因为abstract class里还有普通的方法 而这些方法可能会需要用到变量。
http://www.jdon.com/jivejdon/forum/messageList.shtml?thread=29356&message=21061525#21061525
1. 抽象类 java语言中,用abstract 关键字来修饰一个类时,这个类叫做抽象类 ,用abstract 关键字来修饰一个方法时,这个方法叫做抽象方法。格式如下: abstract class abstractClass{ …} //抽象类 abstract returnType abstractMethod([paramlist]) //抽象方法 抽象类 必须被继承,抽象方法必须被重写。 抽象方法只需声明,无需实现;抽象类 不能被实例化,抽象类 不一定要包含抽象方法。若类中包含了抽象方法,则该类必须被定义为抽象类 。 2. 接口 接口是抽象类 的一种,只包含常量 和方法的定义,而没有变量和方法的实现,且其方法都是抽象方法。它的用处体现在下面几个方面: ◇ 通过接口实现不相关类的相同行为,而无需考虑这些类之间的关系。 ◇ 通过接口指明多个类需要实现的方法。 ◇ 通过接口了解对象的交互界面,而无需了解对象所对应的类。 1)接口的定义 接口的定义包括接口声明和接口体。 接口声明的格式如下: [public] interface interfaceName[extends listOfSuperInterface] { … } extends 子句与类声明的extends子句基本相同,不同的是一个接口可有多个父接口,用逗号隔开,而一个类只能有一个父类。 接口体包括常量 定义和方法定义 常量 定义格式为:type NAME=value; 该常量 被实现该接口的多个类共享; 具有public ,final, static的属性。 方法体定义格式为:(具有 public和abstract属性) returnType methodName([paramlist]); 2)接口的实现 在类的声明中用implements子句来表示一个类使用某个接口,在类体中可以使用接口中定义的常量 ,而且必须实现接口中定义的所有方法。一个类可以实现多个接口,在implements子句中用逗号分开。 3) 接口类型的使用 接口作为一种引用类型来使用。任何实现该接口的类的实例都可以存储在该接口类型的变量中,通过这些变量可以访问类所实现的接口中的方法。