三个小程序.分别说出答案和为什么
1:
public class test{ static{
i=9;
}
static int i=0;
public static void main(String args[]){
System.out.println("i="+i);
}
}
2:
public class test{ static {
i=9; }
static int i; public static void main(String args[]){
System.out.println("i="+i);
}
}
3.
public class test{ static {
i=i+9; }
static int i; public static void main(String args[]){
System.out.println("i="+i);
}
}
1:
public class test{ static{
i=9;
}
static int i=0;
public static void main(String args[]){
System.out.println("i="+i);
}
}
2:
public class test{ static {
i=9; }
static int i; public static void main(String args[]){
System.out.println("i="+i);
}
}
3.
public class test{ static {
i=i+9; }
static int i; public static void main(String args[]){
System.out.println("i="+i);
}
}
Cannot reference a field before it is defined.
首先,java的初始化顺序是这样的,先把类变量进行初始化,但是还不去赋值,这好像是我从哪篇文章上看来的。
然后是初始化类模块,然后再去给类变量赋值你的第一个是0,就是这个道理,第二个是9,也是这个道理,第三个呢,出错,因为i此时并没有值,你对地址进行了操作
所以会报错。
闲来无事,研究了一下,呵呵,可能说得难免有错误,还请指正
public class test{ static{
i=9;
}
static int i=1; //注意 这里为了解释的时候清楚一点 我改成1
public static void main(String args[]){
System.out.println("i="+i);
}
}
先声明成员 给它们一个默认值 然后再进行初始化
所以在执行static int i=1; 的时候
只是声明了一个变量i 它现在的值是JVM默认加给它的0。而后面的 = 1; 初始化赋值这个时候还没有没有执行
在变成声明完成了以后,就会按顺序执行static修饰的东西了。
所以先执行
static{
i=9;
}
把i的值从0改成了9
再接着 又到了static int i=1;
这时才是初始化,把1的值赋给了i
所以输出看到的是1再来看第二个
public class test{ static{
i=9;
}
static int i;
public static void main(String args[]){
System.out.println("i="+i);
}
}
一开始和第一个是一样的。
在执行了static后把i的值从0改成了9
这时再次执行了static int i; 发现没有显式的给它提供初始值。所以不做任何操作
所以i的值还是9第三个就不知道了。。 也跟着学习
如果哪里说错了楼主不要怪我啊 我也是个菜鸟