【问题标题】:variable initialization of a class [duplicate]类的变量初始化[重复]
【发布时间】:2015-03-10 22:11:32
【问题描述】:

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

例如:

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

    // Methods
}

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

例如:

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

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

【问题讨论】:

    标签: java variable-initialization


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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 并非如此。正如您自己所说,超类构造函数在子类中的任何内容之前调用,因此,无论子类如何初始化其成员,通过反射访问它们的超类构造函数总是会看到它们未初始化。
      猜你喜欢
      • 2017-07-26
      • 1970-01-01
      • 1970-01-01
      • 2019-06-17
      • 1970-01-01
      • 2016-11-03
      • 1970-01-01
      • 2017-01-21
      • 2016-12-12
      相关资源
      最近更新 更多