接口中定义常量的问题讨论

waver_jiang

发表文章: 1
注册时间: 2006年10月21日 10:23
昨天的面试题,请指教 发表: 2006年10月21日 10:24 回复
昨天去面试,问到了一个接口问题,为什么接口中定义的变量必须为常量?请指点!
<script type="text/javascript"> </script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script>
banq

发表文章: 8513
注册时间: 2002年08月03日 17:08
Re: 昨天的面试题,请指教 发表: 2006年10月23日 15:26 回复
我只知道这是Java规定,另外接口是行为抽象,不是属性抽象。
taoj555

发表文章: 3
注册时间: 2006年09月26日 15:42
Re: 昨天的面试题,请指教 发表: 2006年11月16日 16:10 回复
接口不能被实例化,所以其成员变量必须为不可修改的,就是常量。
javagood

发表文章: 5
注册时间: 2007年01月25日 11:14
回复:昨天的面试题,请指教 发表: 2007年01月25日 17:32 回复
不是太明白
peterkong

发表文章: 6
注册时间: 2005年04月11日 22:28
re:昨天的面试题,请指教 发表: 2007年01月31日 10:58 回复
因为接口定义处方法以外都
final static的所以必须为常量
billylinux

发表文章: 4
注册时间: 2007年01月31日 16:21
re:昨天的面试题,请指教 发表: 2007年01月31日 16:24 回复
三楼的:接口不能被实例化,所以其成员变量必须为不可修改的,就是常量。

这个是正解
taia

发表文章: 2
注册时间: 2007年01月31日 18:45
re:昨天的面试题,请指教 发表: 2007年01月31日 18:46 回复
楼上的
"接口不能被实例化" 与 "其成员变量必须为不可修改的" 有必然的联系吗?

抽象类也不能实例化,但它就可以定义变量


另外,接口是可以定义变量的,偶刚才试过了,可以通过编译
taia

发表文章: 2
注册时间: 2007年01月31日 18:45
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来声明为常量
fogu7

发表文章: 10
注册时间: 2007年02月01日 08:46
re:昨天的面试题,请指教 发表: 2007年02月01日 08:47 回复
还真没想过
iswind

发表文章: 1
注册时间: 2007年02月01日 17:59
re:昨天的面试题,请指教 发表: 2007年02月01日 18:00 回复
因为接口不包含任何实现细节,所以他们不能定义普通的字段——这样的定义会把实现策略强加给选择实现该接口的类。
leoyu

发表文章: 49
注册时间: 2007年01月31日 22:11
回复:昨天的面试题,请指教 发表: 2007年02月02日 09:37 回复
首先你要弄清接口的含义.接口就是提供一种统一的'协议',而接口中的属性也属于'协议'中的成员.它们是公共的,静态的,最终的常量.相当于全局常量.
抽象类是不'完全'的类,相当于是接口和具体类的一个中间层.即满足接口的抽象,也满足具体的实现.

[该贴被leoyu于2007年02月02日 09:40修改过]
dhxyu

发表文章: 1
注册时间: 2007年01月29日 16:46
re:昨天的面试题,请指教 发表: 2007年02月02日 13:37 回复
来看看 哈
journeydj

发表文章: 1
注册时间: 2007年02月02日 20:52
回复:昨天的面试题,请指教 发表: 2007年02月02日 20:56 回复
学习一下 J道第一贴(刚注册的 :))
jdonfans

发表文章: 61
注册时间: 2007年01月16日 11:42
re:昨天的面试题,请指教 发表: 2007年02月03日 21:05 回复
什么公司啊,无不无聊了一点。管它为什么,只要知道接口里面只能声明常量不就得了。

他如果问: 接口里面能定义变量吗?

这样还说得过去。
YRHYRH

发表文章: 14
注册时间: 2006年12月01日 03:06
re:昨天的面试题,请指教 发表: 2007年02月05日 03:39 回复
leoyu 正解呀。。呵呵。。
worfchina

发表文章: 1
注册时间: 2007年03月26日 01:47
re:昨天的面试题,请指教 发表: 2007年02月09日 13:26 回复
接口不能被实例化,所以其成员变量必须为不可修改的,就是常量。
jiu shi l
Edgra

发表文章: 18
注册时间: 2006年12月26日 16:53
回复:re:昨天的面试题,请指教 发表: 2007年03月09日 14:48 回复
反问他, 如果你定义。 有啥意义???
icen

发表文章: 11
注册时间: 2007年03月09日 22:42
re:昨天的面试题,请指教 发表: 2007年03月11日 11:20 回复
如果接口中定义的是变量,而且接口中的变量可是public static的
那么如果一个方法改变了该接口的变量的值的话,这样破坏了封装性,所有当前程序中访问该接口的方法,所有实现了该接口的对象的值都会跟着变,这会引起很大的混乱的。

[该贴被icen于2007年03月11日 11:22修改过]
zhouxu

发表文章: 23
注册时间: 2007年01月31日 13:08
re:昨天的面试题,请指教 发表: 2007年03月11日 22:51 回复
Java因为不支持多继承而广泛使用接口,可能这条规定也只是为了简化语言本身,除此之外我想不出还有什么特别的意义。
一个接口实例的改变不会对其它程序有影响,也没听说有理论强调在"接口"中定义变量就不好。
Coolyu0916

发表文章: 196
注册时间: 2007年04月23日 11:29
re:昨天的面试题,请指教 发表: 2007年03月12日 09:06 回复
在接口中定义常量基本上意义不大
除了为了一些特殊的标识
kungstriving

发表文章: 4
注册时间: 2006年12月07日 12:38
re:昨天的面试题,请指教 发表: 2007年03月28日 11:29 回复
JAVA在接口定义中,会将接口中的所有变量默认定义为public static final,就算你只是定义int i = 0; java也会将它转化为public static final int i = 0;
piaochunzhi

发表文章: 3
注册时间: 2007年03月13日 09:02
re:昨天的面试题,请指教 发表: 2007年03月28日 12:36 回复
这 种公司不去也就那样了!

不会是 isofts。。。。。。 这个 垃圾公司吧
richit

发表文章: 1
注册时间: 2007年04月08日 08:22
re:昨天的面试题,请指教 发表: 2007年04月08日 08:22 回复
学习。。。
colina

发表文章: 7
注册时间: 2007年03月15日 10:18
re:昨天的面试题,请指教 发表: 2007年04月08日 15:43 回复
学习!
njlinj

发表文章: 1
注册时间: 2007年04月08日 22:52
re:昨天的面试题,请指教 发表: 2007年04月08日 23:03 回复
积累~
fanfan6621

发表文章: 1
注册时间: 2007年05月26日 13:41
回复:回复:昨天的面试题,请指教 发表: 2007年05月26日 14:26 回复
leoyu的说法是正确的,我补充以下。
如果接口可以定义变量,但是接口中的方法又都是抽象的,在接口中无法通过行为来修改属性。有的人会说了,没有关系,可以通过实现接口的对象的行为来修改接口中的属性。这当然没有问题,但是考虑这样的情况。如果接口A中有一个public访问权限的静态变量a。按照java的语义, 我们可以不通过实现接口的对象来访问变量a,通过A.a = xxx;就可以改变接口中的变量a的值了。正如抽象类中是可以这样做的,那么实现接口A的所有对象也都会自动拥有这一改变后的a的值了,也就是说一个地方改变了a,所有这些对象中a的值也都跟着变了。这和抽象类有什么区别呢,怎么体现接口更高的抽象级别呢,怎么体现接口提供的统一的协议呢,那还要接口这种抽象来做什么呢?所以接口中不能出现变量,如果有变量,就和接口提供的统一的抽象这种思想是抵触的。所以接口中的属性必然是常量,只能读不能改,这样才能为实现接口的对象提供一个统一的属性。

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

发表文章: 22
注册时间: 2007年06月22日 12:40
re:昨天的面试题,请指教 发表: 2007年06月23日 14:52 回复
支持fanfan6621的说法。
yijianfengyu

发表文章: 3
注册时间: 2007年07月23日 11:37
re:昨天的面试题,请指教 发表: 2007年07月25日 09:20 回复
其实这个题目非常好,就测试你对开闭原则的理解!
simic

发表文章: 1
注册时间: 2007年07月30日 13:52
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) 接口类型的使用
  接口作为一种引用类型来使用。任何实现该接口的类的实例都可以存储在该接口类型的变量中,通过这些变量可以访问类所实现的接口中的方法。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值