Почему я могу снова объявить статическое поле внутри main () в Java? - PullRequest
0 голосов
/ 10 апреля 2019

Я объявил private static double fd, а затем снова объявил double fd в main ().Почему я могу скомпилировать и запустить его успешно?

    public class HelloWorld {
    private static double fd = 1.0;

    public static void main(String[] args){
        System.out.println(fd); //1.0
        double fd = 2.0;
        System.out.println(fd); //2.0


    }
}

Ответы [ 3 ]

1 голос
/ 10 апреля 2019

Из JLS Область объявления раздел:

Область объявления - это область программы, в которой объект, объявленный объявлением, может быть передан с использованиемпростое имя, при условии, что оно не затенено.

Из раздела JLS Затенение :

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

Это означает, что вы не можете использовать простое имя (df) для ссылки на уровень класса df переменная, потому что она затенена локальной df переменной.Но есть еще две переменные, и вы можете использовать статическую переменную с именем класса:

public static void main(String[] args){
    System.out.println(fd); //1.0

    double fd = 2.0;

    System.out.println(fd); //2.0
    System.out.println(HelloWorld.fd);
}
0 голосов
/ 10 апреля 2019

Это не синтаксическая ошибка (хотя, вероятно, это приведет к логической ошибке, ошибке).Компилятор скомпилирует этот код без жалоб.Второе объявление double fd создает локальную переменную для метода main.Область действия этой переменной начинается с ее объявления и заканчивается в конце блока (как и для всех локальных переменных).Поэтому следующий оператор использует локальную переменную, а не переменную экземпляра.

Локальная переменная больше не будет содержать значение после возврата метода.Переменная экземпляра не будет изменена.

Подсказка: представьте себе, что операторы смотрят "вверх" со своего места, чтобы найти каждую из своих переменных.Они могут смотреть за пределы своего «стеклянного ящика» в любом направлении, если им не удается найти переменную в их собственном методе.

Почти всегда ошибочно использовать одно и то же имя для переменной экземпляра и для локальногопеременная.Но это не синтаксическая ошибка, поэтому компилятор не предупредит вас.

0 голосов
/ 10 апреля 2019

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

...