首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不能在实例初始化块中使用最终字段?

为什么不能在实例初始化块中使用最终字段?
EN

Stack Overflow用户
提问于 2016-04-01 12:55:48
回答 1查看 97关注 0票数 1

从甲骨文的指南,初始化字段(强调地雷):

Java编译器将初始化器块复制到每个构造函数中。因此,这种方法可以用于在多个构造函数之间共享代码块。

另外,来自司法部关于Java中的实例初始化器的文章 (重点是我的):

实例初始化块代码在构造函数中调用super()之后立即运行,换句话说,在所有超级构造函数运行了之后,都会运行

考虑到这一点,为什么每次我试图在实例初始化程序块中使用(分配的)最终字段时,编译器都会警告我,如下所示?

代码语言:javascript
复制
final class PpTitleBook implements TitleBook {
  private final Resources resources;
  private final Log log;

  PpTitleBook(Resources resources, Log log) {
    this.resources = resources;
    this.log = log;
  }

  {
    String[] resTitles = resources.getStringArray(R.array.titles);

    if (book().getAllKeys().isEmpty()) {
      for (int i = 0; i < resTitles.length; i++) {
        newTitle(resTitles[i]);
      }
    }
  }

除了上面所示的构造函数之外,我没有其他构造函数。那么警告背后的真正原因是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-01 12:57:11

实例初始化程序块代码在构造函数的代码之前执行,因此在实例初始化程序块使用之前不会初始化resources变量。

因为您只有一个构造函数,所以可以将实例初始化程序块的代码移到构造函数中。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36356948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档