2

可能重复:
我应该在构造函数内还是在构造函数外初始化变量

例如我有一个字段int x。Java 是否更喜欢在声明字段时对其进行初始化

int x = 0;

还是在构造函数中?

public foo() {
x = 0;
}

从设计的角度来看,哪个更受欢迎?

4

6 回答 6

1

两者都很好,只要你知道会发生什么。

它们将被初始化的顺序是这样的:

  1. 班级成员(如public int x = 0;:)
  2. 构造函数(如this.x = 0;:)

但是,将整数初始化为零是无操作的。Java 会自动执行此操作。

一个小演示来演示忽略初始化顺序的错误:

class Foo
{
    public String str;
    public String strTwo = "Here is str: " + str;

    public Foo()
    {
        str = "Java";
        System.out.println(strTwo);
    }
}

这将打印Here is str: null.

于 2012-12-28T13:22:45.047 回答
0

公共 foo() { x = 0; }

这会很好。如果你使用这个 int x =0 它将适用于所有对象。但构造函数表示法适用于由该特定构造函数创建的对象。

于 2012-12-28T13:21:09.673 回答
0

原始类型的实例变量被隐式初始化,而引用变量被赋予空值。

所以如果你想像 ::

int x=0;

对于所有对象,它将是 x=0。

但是对于构造函数,您可以在不同的构造函数中使用不同的值初始化它们,尽管在不同的构造函数中使用不同的值进行初始化并不是一个好习惯。

于 2012-12-28T13:21:25.760 回答
0

Java 更喜欢在声明字段时还是在构造函数中初始化字段?

如果您使用默认值进行初始化,那么在构造函数或声明时进行初始化都是多余的。

但是,如果您想使用不同于默认值的值进行初始化,则应使用构造函数而不是声明。

从设计的角度来看,哪个更受欢迎?

从设计的角度来看,完全没有区别。它是实现细节。

于 2012-12-28T13:23:08.413 回答
0

我的偏好是在构造函数之外初始化默认值,例如

int x=0;

因此,如果您有多个构造函数和大量实例变量,您就不会忘记初始化。如果我需要变量的特定值,那么我将在构造函数中重新初始化。

于 2012-12-28T13:24:24.150 回答
0

据我回忆,编译器在两种情况下生成的字节码几乎相同,这实际上只是偏好和编码风格的问题。就个人而言,我倾向于在构造函数中初始化变量——在某些情况下,无论如何你都必须在构造函数中初始化变量(例如将参数传递给构造函数时),这意味着你只需要查看一个地方就可以理解发生了什么,而不是2。

(附带说明 - 在您的示例中,无需执行“int x = 0”,因为定义“int x;”将自动将其设置为 0。)

于 2012-12-28T13:24:41.713 回答