我对类的变量初始化有疑问。 当通常用变量声明一个类并且我初始化时(即使它们是最终的)我是通过构造函数来完成的。
例如:
class Example {
private int a, b;
public Example () {
a = 5;
b = 10;
}
// Methods
}
但你也可以在声明后立即发起。
例如:
class Example {
private int a = 5, b = 10;
// Methods
}
初始化变量的最佳方法是什么?有什么区别?
答案 0 :(得分:0)
class Foo {
String username = "user";
String password = null;
}
在功能上等同于
class Foo {
String username, password;
Foo() {
username = "user";
passowrd = null;
}
}
但是,请考虑一种情况,稍后您需要添加另一个构造函数:
public Foo(String password) {
this.password = password;
}
现在,有人打电话给new Foo("mypasswd")
,有可能让username
未初始化。如果在声明成员变量时对它们进行初始化,那么无论如何创建类的实例,它们都将被初始化(除了反序列化,这是一个单独的故事!)。如果在默认构造函数中初始化它们,那么所有其他构造函数需要显式调用它或者负责初始化变量本身。
建议在声明它们时始终为所有变量赋予某种初始值,以减少意外和不可预测行为的可能性。
答案 1 :(得分:-1)
初始化第一种方式的变量将在init<>时获得它们的值。方法运行。以第二种方式初始化的变量将在执行构造函数时获得它们的值。对于像这样的简单用例,没有有效的区别,但是如果你有多个构造函数或对象生命周期中发生的“有趣”事情,那就很重要了。没有永远更好的方法。
(你会得到不同行为的一个例子是,如果一个超类'构造函数 - 必须在子类之前运行 - 使用反射基于实例字段变量以某种方式进行操作。这不是一个非常常见的事情需要发生了,但它是我所说的“有趣”的一个例子......)