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

为什么在java中实例变量有默认值?,java,class,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); } } 在上面的示例中,变

为什么类中声明的变量有默认值,而方法中声明的变量(称为“局部变量”)在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
给出的错误是它可能尚未初始化。

局部变量初始化

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

示例:

public class SomeClassName{

public static void main(String args[]){
int total;
System.out.println("The incremented total is " + total + 3); //(1)
}
}
编译器抱怨(1)处println语句中使用的局部变量total可能未初始化。 在使用前初始化局部变量total可解决此问题:

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)
}
}
字段初始化

如果实例或静态变量在声明时或在初始化程序块中未提供初始化,则它将使用其类型的默认值进行隐式初始化。 每次实例化类时,实例变量都会使用其类型的默认值初始化,即针对从该类创建的每个对象。
静态变量在第一次加载类时使用其类型的默认值初始化。

局部变量初始化

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

示例:

public class SomeClassName{

public static void main(String args[]){
int total;
System.out.println("The incremented total is " + total + 3); //(1)
}
}
编译器抱怨(1)处println语句中使用的局部变量total可能未初始化。 在使用前初始化局部变量total可解决此问题:

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)
}
}
字段初始化

如果实例或静态变量在声明时或在初始化程序块中未提供初始化,则它将使用其类型的默认值进行隐式初始化。 每次实例化类时,实例变量都会使用其类型的默认值初始化,即针对从该类创建的每个对象。
静态变量在第一次加载类时使用其类型的默认值初始化。

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

所有成员变量都必须加载到堆中,以便在创建类的实例时,它们必须用默认值初始化。对于局部变量,在Java7之前使用它们之前,它们不会加载到堆中,而是存储在堆栈中,所以我们需要显式地初始化它们。
现在,“Java热点服务器编译器”执行“转义分析”,并决定在堆栈上而不是堆上分配一些变量;博士:这或多或少是一个武断的选择

如果你问我,Java对实例变量有默认值是一个错误。编译器应该在编译之前强制程序员初始化它,就像局部变量的情况一样

默认值背后的基本原理是安全。当一个对象被实例化时,将为该对象分配一块内存,该对象包含实例变量所指向的位置等。Java设计人员决定用零和空擦除这部分内存是一个好主意。这样,您将永远不会读取在分配对象之前碰巧存在的垃圾。它们可以强制初始化;这个选择没有什么根本性的。它可能使事情易于实现,并且对Java的设计者来说有足够的意义


对于局部变量,设计者选择强制初始化(或者更准确地说,当只声明局部变量时,他们选择不进行任何类型的初始化,因此编译器最合乎逻辑的行为是在使用前强制初始化变量);博士:这或多或少是一个武断的选择

如果你问我,Java对实例变量有默认值是一个错误。编译器应该在编译之前强制程序员初始化它,就像局部变量的情况一样

默认值背后的基本原理是安全。当一个对象被实例化时,将为该对象分配一块内存,该对象包含实例变量所指向的位置等。Java设计人员决定用零和空擦除这部分内存是一个好主意。这样,您将永远不会读取在分配对象之前碰巧存在的垃圾。它们可以强制初始化;这个选择没有什么根本性的。它可能使事情易于实现,并且对Java的设计者来说有足够的意义


对于局部变量,设计人员选择强制初始化(或者更准确地说,当仅声明局部变量时,他们选择不进行任何类型的初始化,因此编译器最合乎逻辑的行为是在使用前强制初始化变量)
       int a = -111;

       5: bipush        -111
       7: putfield      #2                  // Field a:I
        int a = 10;
        0: bipush        10
      15: new           #3                  // class Abc
      18: dup