首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非静态初始化块-我有更多的控制吗?

非静态初始化块-我有更多的控制吗?
EN

Stack Overflow用户
提问于 2016-04-07 00:49:34
回答 1查看 382关注 0票数 7

我仍然在Java的学习曲线上。为了更好地理解初始化程序块,我创建了一个小的测试类:

代码语言:javascript
复制
public class Script {

    {
        Gadgets.log("anonymous 1");
    }

    public Script() {
        Gadgets.log("constructor");
    }

    {
        Gadgets.log("anonymous 2");
    }
}

当我创建一个实例时,我得到了以下日志:

代码语言:javascript
复制
Script: anonymous 1
Script: anonymous 2
Script: constructor

这告诉我,这两个初始化程序块按照它们在源代码中出现的顺序(与静态初始化器相同)在构造函数之前运行。我想知道的是:我是否对这种行为有更多的控制?因为Java文档说(source):

实例变量的初始化块看起来就像静态初始化器块,但是没有静态关键字:

代码语言:javascript
复制
{
     // whatever code is needed for initialization goes here 
}

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

那么,“将初始化程序块复制到每个构造函数中”到底意味着什么?根据我的日志,它们似乎是在每个构造函数的开头复制的。是这样的吗?

如果将这些块复制到每个构造函数的末尾(这正是我在匿名2中所期望的),那么在多个构造函数之间共享这样的块也是非常有意义的。是否有一种更多地控制这些块的方法,还是我唯一的选择--编写一个命名的方法,如果我想在每个构造函数的末尾执行公共任务,那么这个方法在每个构造函数中都会被调用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-07 00:54:53

构造函数按以下顺序执行:

  1. super()调用,隐式或显式。
  2. 变量初始化器和初始化器块,按照它们在源代码中出现的顺序。
  3. 构造函数的其余部分。

这是在JLS中指定的,不能更改。

如果存在this()调用,则替换(1)和(2)。

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

https://stackoverflow.com/questions/36464818

复制
相关文章

相似问题

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