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

2022-09-01 23:43:53

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

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


答案 1

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


答案 2

局部变量 初始化

在方法和块中声明的变量称为局部变量。局部变量在方法调用时创建时不会初始化。因此,局部变量在使用之前必须显式初始化。否则,在执行包含方法或块时,编译器会将其标记为错误。

例:

public class SomeClassName{

public static void main(String args[]){
int total;
System.out.println("The incremented total is " + total + 3); //(1)
}
}

编译器抱怨 println 语句 at (1) 中使用的局部变量总计可能未初始化。在使用之前初始化局部变量总计可以解决问题:

public class SomeClassName{

public static void main(String args[]){
int total = 45; //Local variable initialized with value 45 System.out.println("The incremented total is " + total+ 3); //(1)
}
}

字段初始化

如果在声明实例或静态变量时或在初始值设定项块中未提供初始化,则使用其类型的默认值隐式初始化该实例或静态变量。每次实例化类时,都会使用其类型的默认值初始化实例变量,即对于从该类创建的每个对象。静态变量在首次装入类时使用其类型的默认值进行初始化。