1 public class Test{
2
3 static {
4 b = 9;
5 System.out.println(b+"------------");
6 }
7 static int a = 1;
8 static int b;
9 static int c = 1;
10 public static void main(String[] args){
11 System.out.println("a="+a+":b="+b+":c="+c);
12 }
13 }
这个程序编译会出错,再第5行为什么?
2
3 static {
4 b = 9;
5 System.out.println(b+"------------");
6 }
7 static int a = 1;
8 static int b;
9 static int c = 1;
10 public static void main(String[] args){
11 System.out.println("a="+a+":b="+b+":c="+c);
12 }
13 }
这个程序编译会出错,再第5行为什么?
因为静态变量有申明顺序,你可以假设这些静态变量方法放在一个函数内运行,是不是没申明的变量就不能使用哪
静态块一般用于类中只执行一次的东西,而且在类加载时就执行。比如JDBC的加载连接驱动。
4 b = 9;
5 System.out.println(b+"------------");
6 }
这是什么?方法?类?什么都不是·!
这个是方法,JVM会使用一个叫做clinit方法名的方法来执行其中的指令,而且这段执行的时间比较早,在类加载进JVM后,初始化的时候就会执行,在所有方法之前,包括main方法。
而你的静态变量是在静态块中初始化的而不是声明的,因为会出错:
Cannot reference a field before it is defined
感觉就是定义与申明的区别。就好比你定义一个变量(如int a;)然后System.out.println(a);就会报错 .static{
int a = b = 9; //这样就不会
//int a = b; //同样报错
System.out.println(b + "++++++");
}
int a = b = 9; //这样就不会
//int a = b; //同样报错
System.out.println(a + "++++++");
}
System.out.println(b + "++++++");的b应该是a才对
1、类先初始化了a、b、c,值为0;
2、在静态块里给b赋值为9,执行完静态块会继续给a、b赋值;
3、System.out.println(b+"------------"); 因为在“b”使用前在程序中没有声明,所以报错。
4、如果在改为System.out.println(Test.b+"------------"); 这样编译器会找到Test类中声明变量“b”的地方,所以就不会报错。个人观点:在静态块中引用的变量必须先声明,或者加上类名,或者使用类中的方法调用,编译器就会找到变量的声明位置了。大家继续讨论