2017-02-20 104 views
1

Я читал android app и не понимаю, почему конструктор в ListeningQuestion.java использует this.variable = variable в своем конструкторе, но только variable = variable (без этого) в ListeningQuestionItem.java. Они оба имеют variable, объявленные как private в соответствующем классе. Почему различия? Любая помощь?this.variable внутри класса и т.д.

+1

'ListeningQutionItem' фактически использует плохие соглашения об именах. Переменные должны начинаться с нижнего регистра (нет жесткой причины, это просто соглашение). В этом случае они будут использовать 'this.', чтобы различать переменную класса и параметр. – DeeV

+0

имена переменных java являются аргументами case senstive. В случае локальных переменных с тем же именем, что и имя переменной экземпляра 'this' используется для идентификации переменных экземпляра. напишите мой ответ ниже, надеюсь, это будет полезно http://stackoverflow.com/a/42358555/504133 –

ответ

0

По https://docs.oracle.com/javase/tutorial/java/javaOO

В качестве метода экземпляра или конструктор, это ссылка на текущий объект - объект, чей метод или конструктор вызывается.

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

this.listeningFileID = listeningFileID;

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

Имена переменных Java являются случайными. Во втором случае

ListeningQuestionContent = listeningQuestionContent;

Обратите внимание на первый символ, имя поля л isteningQuestionContent и локальная переменная передается как параметр назван л isteningQuestionContent.Здесь у нас нет одинаковых имен, поэтому this js не используется (хотя это то же самое, что и this.ListeningQuestionContent = listeningQuestionContent;)

+0

поэтому во втором случае, прослушиваниеQuestionContent = listenQuestionContent не будет работать, если оно не отличается случаем? –

+0

Это не будет ошибкой компиляции. Это будет просто назначение локальной переменной (параметр метода) для себя. –

+0

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

1

Конструктор, как заявлено в ListeningQuestion.java вы ищете -

public ListeningQuestion(String listeningFileID, String listeningSoundAddress, String listeningImageAddress, 
         ArrayList<ListeningQuestionItem> listeningQuestionItems) { 
    this.listeningFileID = listeningFileID; 
    this.listeningSoundAddress = listeningSoundAddress; 
    this.listeningImageAddress = listeningImageAddress; 
    this.listeningQuestionItems = listeningQuestionItems; 

} 

Если мы видим, конструктор, имя parameter такое же, как имя private variable.

Указывая, this, я прямо просил присвоить значение параметра локальной переменной. This означает экземпляр текущего класса.

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

Это обычное соглашение для назначения значений параметров локальной переменной таким образом.

Некоторые вещи here и here об использовании this ключевого слова

Теперь, если вы видите, конструктор ListeningQuestionItem.java, имена параметров и локальных переменных, отличается от случая. И потому, что нет никакой двусмысленности, вы можете присвоить значение частной переменной, без использования this, а -

ListeningQuestionID = listeningQuestionID 
+0

Большое спасибо! Я посмотрю на предоставленные ссылки. –

 Смежные вопросы

  • Нет связанных вопросов^_^