public class TestIf {
public static void main(String[] args) {
int i = 30;
int j;
if(i > 20) {
j = 10;
System.out.println("j=" + j);
}
}
}
程序编译成功,并运行输出10,为什么j没被初始化就能使用??既然j能在IF方法中才被初始化,并输出,为什么第二个不行?public class TestIf {
public static void main(String[] args) {
int i = 30;
int j;
if(i > 20) {
j = 10;
}
System.out.println("j=" + j);
}
}
程序编译失败,显示:可能尚未初始化变量j。为什么上面的能成功编译,下面的不行?public class TestIf {
public static void main(String[] args) {
int i = 30;
int j = 3;
if(i > 20) {
j = 10;
}
System.out.println("j=" + j);
}
}
程序编译成功,并运行输出10.   第一个程序,j是在IF方法中才被初始化赋值,并在方法中用System.out.println输出值10,但在第二个程序中,System.out.println不在IF方法内,编译不成功,显示j未被初始化。第三个程序,System.out.println在IF方法外,但j早已被初始化为3,并在IF方法内被赋值10,跟着被输出10.

解决方案 »

  1.   

      使用变量就必须初始化,在第一个程序中,犹豫j的初始化和System.out.println("j="+j)在同一语句块内,所以调用System.out.println("j="+j)的时候,j一定被初始化;
      但是第二个程序 调用System.out.println("j="+j)的时候j不一定被初始化,因此编译失败,第三个同理。
      

  2.   

    想问下楼上的,在第二个程序中,j经过IF方法后不是被初始化了吗,为什么出了IF的方法体后就不能用System.out.println输出??而被初始化才能被使用,是说在被方法使用前初始化,还是可以在使用中初始化,如果可以在使用中被初始化,那这个初始化出了方法体是否仍然有效?
      

  3.   

      在第二个程序中编译器是不会像人脑那样去判断是否一定会执行if里面的语句,编译的目的是生成class文件,并且优化代码。
       第二个程序明显有2种执行路径,就是在if那里,而如果没有执行if,然后System.out.println("j="+j)。这样是不合法的,因为j没初始化。
      

  4.   

    我说的是 编译,不是运行。
     在java中,int j,算定义吧,和C有点区别。