static静态代码块中的引用问题
在静态代码块中,可以对类中定义的静态变量进行赋值,但是如果要引用则可能出现问题,查看如下代码:
1 package com.xjl; 2 3 /** 4 * 测试静态代码块中的引用问题 5 */ 6 public class StaticTest { 7 8 static{ 9 a = 10; 10 System.out.println(a); 11 } 12 private static int a = 1; 13 14 public static void main(String[] args) { 15 System.out.println(a); 16 } 17 }
上面的代码在编译期就会报错"Illegal forward reference",非法的向前引用。这是因为:静态代码块只能访问定义在静态代码块之前的静态变量,而对于定义在静态代码块之后的静态变量,可以进行赋值而不能访问。
如果注释掉静态代码块中的输出语句,代码如下:
1 public class StaticTest { 2 3 static{ 4 a = 10; 5 //System.out.println(a); 6 } 7 private static int a = 1; 8 9 public static void main(String[] args) { 10 System.out.println(a); 11 } 12 }
结果输出:1
这是因为类在加载--》链接的准备阶段,会对静态变量a分配内存空间,并赋初始默认值0(int的默认值),然后初始化时执行静态代码块的a=10的赋值,接着执行静态变量的赋值,a=10会被a=1覆盖掉,故最后输出的是1。
如果代码改成这样:
1 public class StaticTest { 2 3 private static int a = 1; 4 static{ 5 a = 10; 6 System.out.println(a); 7 } 8 9 public static void main(String[] args) { 10 System.out.println(a); 11 } 12 }
输出结果:
10
10
程序运行不报错,静态代码块可以访问(可以赋值,也可以引用)定义在静态代码块之前的静态变量。

浙公网安备 33010602011771号