为什么我们不能在 INTERFACE 的静态块内分配变量?亚奥理事会

Why we can't assign a variable inside a static block in INTERFACE ? OCA

我读到在接口中定义的常量值是隐式的 public、静态的和 final.If 那么为什么我们不能在静态块的接口内分配它的值.我们可以在静态块中的 类 中做同样的事情。

接口示例:[抛出错误]

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

Class 示例:[工作正常]

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

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

接口没有初始化器。所以您不能使用 static 或实例块进行初始化。对于这些情况,您可以使用 abstract class。

来自JLS Sec 9.3.1

Every declarator in a field declaration of an interface must have a variable initializer, or a compile-time error occurs.

规范只需要初始化程序。

一般来说,接口用于定义某个class通过实现它应该具有的功能。所以我不确定在接口内部分配值是可行的方法。

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

也许您可以解释一下您要实现的目标以及为什么需要该界面。

Java 语言规范确实只允许 变量初始值设定项

这可能是经过深思熟虑的设计决定。引入了接口,classes 仅限于单继承,因为在 C++ 中,多继承创造了浑水;现在已在 C++ 中解决,但代码可读性不强,并且 用途非常有限。

在静态初始化器中可以做各种事情,比如 System.out.printlnfor 循环。他们可能确实想要纤薄的界面。当然不是正常的初始值设定项 { }(= 某种方式的多重继承:评估构造函数的顺序)。也许有人可以判断 class 在接口中加载静态初始值设定项是否会带来开销。