首页 > java报错非法的前向引用?

java报错非法的前向引用?

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点的情况下,成员变量的声明才必须在使用之前,否则顺序无关

简单来说, 在

static BB a = new BB();

声明之前的static initialization block中使用,只能出现在复制表达式左边,除非带上类名(fully qualified)

改法1:

static BB a = new BB() ;
static
{
    a = new BB() ;
    a.printA() ;
}

改法2:

static
{
    a = new BB() ;
    CC.a.printA() ;
}
static BB a = new BB() ;

public class CC
{
    static BB a = new BB() ; //静态变量和静态区的初始化顺序和声明顺序一致
    static
    {
        a = new BB() ;
        a.printA() ;
    }
}
【热门文章】
【热门文章】