class BB
{
static int a = 0 ;
public BB()
{
a++ ;
System.out.println("执行BB" + a) ;
}
public void printA()
{
System.out.println("a= " + a) ;
}
}
public class CC
{
static
{
a = new BB() ;
a.printA() ;
}
static BB a = new BB() ;
public staic void main(String args[])
{
CC c = new CC() ;
}
}
我在静态代码块中已经初始化过了, 为什么还是会报错说非法的前向引用, 这是为什么呢?
参考 Restrictions on the use of Fields during Initialization
只有在全部满足以下4点的情况下,成员变量的
声明
才必须在使用
之前,否则顺序无关a.printA()
出现在静态初始化块中,满足)a.printA()
非赋值表达式,也即不在赋值表达式左边,满足)a.printA()
不带类名,满足)简单来说, 在
声明之前的
static initialization block
中使用,只能出现在复制表达式左边,除非带上类名(fully qualified)改法1:
改法2: