【问题标题】:Why we can't assign a variable inside a static block in INTERFACE ? OCA为什么我们不能在 INTERFACE 的静态块内分配变量? OCA
【发布时间】:2017-11-23 08:22:16
【问题描述】:

我已经读过接口中定义的常量值隐含地是公共的、静态的和最终的。如果是这样,那么为什么我们不能在静态块中的接口内为其分配一个值。在哪里我们可以在静态块中的类中做同样的事情。

接口示例:[抛出错误]

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

类示例:[工作正常]

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

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

【问题讨论】:

    标签: java interface constants final static-block


    【解决方案1】:

    来自JLS Sec 9.3.1

    接口的字段声明中的每个声明器都必须有一个变量初始化器,否则会发生编译时错误。

    规范只需要一个初始化器。

    【讨论】:

      【解决方案2】:

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

      这可能是一个深思熟虑的设计决定。引入了接口,并且类被限制为单继承,就像在 C++ 中,多重继承造成了浑水;现在在 C++ 中解决了,但在代码中不是很可读,并且 用处非常有限。

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

          • 我正在准备 OCA 考试,想澄清一些疑虑,仅用于考试目的。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-02-14
          • 2011-03-28
          • 2014-12-05
          • 2012-11-10
          • 1970-01-01
          • 2021-01-14
          • 2015-09-15
          相关资源
          最近更新 更多