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