为什么我们不能在INTERFACE中的静态块内分配变量? OCA

时间:2017-11-23 08:22:17

标签: java interface constants final static-block

我已经读过接口中定义的常量值是隐式的public,static和final。如果是这样的话,为什么我们不能在静态块中的接口内分配它的值。我们在静态块内的类中可以做同样的事情。

接口示例:[引发错误]

interface Test{
   int x;
   static{
     x=20;
   }    
}

类示例:[工作正常]

class Test{
  public static final int x;
  static{
     x=20;
  } 
}

请告诉我这种行为的原因? 如果您发现此问题重复,请标记,以便我查看。

4 个答案:

答案 0 :(得分:2)

来自JLS Sec 9.3.1

  

接口的字段声明中的每个声明符都必须具有变量初始值设定项,否则会发生编译时错误。

规范只需要初始化程序。

答案 1 :(得分:1)

界面没有初始化程序。因此,您无法使用static或实例块进行初始化。您可以在这些方案中使用abstract类。

答案 2 :(得分:1)

Java语言规范确实只允许变量初始化程序

这可能是一个刻意的设计决定。引入了接口,类被限制为单继承,就像C ++多重继承创建了浑水一样;现在用C ++解决了,但在代码中并没有很好的可读性 实用性非常有限。

在静态初始化程序中,可以执行各种操作,例如System.out.printlnfor循环。他们可能确实想要纤薄的界面。当然不是普通的初始化器{ }(=在某种程度上的多重继承:评估构造函数的顺序)。也许有人可以判断在接口中使用静态初始化器加载类是否会产生开销。

答案 3 :(得分:-2)

通常,接口用于定义某个类通过实现它应具有的功能。所以我不确定在接口内分配值是要走的路。

class Test implements yourInterface {
   @Override
   function myInterfaceFunction() {
     // code goes here
   }
}

也许您可以解释一下您正在尝试实现的目标以及您需要接口的原因。