前向参考错误?为什么不从m1方法访问?

问题描述 投票:2回答:2
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);
java static controls
2个回答
1
投票

基本上,首先计算静态变量和块,然后编译器执行第二次运行并评估静态方法,然后转到所有实例变量,块和方法。

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


0
投票

静态块在定义时执行,并在初始化静态字段之前执行。 你可以看到你正在使用

static int z = 100;
static int a;

在静态块内部,在它们被正确初始化之前。


无论如何,访问在static块内调用m1的那些static字段将只打印0,因为它们不是属性初始化并且使用默认值。

© www.soinside.com 2019 - 2024. All rights reserved.