实例变量初始化的位置

public class Ex { int a; public Ex() { System.out.println("a is "+a); } } 

输出为:a为0

初始化的地方……

我知道int的默认值是零。我的问题是它在哪里被初始化…通过默认构造函数?(我听说默认构造函数是在我们没有提到类中的任何构造函数时创建的)

如果你没有把自己初始化(它是一个原始值),它会自动初始化为它的默认值,在这种情况下为0。

阅读4.5.5节。 ( 本文档中的变量的初始值)。

其默认值为0。

来自The Java™Tutorials – 原始数据类型 – 默认值 :

声明字段时并不总是需要分配值。 声明但未初始化的字段将由编译器设置为合理的默认值。

 ╔══════════════════════════╦════════════════════════════╗ ║ Data Type ║ Default Value (for fields) ║ ╠══════════════════════════╬════════════════════════════╣ ║ byte ║ 0 ║ ║ short ║ 0 ║ ║ int ║ 0 ║ ║ long ║ 0L ║ ║ float ║ 0.0f ║ ║ double ║ 0.0d ║ ║ char ║ '\u0000' ║ ║ String (or any object) ║ null ║ ║ boolean ║ false ║ ╚══════════════════════════╩════════════════════════════╝ 

绝对不在默认构造函数中。 根据JLS,在任何构造函数调用之前,它都是作为类实例创建表达式(当您执行new ClassName... )的评估的一部分。 来自JLS,Java SE 8 Edition,15.9.4 :

接下来,为新的类实例分配空间。 如果没有足够的空间来分配对象,则通过抛出OutOfMemoryError突然完成对类实例创建表达式的求值。

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

接下来,从左到右评估构造函数的实际参数。 如果任何参数评估突然完成,则不会计算其右侧的任何参数表达式,并且出于同样的原因,类实例创建表达式会突然完成。

接下来,调用指定类类型的选定构造函数。 这导致为类类型的每个超类调用至少一个构造函数。 此过程可以由显式构造函数调用语句(第8.8节)指导,并在第12.5节中详细说明。

int的默认值为0

请参阅此链接以根据类型查找不同的默认值。( Default Values部分)

a未被初始化,因此它给出零值,因为int的默认值为0。

a具有原始类型int 。 在您的代码中,a未初始化,默认值为0

在java实例中,变量将从构造函数初始化(默认情况下,如果没有)。

 public class TestFile { String x = null; int y = x.length(); public TestFile() { // TODO Auto-generated constructor stub } /** * @param args */ public static void main(String[] args) { TestFile tf = new TestFile(); } } 

你会得到一个堆栈跟踪

 Exception in thread "main" java.lang.NullPointerException at TestFile.(TestFile.java:7) at TestFile.main(TestFile.java:16) 

在构造函数中调用。
对于静态字段,在类加载期间初始化