我是java的初学者,想清楚一下变量初始化的想法。这是代码 -
public class NumberSequence {
private static int n;
public static void main(String[] args) {
print(myTest());
print(myTest());
}
private static int myTest() {
n++;
return n * n;
}
}
连续两次调用方法myTest()输出为1和4.所以我理解n的默认值是0.因此,对于myTest()的第一次调用,n将增加1得到1然后执行乘法线,即1 * 1
1
。
对于myTest()的下一次调用,n最初为1,然后增加到2,然后乘法,即2 * 2
4
现在我正在尝试这样做 -
public class NumberSequence {
public static void main(String[] args) {
int m;
m++;
int n = m * m;
print("n = " + n);
}
}
这里给出了编译器错误,即m未初始化,这是显而易见的。所以我的问题是 - 如果我创建了myTest()方法的第一个选项,编译器怎么不抱怨。我没有初始化n
的值。是编译器正在进行初始化的情况吗?我想澄清一下。
答案 0 :(得分:3)
默认情况下,所有课程或实例 字段 都会初始化为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;
答案 1 :(得分:2)
编译器是否正在进行初始化?
n
是NumberSequence
类的静态字段,默认情况下会初始化为零,如果您未初始化的话。但是,m
是方法局部变量,您需要显式初始化它。
答案 2 :(得分:1)
由于编译器无法检查编译时是否初始化static
变量,因此它为它们提供了初始值。
另一方面,本地变量应该并且必须在之前初始化,并且编译器可以为您检查这些变量,并且如果它们&#将出现错误39;不是。
请注意,变量已初始化,因为它是类成员,因此它获取了默认值,int
为0。
答案 3 :(得分:0)
我认为static关键字默认为n为0.在你的第二个程序中,你只需要" int m"