Подтвердить что ты не робот

Что такое переменная тень, используемая в классе Java?

Я читаю книгу Deitel, Java, как программировать, и натолкнулся на термин "затенение". Если разрешено затенение, какая ситуация или какая цель для него в классе Java?

Пример:

public class Foo {

    int x = 5;

    public void useField() {
        System.out.println(this.x);
    }
    public void useLocal() {
        int x = 10;
        System.out.println(x);
    }
}
4b9b3361

Ответ 1

Основная цель затенения - отделить локальный код от окружающего класса. Если он недоступен, рассмотрим следующий случай.

Выпущен класс Foo в API. В вашем коде вы подклассифицируете его, а в вашем подклассе используйте переменную bar. Затем Foo выпускает обновление и добавляет защищенную переменную Bar в свой класс.

Теперь ваш класс не будет запущен из-за конфликта, который вы не могли ожидать.

Однако не делайте этого специально. Только пусть это произойдет, когда вы действительно не заботитесь о том, что происходит за пределами сферы действия.

Ответ 2

Это может быть полезно для сеттеров, где вы не хотите создавать отдельное имя переменной только для параметра метода, например:

public void setX(int x) {
    this.x = x;
}

Кроме того, я бы избегал их.

Ответ 3

Одна из основных целей - запутать людей. Это плохая практика, и ее следует избегать.

Ответ 4

Тенерирование на самом деле не является только термином java. В любом случае, когда переменная, объявленная в области, имеет то же имя, что и в более широком пространстве, эта переменная затенена.

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

Если вы можете избежать этого, вы должны, так как это может вызвать путаницу.

Ответ 5

Два общих использования - это конструкторы и методы набора:

public Foo(int x) {
    this.x = x;
}

public void setX(int x) {
    this.x = x;
}

Очень часто полезно, если вы хотите скопировать переменную за один момент времени, но переменная может измениться в вызове метода.

private void fire() {
    Listener[] listeners = this.listeners;
    int num = listeners.length;
    for (int ct=0; ct<num; ++ct) {
        listeners[ct].stateChanged();
    }
}

(Конечно, надуманный пример сделал ненужным с циклом posh for.)