为什么接口中不能定义变量(oop设计原理)

  1. JAVA语法规定,接口中的变量默认自动隐含是public static final!   
  2.   
  3. 为什么需要这样定义?   
  4.   
  5. 接口的目的   
  6.   
  7. OOP中一个很重要的概念就是封装,对象可以通过public interface的设计,来提供一系列方法,让用户能够利用利用对象来完成需要的任务。然而,内部的实现细节对用户是隐藏的,目的是为了对具有共同特点的类,能够用相同的方法来使用,并且可以进行类的转换。   
  8.   
  9. 例如,考虑为你的VCR,DVD播放,磁带录音机,CD,镭射磁盘播放器,编写一个家用的统一遥控器,遥控器对5个设备来说,有相同的按钮,播放,停止,快进,重复,暂停   
  10.   
  11. 你可能注意到,没有启动,打开镭射,打开磁铁等等按钮,这些细节是隐藏的,不是由于必要的安全原因, 更正确的是因为这些是具体设备的实现部分,从而能够方便从设备到设备的切换,并且不针对到所有的设备。   
  12.   
  13. 接口的主要目的,是提供设备中那些对用户是可用的细节(遥控器)。这就是为什么接口中所有的方法默认隐含是public的:这些方法本意就是对用户是可访问的。这就是接口的使用目的。   
  14.   
  15. OOP另外一个重要的设计原则,在几乎所有的情况下,一个好的对象设计不会提供给客户直接访问它的实例变量的能力。通常,那些对象应该对变量定义访问和获取方法来实现变量的操作。   
  16.   
  17. 这样,设计者可以设置合理的限制条件在那些变量上   
  18.   
  19. 因此,public的实例变量不应该是好的接口定义的一部分,他们不能在java的接口中定义。   
  20. 然而public static final修饰用于定义java中的常量,前提是那些需要定义的常量是不能改变的,这样就可以直接让他们暴露在类的public interface中, 这就是为什么变量在接口中必须是static(同样必须publicfinal的)   
  21.   
  22. 从这段翻译:   
  23. http://forum.java.sun.com/thread.jspa?threadID=741407&messageID=4251167   
  24.   
  25.   
  26. 个人的理解:   
  27. publicpublic的原因就不用讲了,接口定义的都是对用户可以使用的部分。   
  28. final: 变量属于类的细节,应该被隐藏,public的变量,在类中不是很好的设计,没有体现封装的开闭原则   
  29. staticfinal是用来定义常量的,仅仅是final在类中static段也是可以改变的,所以必须是static final   
  30.   
  31. 附例:   
  32. class C {   
  33. static final int X;   
  34. static {   
  35. X = 17;   
  36. }   
  37. }   
  38.   
  39. interface I {   
  40. int Y;   
  41. static {   
  42. Y = 17;   
  43. }   
  44. }   

你可能感兴趣的:(java)