Java中私有字段的默认初始化

时间:2018-06-14 16:10:17

标签: java

假设我有一个名为Person的课程:

SELECT Table1.UserID, COUNT(DISTINCT Table1.TheDate) AS NumDates FROM Table1;

当调用Person类的空构造函数时,Java会先将num初始化为默认值零,然后将num赋值为1吗?或者Java会立即将num初始化为1吗?除非你使用初始化语法,否则C ++不会做前者吗?

谢谢!

3 个答案:

答案 0 :(得分:13)

首先将值赋值为零。

如果你在字段声明之前放了一些东西,你可以看到:

class Person{
    { print(); }
    private int num = 1;
    { print(); }

    void print() {
      System.out.println(num);
    }
}

这将打印:

0
1

JLS Sec 4.12.5

中对此进行了描述
  

每个类变量,实例变量或数组组件在创建时都使用默认值进行初始化

Sec 15.9.4(强调添加,部分省略):

  

新对象包含在指定类类型及其所有超类中声明的所有字段的新实例。 在创建每个新字段实例时,会将其初始化为其默认值(§4.12.5)

     

...

     

接下来,调用指定类类型的选定构造函数 ...

换句话说,对象创建和构造函数调用是不同的操作,并且在调用构造函数之前将字段初始化为其默认值。

实际的字段初始化发生在构造函数中:字段初始化内联到调用super(...)之后立即调用super(...)的每个构造函数。以下完全等同于上述内容:

 class Person{
   private int num;

   Person() {
     super();
     print();
     num = 1;
     print();
   }

   void print() {
     System.out.println(num);
   }
}

尽管声明字段final会产生此代码的输出,但有一个微妙的要点:

1
1

这并不意味着最终变量会更早初始化。在这种情况下发生的所有变化都是num已成为编译时常量表达式,因此内联。因此,print()实际上将执行:

System.out.println(1);

换句话说,它根本不读取该字段。

答案 1 :(得分:0)

关于Java Docs

编译器将声明但未初始化的字段设置为合理的默认值。

考虑到这种说法,我会说Java将立即分配价值。

答案 2 :(得分:0)

boolean false
byte    (byte) 0
short   (short) 0
int 0
long    0L
char    \u0000
float   0.0f
double  0.0d
object reference    null

以下是Java的所有默认值。默认情况下,这将是init的任何变量。因此,通过Andy的回答,我可以得出结论,它将始终为0,然后它将按照您给变量赋予的值。