Java新手,我对这段代码感到有些困惑:
public class CitiesDialog extends DialogFragment {
private AsyncHttpClient client = new AsyncHttpClient();
}
客户端正在任何方法的范围之外进行初始化。这到底是什么意思? CititiesDialog的每个实例都有一个单独的客户端对象吗?或者这是某种静态/类变量?
最后,这是Java中的常态吗?初始化构造函数/方法等范围之外的变量......
由于
答案 0 :(得分:0)
client
是CitiesDialog
您制作的每个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中的常态吗?初始化构造函数/方法范围之外的变量
实际上,这只是语法糖,无需在每个结构中重复相同的初始化。编译时,初始化代码将成为每个构造函数的一部分(除了委托给其他构造函数的那些)。