Java: Почему я не могу объявить ссылочную переменную в одном операторе и создать ссылочный объект в другом операторе класса? - PullRequest
1 голос
/ 28 января 2020
// That doesn't work: 

import java.io.File;

public class Test {
    File file1;
    file1 = new File("path");
}

//--------------------------------------

// The following works:

import java.io.File;

public class Test {
    File file1 = new File("path");
}

Я не понимаю, почему первая версия невозможна. Я также попробовал это с int-значением (которое не является объектом - я думаю):

//Also doesn't work:

public class Test {
    int number;
    number = 4;
} 

Спасибо! Я попробовал это, и это работает (без реализации конструктора или метода не по умолчанию):

import java.io.File;

public class Test {
    int number;
    {
        number = 4;
    }
    File file1;
    {
        file1 = new File("path");
    }
    public static void main(String[] args) {
        Test test = new Test();
        System.out.print(test.number + " , " + test.file1.getName());
// Output: 4 , path
    }
}

Ответы [ 2 ]

3 голосов
/ 28 января 2020

Это потому, что вы не можете иметь исполняемый код в определении класса вне метода. Таким образом, строка

file1 = new File("path");

(которая является утверждением) является недопустимой. Это никогда не будет выполнено. Определение класса обрабатывается во время компиляции, но компилятор не является виртуальной машиной, он не выполняет ваш код. Операторы выполняются во время выполнения.

Как отметил BM, вы можете создать фрагмент кода stati c, который будет выполняться при загрузке класса. Но я считаю, что это эквивалентно вашему второму примеру:

File file1 = new File("path");

(но я признаю, что не проверял байт-код для этого).

3 голосов
/ 28 января 2020

Вы можете сделать это с помощью оператора block:

public class Test {
    File file1 ;
     {
        file1 = new File("path");
     }
}
...