我有一个产品类和一个接口LargeProduct。产品实现LargeProduct。
LargeProduct具有可变高度,其具有必须在Product类中实现的getter和setter方法。
LargeProduct中的height变量定义如下:
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,当我悬停它时会出现第一个错误,并且在窗口底部会出现第二个错误。
答案 0 :(得分:15)
接口只能包含常量,而不能包含通用变量。接口应仅包含常量,如果它们与接口的其余部分真正相关,并且它们应该根据任何其他常量使用SHOUTY_CASE
。听起来LargeProduct
不应该有一个名为height
的常量 - 但是,您的实现应该声明height
字段。
请注意,接口应该是API,显示类型的功能。字段不应该是API的一部分 - 它们是实现细节。毕竟,谁会说你会根据一个简单的变量写getHeight
和setHeight
?这些方法可以查询数据库,或委托给其他类型的实例。界面的消费者不应该知道或关心它。
有关界面中字段的更多信息,建议您阅读section 9.3 of the Java Language Specification:
接口主体中的每个字段声明都是隐式的public,static和final。允许为这些字段冗余地指定任何或所有这些修饰符。
答案 1 :(得分:2)
LargeProduct中的高度变量是 定义如下:
public int height = null;
接口中定义的变量是隐式static
和final
,即常量。这就是编译器所抱怨的。
您无法在界面中定义实例变量。只需将其保留 - get和set方法确保可以按预期使用类。实际变量是实现类的实现细节。
答案 2 :(得分:1)
默认情况下,界面中的字段(成员变量)为 public static final
并且您没有 final
的setter答案 3 :(得分:0)
您无法为最终字段指定值。将Product中的高度声明为
private int height;
答案 4 :(得分:0)
完全是org.life.java!而你无法修改静态最终变量!因为这是在Java中确定常量的方法。