Java 初始化实例变量的位置

Java 初始化实例变量的位置,java,Java,输出为:a为0 在初始化的地方 我知道int的默认值是零。我的问题是它在哪里初始化。通过默认构造函数?(我听说默认构造函数是在我们没有提到类中的任何构造函数时创建的)如果你没有自己初始化a(它是一个基本值),它会自动初始化为默认值,在本例中为0 请参阅第4.5.5节。(变量的初始值)在。中,其默认值为0 发件人: 声明字段时并不总是需要赋值。已声明但未初始化的字段将由编译器设置为合理的默认值 public class Ex { int a; public Ex() { S

输出为:a为0

在初始化的地方


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

如果你没有自己初始化
a
(它是一个基本值),它会自动初始化为默认值,在本例中为0


请参阅第4.5.5节。(变量的初始值)在。

中,其默认值为0

发件人:

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

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

int
的默认值为0


请参阅以根据类型找出不同的默认值。(
默认值
部分)

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

a
有一个基本类型
int
。在您的代码中,默认值为
0

的未初始化a肯定不在默认构造函数中。根据JLS,它发生在任何构造函数调用之前,作为类实例创建表达式求值的一部分(当您执行
newclassname…
)。发件人:

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

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

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

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

在代码中提供了构造函数(如果没有)

如果类不包含构造函数 声明,然后是默认值 不带参数的构造函数 自动提供:如果 被声明的类是原始类 类对象,然后是默认值 构造函数的主体为空。 否则,默认构造函数 不接受任何参数,只调用 没有 论据


在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();  
   }  
}  
线程“main”java.lang.NullPointerException中的异常 在TestFile.(TestFile.java:7) 位于TestFile.main(TestFile.java:16) 在构造函数中调用。

对于静态字段,在类加载期间进行初始化。否,在上写入特定的构造函数时,没有默认构造函数。但是在调用任何构造函数之前,字段都会被初始化。初始化字段后,将运行初始值设定项({..some code..}块),并最终执行构造函数。

如果您没有声明一个零参数构造函数,并且您的类没有构造函数,java将为您创建一个默认的零参数构造函数


至于您的基元类型,一旦声明,它在使用之前就用默认值初始化(如果未初始化)。

基元在调用构造函数之前初始化。

当Java为类分配内存时发生。它使用默认值填充所有字段

为什么
a
具有初始值的原因写在:

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

a
是一个实例变量(非静态字段),因此它有一个初始值。还指定了值本身:

对于int类型,默认值为零,即0

可能有意思的是,对于局部变量(方法体中声明的变量),这是不同的:

在使用局部变量之前,无论是通过初始化还是赋值,都必须显式地给它一个值,这种方式可以由编译器使用确定赋值规则进行验证


因此,如果您读取的局部变量尚未初始化或尚未在代码中“设置”,编译器将给出一个错误。

如果您指定了一个构造函数,但编译器不会创建零参数构造函数。@dimitrisli,true(此处填充空格)“我的问题是在哪里初始化它”(重点添加)@Readwald ok check update:)和Read More也回答了这个问题。我也想过这样测试它,但后来决定咨询JLS。事实证明,这是不正确的,但是默认初始化甚至在构造函数的参数被计算之前就发生了(参见我的答案),即使有显式的初始值设定项(参见此注释中的链接),也会发生。我不知道。。谢谢:-)还要感谢elite先生对代码进行了格式化..我没有真正了解ITreference在同一时刻被初始化为null的诀窍,因此在这里提到原语是有误导性的。确切地说,字段初始值设定项和实例初始值设定项不是在构造函数之前执行的,但是,即使不是第一步。例如,如果构造函数以
super(…)
行开头,则在该行之后执行初始值设定项
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.<init>(TestFile.java:7)  
    at TestFile.main(TestFile.java:16)