Почему не «это». команда нужна в этом конструкторе? (Джава) - PullRequest
7 голосов
/ 22 марта 2010

Я читаю книгу о Java. Просто объяснили, как вы создаете класс с именем «колода», который содержит массив карт в качестве переменных экземпляра. Вот фрагмент кода:

class Deck { 
    Card[] cards; 
    public Deck (int n) { 
        cards = new Card[n]; 
    } 
} 

почему не используется команда this.?

например, почему код не такой:

class Deck { 
    Card[] cards; 
    public Deck (int n) { 
       this.cards = new Card[n];
    }
}

Ответы [ 10 ]

20 голосов
/ 22 марта 2010

Потому что нет двусмысленности. Существует только одна cards переменная. this было бы необходимо, если бы их было два - один из которых является переменной экземпляра (частью класса, как она есть в настоящее время), а другой - аргумент конструктора.

И, кстати, this не является «командой». Это «ключевое слово».

12 голосов
/ 22 марта 2010

this. неявно.

Как правило, рекомендуется (по крайней мере, I считать его одним) использовать this только в случае крайней необходимости.Например, если у вас есть локальная переменная с именем cards и переменная-член с именем cards, вам потребуется this.cards для ссылки на переменную-член, поскольку cards относится к локальной переменной.

В таком случае, this - хорошая идея (хотя может быть и лучше переименовать переменную-член).

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

8 голосов
/ 22 марта 2010

Вам не нужно квалифицировать весь доступ к участникам с ключевым словом this.Вам нужно использовать его только тогда, когда другая переменная скрывает метод-член.

И это не функция, ограниченная конструктором, но доступная во всех методах:

public class Test 
{
   private int member;
   private int value;
   public Test(int value) {
      member = 5;
      this.value = value; // required to differentiate from the parameter
   }
   public void f( int member ) {
      int value = 5
      this.member = value; // assign local 'value' (5) to member 'member'
      this.value = member; // assign parameter 'member' to member 'value'
   }
}
4 голосов
/ 22 марта 2010

Ссылка на объект this подразумевается, но она может быть полезна для ясности (и необходима для устранения неоднозначности между членом объекта и локальной переменной с тем же именем, как в конструкторе ниже):

   public class Foo {
       final private int x;

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

       public int getX() { return this.x; }
   }
3 голосов
/ 22 марта 2010

Это имеет смысл, если у вас также есть параметр с именем cards. Тогда this.cards будет означать, что вы имеете в виду именно поле cards класса, а не параметр.

Но в любом случае целесообразно использовать this. в случаях, описанных в вашем примере.

3 голосов
/ 22 марта 2010

Когда вы используете идентификатор cards в конструкторе, компилятор замечает, что поле (переменная-член a.k.a.) cards находится в области видимости, и использует его. this.cards понадобится только для устранения неоднозначностей, например, если у вас также есть локальная переменная или параметр с именем cards.

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

This подразумевается.

Давайте уточним:

class Deck { 
     Card[] cards; 
     public Deck (Card[] cards) { 
          this.cards = cards; 
     } 
} 

В этом случае вы передаете массив карт, имя которого совпадает с именем массива карт объекта. This относится к датабоду вашего объекта, а не к параметру конструктора.

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

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

0 голосов
/ 27 июля 2010

Я пытаюсь выбирать имена переменных так, чтобы не требовалось ключевое слово this. То есть, если у меня есть свойство с именем «value», я передам параметр с именем val.

Хорошее использование ключевого слова "this" для перегрузки конструктора. Рассмотрим следующее (я буду использовать это, чтобы продемонстрировать разницу):

public class Person
{
   int age;
   public Person(int age)
   {
      this.age=age;
   }
   public Person()
   {
      this(25); //default age
   }
}

Когда это возможно, я постараюсь избегать одинакового имени свойства и параметра, чтобы избежать того, что вы видите в строке 6. Однако использование ключевого слова this для вызова другого конструктора - хороший способ предотвратить дублирование кода. , Это тривиальный пример, но когда вы начинаете находить себя с конструкторами, которые выполняют большую часть одной и той же работы с небольшими различиями между ними, это очень удобно.

0 голосов
/ 22 марта 2010

«это» подразумевается. Нет необходимости использовать «это». Я обычно помещаю это туда только для того, чтобы сделать код читабельным, но опять же это не требуется.

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