当我尝试编译这个:
public static Rand searchCount (int[] x) { int a ; int b ; ... for (int l= 0; l我收到这些错误:
Rand.java:72: variable a might not have been initialized a++ ; ^ Rand.java:74: variable b might not have been initialized b++ ; ^ 2 errors在我看来,我在方法的顶部初始化它们.什么出错了?
1> mipadi..:你声明了它们,但你没有初始化它们.初始化它们将它们设置为等于值:
int a; // This is a declaration a = 0; // This is an initialization int b = 1; // This is a declaration and initialization您得到错误是因为您没有初始化变量,但是
a++
在for
循环中递增它们(例如).Java原语具有默认值,但是作为一个用户在下面评论
声明为类成员时,它们的默认值为零.局部变量没有默认值
也许"int b = 0;" 是"声明和初始化".
有人可以解释这是怎么可能的,因为原语不能有空值,它们的默认值是0,为什么它没有显示初始化错误?
@SrujanBarai当声明为类成员*时,它们的默认值为零*.局部变量没有默认值.
2> 小智..:局部变量不会获得默认值.它们的初始值是未定义的,没有通过某种方式分配值.在使用局部变量之前,必须初始化它们.
在类级别(作为成员,即作为字段)和方法级别声明变量时,存在很大差异.
如果在类级别声明字段,则会根据其类型获取默认值.如果在方法级别或作为块声明变量(意味着{}内的任何代码),则不会获取任何值并保持未定义,直到他们获得一些起始值,即分配给它们的某些值.
3> Roman..:如果它们被声明为类的字段,那么它们将真正初始化为0.
你有点困惑,因为如果你写:
class Clazz { int a; int b; Clazz () { super (); b = 0; } public void printA () { sout (a + b); } public static void main (String[] args) { new Clazz ().printA (); } }然后此代码将打印"0".这是因为在创建Clazz的新实例时将调用一个特殊的构造函数.首先
super ()
将被调用,然后a
将隐式初始化字段,然后b = 0
执行行.