50

这段代码:

interface Config {
    int MAX_CONN = 20;
}

编译并按我的预期工作。看起来这与以下内容相同:

interface Config {
    public static final int MAX_CONN = 20;
}

对于 Java 接口中的常量,“public static final”是多余的吗?Java 1.1、1.2、1.3、1.4、...、1.8 是这样吗?还是在 Java 版本中发生了变化?

4

6 回答 6

67

Interface 中声明的变量是隐式的public static final。这就是JLS 9.3所说的:

接口主体中的每个字段声明都是隐式的public、static 和 final。允许为这些字段冗余地指定任何或所有这些修饰符。

通读 JLS 以了解这样做的原因。

看看这个答案

接口变量是静态的,因为 Java 接口不能单独实例化;变量的值必须在不存在实例的静态上下文中分配。final修饰符确保分配给接口变量的值是一个真正的常量,程序代码不能重新分配。

于 2013-07-11T12:04:20.900 回答
5

接口:系统需求服务。

在接口中,变量默认由 public、static、final 访问修饰符分配。因为 :

public :有时接口可能会放在其他包中。所以它需要从项目中的任何地方访问变量。

static :这样不完整的类不能创建对象。所以在项目中我们需要访问没有对象的变量,这样我们就可以在

interface_filename.variable_name

final :假设一个接口由多个类实现,并且所有类都尝试访问和更新接口变量。因此它会导致数据变化不一致并影响其他所有类。所以需要用final声明访问修饰符。

于 2020-01-19T11:18:31.837 回答
3

接口variables是隐式的 staticfinal因为 Java 接口不能自己实例化。

接口使用 interface 关键字声明,并且只能包含方法签名和常量声明(声明为 static 和 final 的变量声明)。接口可能永远不会包含方法定义。

http://en.wikipedia.org/wiki/Interface_(Java)

于 2013-07-11T12:04:54.933 回答
2

接口变量是静态的,因为 Java 接口不能单独实例化。变量的值必须在静态上下文中分配 - 不存在实例。final修饰符确保分配给接口变量的值是一个真正的常量,程序代码不能重新分配。

于 2013-07-11T12:10:58.630 回答
1

接口变量始终是静态的和最终的。

于 2013-07-11T12:17:47.330 回答
1

但是,如果interface必须将 重构为一个类,则保留冗余可能更实际public static final。(这听起来很奇怪,因为每个 IDE 都将它们标记为冗余信息)。

编辑公平地说:如果不更改许多其他地方,就不会这样做(因为接口正在使用implements,同时从类继承使用extends

EDIT#2事实上,常量接口可以被认为是一种反模式,请参阅维基百科 - 常量接口

于 2018-12-11T07:28:33.950 回答