类的变量初始化

时间:2015-01-13 02:11:28

标签: java variable-initialization

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

例如:

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

    // Methods
}

但你也可以在声明后立即发起。

例如:

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

初始化变量的最佳方法是什么?有什么区别?

2 个答案:

答案 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<>时获得它们的值。方法运行。以第二种方式初始化的变量将在执行构造函数时获得它们的值。对于像这样的简单用例,没有有效的区别,但是如果你有多个构造函数或对象生命周期中发生的“有趣”事情,那就很重要了。没有永远更好的方法。

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