2011-03-17 37 views
2
  1. 在字段声明中同时赋值给字段
  2. 在构造函数中为字段赋值?

回答

7

什么是这两种方法来初始化Java字段之间的区别?

不多!主要的区别是,如果你在声明中对分配给它,它适用于所有构造。也就是说,你不可能忘记将初始化添加到任何未来的构造函数中。

看一看官方Initializing Fields踪迹。

可能值得注意的是,如果您在声明中初始化字段,则在构造函数开始执行之前发生之前

作为一个经验法则,我通常在声明初始化“死简单的”字段(当这是毫无疑问的初始值应该是多少)。这虽然好像有,我可以在不同的构造需要不同的行为丝毫的机会,我把它留给构造“清理”例如

class SomeClass { 

    List<Integer> currentNumbers = new ArrayList<Integer>(); 
    int counter = 0; 

    // ... 
} 

+0

另一个区别可能是字段初始化的顺序。 – 2011-03-17 07:48:57

+0

@Grzegorz,你是什么意思? – aioobe 2011-03-17 07:52:08

+2

请注意,它发生在构造函数的真实主体开始执行之前,但*在任何对“super(...)'的调用之后。 – 2011-03-17 07:55:11

4

在这两种情况下,只有在超类构造函数执行之后才会赋值

对于第一种选择,你必须要能够确定不参考任何构造函数的参数值。

对于第二个选项,您需要为每个构造函数重载分配中的值。

基本上,我倾向于当值取决于构造函数的参数第二个选项(通常这就是我希望它依赖)和当值将是任何新初始化的情况下是相同的第一个选项。我倾向于不要混搭单个字段,使用的声明和在一些构造函数重载分配给它的初始化,但即使这可能是有用的偶然。 (想象一下,这对于大多数构造一个大小为0的集合,而是有一个构造函数接受一个初始值集合。)

虽然你可以参考其他实例成员变量声明,我不喜欢 - 调用实例方法时,你的目标只是部分初始化是脆的,并参考其他变量依赖于变量排序,这感觉丑陋的我。

+2

你的第二个陈述是错误的。我可以做'int i = 1; int j = i;'。 – aioobe 2011-03-17 07:49:49

+0

@aioobe:Ick。谢谢,会改正。 (你不能在C#中,这使我困惑。) – 2011-03-17 07:51:13

1

(1)是一个语法糖(2)(与静态字段除外)

0

它确实完全一样,只是在对象的实例化的生命周期不同的时间。看看here了解更多信息。

0

在第一种情况下,当类被初始化的字段将被创建和分配直接与你脑水肿宣布了它的价值,而在第二种情况下,现场将被创建并分配一个默认值(NULL,如果它是一个对象,如果它是一个int等,则为0),然后在执行构造函数时分配正确的值。当然,实际上对于你来说通常没有太大的区别,因为在这两种情况下的结果是相同的:当你在构造函数返回后创建这个类的实例时,字段被正确初始化。我猜如果你有多个构造函数和一个字段应该有相同的值,而不管哪个构造函数被调用,第一种方法会更有用。

相关问题