为什么实例变量在java中有默认值?

Shi*_*lla 23 java class

为什么在类中声明的变量具有默认值,但在方法中声明的变量(称为"局部变量")在Java中没有默认值?

例如

class abc
{
   int a;

   public static void main(String ss[])
   {
        int b;

          abc aa=new abc();
          System.out.println(aa.a);
          System.out.println(b);
    }
 }
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,变量的a默认值为0,但变量b会给出错误,表明它可能尚未初始化.

Ash*_*ani 15

所有成员变量都必须加载到堆中,因此在创建类的实例时必须使用默认值初始化它们.在局部变量的情况下,它们不会被加载到堆中,它们存储在堆栈中,直到它们在java 7之前被使用,因此我们需要显式初始化它们.现在,"Java Hotspot Server Compiler"执行"转义分析",并决定在堆栈而不是堆上分配一些变量.

  • 我认为这里有一个巨大的误解。我不是专门谈论 Java 7 或转义分析。随便吧。我放弃这个,希望人们不要混淆。 (2认同)
  • “在 Java 7 之前使用它们之前加载到堆栈中”是没有意义的,而“所以我们需要显式初始化它们”是*非必然*。这里没有任何东西可以真正回答这个问题。前两句只是重述,剩下的只是一堆乱七八糟的胡扯。最后一句无关紧要。@BrunoReis 我完全同意。 (2认同)