请NB的人帮忙说清楚为什么.

oliveyuganfei 2007-12-29 02:10:32
三个小程序.分别说出答案和为什么
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);

}
}
...全文
161 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
joejoe1991 2007-12-29
  • 打赏
  • 举报
回复
在变成声明完成了以后,就会按顺序执行static修饰的东西了。 -->在变量声明全部完成了以后,就会按顺序执行static修饰的东西了。
joejoe1991 2007-12-29
  • 打赏
  • 举报
回复
我说说我的理解吧。我不肯定的哦。
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

第三个就不知道了。。 也跟着学习
如果哪里说错了楼主不要怪我啊 我也是个菜鸟
oliveyuganfei 2007-12-29
  • 打赏
  • 举报
回复
自己顶,好像现在只有yuwenbao 说的有些道理,Cpp_fan 就是个大SB
isk_java 2007-12-29
  • 打赏
  • 举报
回复
我觉得是顺序初始化。。但在static块里如果遇到没声明的变量,就会先找到该静态变量的声明,只找到它的声明类型,并还没执行此句的赋值。
徒步@天涯 2007-12-29
  • 打赏
  • 举报
回复
Think in Java 中描述:生成那个类的一个对象时,或者首次访问属于那个类的一个static成员时,static块会被执行。

你上面列举的东西看起来确实很神秘的哦,不过在实战中用不到吧...
oliveyuganfei 2007-12-29
  • 打赏
  • 举报
回复
Cpp_fan 你这SB.你来说说
yuwenbao 2007-12-29
  • 打赏
  • 举报
回复
我说一下我的解释,可能有错误的地方啊,
首先,java的初始化顺序是这样的,先把类变量进行初始化,但是还不去赋值,这好像是我从哪篇文章上看来的。
然后是初始化类模块,然后再去给类变量赋值

你的第一个是0,就是这个道理,第二个是9,也是这个道理,第三个呢,出错,因为i此时并没有值,你对地址进行了操作
所以会报错。
闲来无事,研究了一下,呵呵,可能说得难免有错误,还请指正
徒步@天涯 2007-12-29
  • 打赏
  • 举报
回复
路过(程序有错,只有第一个没有错)
Cannot reference a field before it is defined.
Cpp_fan 2007-12-29
  • 打赏
  • 举报
回复
现在的小朋友怎么都这么性急,动不动就什么NB不NB,在学习Java前先学习汉语应该如何向人提问.

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧