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


问题内容

为什么在类中声明的变量具有默认值,但是在方法内部声明的变量(称为“局部变量”)在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);
    }
 }

在上面的示例中,变量的a默认值为0,但是变量b给出了可能尚未初始化的错误。


问题答案:

所有成员变量都必须加载到堆中,因此在创建类的实例时必须使用默认值进行初始化。对于局部变量,它们不会被加载到堆中,直到在Java7之前被使用,它们才会存储在堆栈中,因此我们需要显式初始化它们。现在,“ Java Hotspot
Server编译器”执行“转义分析”,并决定在堆栈而不是堆上分配一些变量。