Для чего используется переменное затенение в классе Java?

Чтобы отформатировать код внутри текста, используйте символ «», чтобы окружить ваш код. Обычно располагается слева от клавиши «1» на клавиатуре.

Пример:

`printf("Hello World");`

Тот же разделитель, что и при обмене стека!

23
задан Jayson 7 July 2009 в 12:43
поделиться

5 ответов

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

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

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

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

36
ответ дан 29 November 2019 в 01:04
поделиться

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

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

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

13
ответ дан 29 November 2019 в 01:04
поделиться

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

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

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

5
ответ дан 29 November 2019 в 01:04
поделиться

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

9
ответ дан 29 November 2019 в 01:04
поделиться

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

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();
    }
}

(Конечно, надуманный пример стал ненужным с помощью шикарного цикла for.)

2
ответ дан 29 November 2019 в 01:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: