Java中的特殊作用域

6

我正在浏览Android源代码,只是简单地阅读它,然后发现在Android.Util.JsonReader中有一段奇怪的代码。它如下所示:

private final List<JsonScope> stack = new ArrayList<JsonScope>();
{
    push(JsonScope.EMPTY_DOCUMENT);
}

这到底是在做什么呢?也就是说,紧跟在new赋值后面的范围是什么?如果我理解正确,每当这个类JsonReader被实例化时(不是静态的,对吗?),stack将在此处初始化,而不是通过构造函数中的this.stack = ...进行初始化,对吗?
那么这个范围具体起什么作用?在stack初始化之后执行吗?我对这个模式的名称及其使用有点困惑。
1个回答

5

那么是什么触发它的?可以有多个不同的触发器,可能是在不同的类字段之后吗? - Josh
谢谢,这些链接很棒。不过我有一个问题,为什么它会立即出现在那个特定的字段后面?这只是针对这个类吗?在构造函数之前,有大约6个字段跟在“stack”后面,之前也有大约同样数量的字段。 - Josh
2
我认为它只是在那里,因为它通过push调用操作堆栈字段。 - Jens Schauder
你说得对,push 看起来只是执行了 stack.add(...)。那么,最后一个问题,这个操作会在所有字段初始化之后执行吗?还是会按照自上而下的方式进行,也就是先初始化前7个字段,然后执行作用域,再初始化接下来的6个字段? - Josh
1
它将以自上而下的方式发生。请参见第二个链接中的步骤5。 - Jens Schauder
第一个链接中的引用“实例初始化器允许通过关键字this(§15.8.3)引用当前对象,使用关键字super(§15.11.2,§15.12),并使用任何作用域内的类型变量。”让我相信,即使可以使用thissuper,但也可能有点危险,因为某些“较低”的字段可能尚未初始化? - Josh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接