0

我对类变量的初始化有疑问。当通常用变量声明一个类并且我初始化(即使它们是最终的)时,我通过构造函数来完成它。

例如:

class Example {
    private int a, b;
   
    public Example () {
        a = 5;
        b = 10;
    }

    // Methods
}

但您也可以在声明后立即启动。

例如:

class Example {
    private int a = 5, b = 10;
   
    // Methods
}

初始化变量的最佳方法是什么?有什么不同?

4

2 回答 2

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未初始化的风险。如果您在声明成员变量时对其进行初始化,则无论类的实例是如何创建的,它们都将始终被初始化(反序列化除外,这是一个单独的故事!)。如果您在默认构造函数中初始化它们,那么所有其他构造函数都需要显式调用它或自行初始化变量。

建议在声明所有变量时始终为它们赋予某种初始值,以减少意外和不可预知行为的可能性。

于 2015-01-13T02:32:14.403 回答
-1

以第一种方式初始化的变量将在运行 init<> 方法时获取它们的值。第二种方式初始化的变量会在构造函数执行时得到它们的值。对于像这样的简单用例,没有有效的区别,但如果您有多个构造函数或对象生命周期中发生的“有趣”事情,这可能很重要。没有永远更好的方法。

(如何获得不同行为的一个示例是,如果超类的构造函数(必须在子类之前运行)使用反射以某种方式基于实例字段变量进行操作。这不是一件很常见的事情,需要发生,但这是我所说的“有趣”的一个例子......)

于 2015-01-13T02:15:36.400 回答