Переменная Область в методах

1

Вопрос из знаменитой книги SCJP 6

  1. Данный:

    public class Dark {
        int x = 3;
    
        public static void main(String[] args) {
            new Dark().go1();
        }
    
        void go1() {
            int x;
            go2(++x);
        }
    
        void go2(int y) {
            int x = ++y;
            System.out.println(x);
        }
    }
    

    Что в итоге?

    A. 2
    B. 3
    C. 4
    D. 5
    E. Ошибка компиляции
    F. Исключение выбрасывается во время выполнения

Ответ в соответствии с этой книгой:

✓ E правильно. В go1() локальная переменная x не инициализируется.

Мои вопросы: почему go1() не может использовать переменную экземпляра x, инициализированную как 6 на строке 4 здесь?

  • 4
    go1() определил локальную переменную с именем x которая скрывает переменную экземпляра x . Локальный x не был инициализирован, таким образом, ошибка компиляции.
  • 1
    @GriffeyDog На самом деле в Java скрытие применяется «только к членам, которые в противном случае были бы унаследованы, но не из-за объявления в подклассе». Это пример слежки .
Показать ещё 1 комментарий
Теги:
scope

2 ответа

3
Лучший ответ

Поскольку существует локальная переменная x. Если int x; были прокомментированы, он будет работать нормально и использовать переменную экземпляра.

0

В Java все локальные переменные должны быть инициализированы, если не будут выдаваться ошибки. Но вы не должны инициализировать параметры метода.

если у вас нет int x тогда это будет нормально. потому что в этом случае компилятор будет использовать локальную переменную, которая назначается для уровня класса.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню