Что такое переменная тень, используемая в классе 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);
}
}
Ответы
Ответ 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.)