Java在任何方法范围之外初始化iVars

时间:2014-03-21 20:01:20

标签: java

Java新手,我对这段代码感到有些困惑:

public class CitiesDialog extends DialogFragment {
    private AsyncHttpClient client = new AsyncHttpClient();
}

客户端正在任何方法的范围之外进行初始化。这到底是什么意思? CititiesDialog的每个实例都有一个单独的客户端对象吗?或者这是某种静态/类变量?

最后,这是Java中的常态吗?初始化构造函数/方法等范围之外的变量......

由于

4 个答案:

答案 0 :(得分:0)

clientCitiesDialog

的实例变量

您制作的每个CitiesDialog都会拥有自己的client

这种初始化只适用于您第一次创建类的实例时。之后您可以更改client

答案 1 :(得分:0)

这在Java中是完全正常的。

你在这里看到的是private AsyncHttpClient,它本身只是一个类变量。

然后您会看到声明new AsyncHttpClient(),该声明已分配给client。对于每个创建的新对象都会发生这种情况。

要解决这是否是常态?我想是的,一个常见的用例是列表,最好尽早初始化它们:

public class A {
    private final List<String> list = new ArrayList<>();
}

这会阻止您稍后获得NPE,因为您忘记声明列表。

另一个有用的方法是声明字段final,如果它在分配后永远不应该被更改,那么编译器也确保该字段在声明或构造函数中被初始化。

答案 2 :(得分:0)

  

CititiesDialog的每个实例都有一个单独的客户端对象吗?

是的,因为它未标记为static

  

这是Java的常态吗?初始化构造函数/方法等范围之外的变量......

它没有异常,特别是如果你有多个构造函数并且不想复制初始化。

答案 3 :(得分:0)

  

最后,这是Java中的常态吗?初始化构造函数/方法范围之外的变量

实际上,这只是语法糖,无需在每个结构中重复相同的初始化。编译时,初始化代码将成为每个构造函数的一部分(除了委托给其他构造函数的那些)。