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

程序运行不报错,静态代码块可以访问(可以赋值,也可以引用)定义在静态代码块之前的静态变量。

 

posted @ 2021-08-04 17:58  非常非常滴亮  阅读(499)  评论(0)    收藏  举报