java报错非法的前向引用?
高洛峰
高洛峰 2017-04-17 13:14:56
[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() ;
    }
}

我在静态代码块中已经初始化过了, 为什么还是会报错说非法的前向引用, 这是为什么呢?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(2)
迷茫

参考 Restrictions on the use of Fields during Initialization

只有在全部满足以下4点的情况下,成员变量的声明才必须在使用之前,否则顺序无关

  • 使用出现在C的实例/静态变量初始化,或者C的实例/静态初始化块中 (题中a.printA()出现在静态初始化块中,满足)
  • 使用不在赋值表达式左边 (题中a.printA()非赋值表达式,也即不在赋值表达式左边,满足)
  • 使用是通过简单名称 (题中a.printA()不带类名,满足)
  • C是包含该使用的直接类/接口 (C即为题中CC,满足)

简单来说, 在

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() ;
PHPz
public class CC
{
    static BB a = new BB() ; //静态变量和静态区的初始化顺序和声明顺序一致
    static
    {
        a = new BB() ;
        a.printA() ;
    }
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号