Почему “это” не. команда необходима в этом конструкторе? (Java)

Я читаю книгу о 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];
    }
}
7
задан Bozho 22 March 2010 в 18:59
поделиться

10 ответов

this. неявно.

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

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

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

12
ответ дан 6 December 2019 в 04:48
поделиться

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

   public class Foo {
       final private int x;

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

       public int getX() { return this.x; }
   }
4
ответ дан 6 December 2019 в 04:48
поделиться

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

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

3
ответ дан 6 December 2019 в 04:48
поделиться

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

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

20
ответ дан 6 December 2019 в 04:48
поделиться

Нет необходимости уточнять весь доступ к участникам с помощью ключевого слова 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'
   }
}
8
ответ дан 6 December 2019 в 04:48
поделиться

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

Давайте подробнее:

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

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

2
ответ дан 6 December 2019 в 04:48
поделиться

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

3
ответ дан 6 December 2019 в 04:48
поделиться

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

1
ответ дан 6 December 2019 в 04:48
поделиться

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

0
ответ дан 6 December 2019 в 04:48
поделиться

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

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

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

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

0
ответ дан 6 December 2019 в 04:48
поделиться
Другие вопросы по тегам:

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