2010-12-14 16 views
8

我有一个类Product和一个接口LargeProduct。产品实现LargeProduct。最终字段不能分配,对于一个接口

LargeProduct有一个变量高度,它具有必须在Product类中实现的getter和setter方法。

在LargeProduct高度变量定义,像这样:

public int height = null; 

getter方法正常工作:

public int getHeight() { 
    return height; 
} 

但setter方法不会:

public void setHeight(int height) { 
    this.height = height; 
} 

错误:

The final field LargeProduct.height cannot be assigned 
The static field LargeProduct.height should be accessed in a static way 

我不确定它实际上给出了哪个错误..我使用Eclipse,当我将鼠标悬停时出现第一个错误,并在窗口底部出现第二个错误。

+2

接口定义了调用者和被调用者之间的契约。方法和常量是该合同的一部分,而不是字段。 (如果它是你不需要getter或setter)如果你想要父母定义一个字段,使用一个抽象类。 – 2010-12-14 10:46:03

回答

15

接口只能包含常量,而不是通用的变量。接口应该只有包含常量,如果它们与接口的其余部分真正相关,并且它们应该按照任何其他常数使用SHOUTY_CASE。这听起来像LargeProduct不应该有一个常数叫height - 但相反,您的实现应声明height字段。

请注意,接口意味着是API,显示类型的能力。字段不应该是API的一部分 - 它们是实现的详细信息。毕竟,谁会说你会根据一个简单的变量来编写getHeightsetHeight?这些方法可以查询数据库,或委托给其他类型的实例。界面的使用者不应该知道或关心这一点。

有关在接口领域的进一步信息,我建议你阅读section 9.3 of the Java Language Specification

在接口的身体的每个字段声明是隐含的公共,静态和决赛。允许冗余地为这些字段指定任何或所有这些修饰符。

+2

什么?!所以我不能存储某些接口的某些变量? – Matt 2010-12-14 10:40:23

+0

@Matt:不。将编辑来解释。 – 2010-12-14 10:40:41

+0

@Jon最后是这里的关键问题检查http://stackoverflow.com/questions/4438228/the-final-field-cannot-be-assigned-for-an-interface/4438277#4438277 – 2010-12-14 10:43:42

0

您无法将值分配给最终字段。在产品声明高度

private int height; 
+0

它没有被宣布为final:S – Matt 2010-12-14 10:40:46

+2

@Matt:虽然它隐含地是final,因为它是在一个接口中声明的。 – 2010-12-14 10:43:16

1

通过在界面默认字段(成员变量)是公共静态最终

和你没有制定者在LargeProduct 最后

2

高度变量是 定义像这样:

public int height = null; 

界面中定义的变量隐含地为staticfinal,即常量。这就是编译器所抱怨的。

您无法在接口中定义实例变量。只是不要说 - get和set方法确保类可以按照预期使用。实际变量是实现细节,如果实现类。

+0

这是关键 - 接口变量是_implicitly_“f​​inal”。这解决了我的问题。 – boettger1 2012-04-22 19:39:59

0

的确是org.life.java!你不能修改一个静态的最终变量!因为这是在Java中确定常量的方法。

相关问题