转发参考错误?为什么不通过m1方法访问?

时间:2019-02-26 20:08:23

标签: java static controls

class StaticControlFlow {

    static int x = 10;
    static int y ;


    //First Static Block 
    static {

        System.out.println(x);
        System.out.println(y);
        System.out.println(z);
        System.out.println(a);
        m1();
        System.out.println("static block 1");
    }

    // Main Method
    public static void main(String[] args){

        System.out.println("main method");
        System.out.println(x);
        System.out.println(y);
        System.out.println(z);
        System.out.println(a);
        m1();
    }

    // Static method
    public static void m1(){
        System.out.println(x);
        System.out.println(y);
        System.out.println(z);
        System.out.println(a);

        System.out.println("static method m1");

    }

    // Second Static Block 
    static {

        System.out.println(x);
        System.out.println(y);
        System.out.println(z);
        System.out.println(a);
        m1();
        System.out.println("Second Static Block ");
    }


    static int z = 100;
    static int a ;

}

错误:-

static_control_flow>javac StaticControlFlow.java

StaticControlFlow.java:12: error: illegal forward reference
                System.out.println(z);
                                   ^
StaticControlFlow.java:13: error: illegal forward reference
                System.out.println(a);
                                   ^
StaticControlFlow.java:45: error: illegal forward reference
                System.out.println(z);
                                   ^
StaticControlFlow.java:46: error: illegal forward reference
                System.out.println(a);

2 个答案:

答案 0 :(得分:1)

基本上,首先评估静态变量和块,然后编译器再次运行并评估静态方法,然后处理所有实例变量,块和方法。

这就是为什么可以从m1()方法调用所有静态变量的原因

答案 1 :(得分:0)

静态块在定义时以及静态字段初始化之前执行。
如您所见,您正在使用

static int z = 100;
static int a;

在静态块中,然后正确对其进行初始化。


无论如何,访问static块内调用m1的{​​{1}}字段将只打印static,因为它们不是属性初始化的,而是使用默认值。 / p>