java中的变量初始化
我是java初学者,我想澄清一下变量初始化的概念。这是密码-- 通过连续两次调用myTest()方法,输出为1和4。所以我知道n的默认值是0。因此,对于myTest()的第一次调用,n将增加一个结果1,然后执行乘法行,即java中的变量初始化,java,initialization,Java,Initialization,我是java初学者,我想澄清一下变量初始化的概念。这是密码-- 通过连续两次调用myTest()方法,输出为1和4。所以我知道n的默认值是0。因此,对于myTest()的第一次调用,n将增加一个结果1,然后执行乘法行,即1*1,即1 对于myTest()的下一次调用,n最初是1,然后它将增加到2,然后是乘法,即2*2,即4 现在我正努力做到这一点-- 这里它给出了编译器错误,即m未初始化,这是显而易见的。所以我的问题是——在我创建myTest()方法的第一个选项中,编译器为什么不抱怨呢。在这里,
1*1
,即1
对于myTest()的下一次调用,n最初是1,然后它将增加到2,然后是乘法,即2*2
,即4
现在我正努力做到这一点--
这里它给出了编译器错误,即m未初始化,这是显而易见的。所以我的问题是——在我创建myTest()方法的第一个选项中,编译器为什么不抱怨呢。在这里,我不初始化n
的值。是编译器在进行初始化吗?我想得到澄清
是编译器在进行初始化吗
n
是NumberSequence
类的静态字段,如果未初始化,则默认情况下将用零初始化。但是,m
是一个方法局部变量,您需要显式初始化它
是编译器在进行初始化吗
n
是NumberSequence
类的静态字段,如果未初始化,则默认情况下将用零初始化。但是,m
是一个方法局部变量,您需要显式初始化它 我认为static关键字默认为n为0。在你的第二个程序中,你只有“int m”我认为static关键字默认为n为0。在第二个程序中,您只有“int m”,因为编译器无法检查静态变量是否在编译时初始化,它会为它们提供初始值
另一方面,局部变量应该而且必须在使用前进行初始化,编译器可以为您检查这一点,如果不进行初始化,则会出现错误
请注意,该变量是初始化的,因为它是一个类成员,因此它将获得其默认值,int
s的默认值为0。由于编译器无法检查静态
变量是否在编译时初始化,因此它将为它们提供初始值
另一方面,局部变量应该而且必须在使用前进行初始化,编译器可以为您检查这一点,如果不进行初始化,则会出现错误
请注意,该变量是初始化的,因为它是一个类成员,因此它将获得其默认值,int
s的默认值为0。默认情况下,所有类或实例字段都初始化为0、0.0、null
等。
默认情况下,所有局部变量都不会初始化
public class NumberSequence {
// Static field is initailized to 0 by default
private static int n;
public static void main(String[] args) {
// Quite OK: n being a static field is initialized to zero
n = n * n;
// local variable, aren't initialized
// (so it contains trash)
int m;
// Attempt to use trash value (since m hasn't been initialized so far)
// results in compiler warning/error
int n = m * m;
默认情况下,所有类或实例字段都初始化为0、0.0、null
等。
默认情况下,所有局部变量都不会初始化
public class NumberSequence {
// Static field is initailized to 0 by default
private static int n;
public static void main(String[] args) {
// Quite OK: n being a static field is initialized to zero
n = n * n;
// local variable, aren't initialized
// (so it contains trash)
int m;
// Attempt to use trash value (since m hasn't been initialized so far)
// results in compiler warning/error
int n = m * m;
问题是为什么?:)我没有投反对票。@Sanbhat:我的解释有什么问题?@Sanbhat我想问题是“为什么编译器没有抱怨”,答案是“变量初始化为零”。为什么静态变量初始化为零似乎是另一个问题。你的答案没有错(因此我没有投反对票)。我想OP想知道为什么未初始化的实例变量是可以的?我认为OP知道如果uninitialized@KugathasanAbimarann
初始化为零,因为它是静态字段,而不是实例字段。问题是为什么?:)我没有投反对票。@Sanbhat:我的解释有什么问题?@Sanbhat我想问题是“为什么编译器没有抱怨”,答案是“变量初始化为零”。为什么静态变量初始化为零似乎是另一个问题。你的答案没有错(因此我没有投反对票)。我想OP想知道为什么未初始化的实例变量是可以的?我认为OP知道如果uninitialized@KugathasanAbimarann
初始化为零,因为它是一个静态字段,不是一个实例字段。请看,您可能还想看我猜这个问题已经问过了:请看,您可能还想看,我猜这个问题已经问过了:它与静态
无关。任何字段、static
或普通的非static
实例字段都是用变量类型的默认值初始化的。@ErwinBolwidt我没有引用实例字段。请看问题和我的答案。@marounnaround完全正确,这就是问题所在。您说过“由于编译器无法检查静态变量是否在编译时初始化,因此它会为静态变量提供初始值。”但是编译器为它们提供初始值的事实与变量是静态的这一事实无关。@ErwinBolwidt但是static
变量被初始化,即使它们在一个方法中:)我所说的没有错,但会添加注释。这与静态
无关。任何字段、static
或普通的非static
实例字段都是用变量类型的默认值初始化的。@ErwinBolwidt我没有引用实例字段。请看问题和我的答案。@marounnaround完全正确,这就是问题所在。您说过“由于编译器无法检查静态变量是否在编译时初始化,因此它会为静态变量提供初始值。”但是编译器为它们提供初始值的事实与变量是静态的这一事实无关。@ErwinBolwidt但是static
变量被初始化,即使它们在一个方法中:)我说的没有错,但是会的
public class NumberSequence {
// Static field is initailized to 0 by default
private static int n;
public static void main(String[] args) {
// Quite OK: n being a static field is initialized to zero
n = n * n;
// local variable, aren't initialized
// (so it contains trash)
int m;
// Attempt to use trash value (since m hasn't been initialized so far)
// results in compiler warning/error
int n = m * m;