Могут ли помешать поля класса и аргументы метода? - PullRequest
0 голосов
/ 14 марта 2010

У меня есть класс с полями под названием "а". В классе у меня есть метод, и в списке аргументов этого метода у меня также есть «а». Итак, какое «а» я увижу внутри метода? Будет ли это поле или аргумент метода?

public class myClass {
   private String a;
   // Method which sets the value of the field "a".
   public void setA(String a) {
     a = a;
   }
}

Кстати, похожая ситуация. Метод имеет несколько локальных (для метода) переменных, имена которых совпадают с именами полей. Что будет «видеть» метод, если я ссылаюсь на такую ​​локальную переменную метода внутри метода (поле или локальная переменная)?

Ответы [ 5 ]

5 голосов
/ 14 марта 2010

Чем больше локальная область имеет приоритет, тем параметр a будет скрывать поле a. По сути, вы устанавливаете значение параметра a на себя. Правильный способ избежать конфликта имен (и улучшить читаемость) - использовать this для явной пометки члена класса:

public void setA(String a) {
  this.a = a;
}

То же самое верно для локальных переменных и переменных-членов: локальные переменные скрывают переменные-члены с одинаковыми именами.

2 голосов
/ 14 марта 2010

Добавить ко всем ответам, рекомендующим:

public void setA(String a) {
   this.a = a;
}

важно понимать, что пропуск this просто установит параметр на себя. Используя final, таким образом

public void setA(final String a) {
   this.a = a;
}

Вы можете устранить ошибки, вызванные пропуском this. Использование final является хорошей практикой при указании параметров и полей, которые не нужно намеренно менять.

1 голос
/ 14 марта 2010

Локальная версия будет «затенять» переменную экземпляра с тем же именем. Один из способов обойти это в таких аксессуарах, как ваш:

public void setA(String a) {
   this.a = a;
}

, который использует ключевое слово this, чтобы явно указать область действия.

1 голос
/ 14 марта 2010

ближайший. То есть

 a = a;

внутри метода не имеет никакого эффекта, так как оба ссылаются на аргумент a. Для ссылки на переменную экземпляра вы используете ключевое слово this.

 this.a = a;
0 голосов
/ 14 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...