Ошибка прямой ссылки?Почему не во время доступа из метода m1? - PullRequest
0 голосов
/ 26 февраля 2019
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 голосов
/ 26 февраля 2019

По существу, сначала оцениваются статические переменные и блоки, затем компилятор выполняет второй прогон и оценивает статические методы, а затем переходит ко всем переменным экземпляра, блокам и методам.

Вот почему это возможновызвать все статические переменные из m1() метода

0 голосов
/ 26 февраля 2019

Статические блоки выполняются в том виде, в котором они определены, и до того, как статические поля инициализированы.
Как вы можете видеть, вы используете

static int z = 100;
static int a;

внутри статического блока, прежде чем они будут правильноinitialized.


В любом случае доступ к этим полям static, вызывающим m1 внутри блока static, просто выведет 0, так как они не инициализированы свойством и используются значения по умолчанию.

...