Цель конструктора - инициализировать только что созданный объект, например, заполнив его поля экземпляра (также называемые переменные экземпляра ). this
используется в вашем конструкторе для ссылки на экземпляр, который инициализирует конструктор.
В вашем примере конструктора у вас есть параметры и поля экземпляра . Конструктор принимает значения параметров и присваивает эти значения полям экземпляра:
public Joke(String jokeSetup , String jokePunchLine)
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---- Declares parameters this
// constructor accepts when
// called
{
// vvvvvvvvv------------ parameter
this.jokeSetup=jokeSetup;
// ^^^^^^^^^^^^^^---------------------- instance field
// vvvvvvvvvvvvv---- parameter
this.jokePunchLine=jokePunchLine;
// ^^^^^^^^^^^^^^^^^^------------------ instance field
}
Конструктор может вместо этого инициализировать поля экземпляра постоянными значениями или косвенным использованием значения параметра (например, поиск чего-либо) и т. Д. Это не всегда прямое однозначное присвоение, как в вашем примере.
В вашем примере параметры имеют те же имена, что и поля экземпляра, но это не обязательно. Например, этот конструктор делает то же самое, что и ваш:
public Joke(String theJokeSetup , String theJokePunchLine)
// ^---------------------^---------- Note the name changes
{
// vvvvvvvvvvvv------------ parameter
this.jokeSetup = theJokeSetup;
// ^^^^^^^^^^^^^^--------------------------- instance field
// vvvvvvvvvvvvvvvv---- parameter
this.jokePunchLine = theJokePunchLine;
// ^^^^^^^^^^^^^^^^^^----------------------- instance field
}
Java позволяет вам исключить часть this.
при обращении к полю экземпляра и просто использовать имя поля само по себе (например, jokeSetup
вместо this.jokeSetup
). Вы не можете сделать это в своем конструкторе, пока вы не переименуете параметры, потому что они имеют те же имена, что и поля экземпляра, поэтому jokeSetup
в вашем конструкторе - это параметр, а не поле. Когда возникает такой конфликт, наиболее локальный идентификатор имеет приоритет (в вашем конструкторе параметр является наиболее локальным).
Когда нет конфликта, вопрос стиля зависит от того, используете ли вы this.
часть или нет. (Я всегда использую this.
, я нахожу это более понятным.) Например, вот еще одна версия этого конструктора, которая делает то же самое, что и ваш оригинал:
public Joke(String theJokeSetup , String theJokePunchLine)
// ^---------------------^---------- Note the name changes
{
// vvvvvvvvvvvv------------ parameter
jokeSetup = theJokeSetup;
// ^^^^^^^^^--------------------------- instance field
// vvvvvvvvvvvvvvvv---- parameter
jokePunchLine = theJokePunchLine;
// ^^^^^^^^^^^^^----------------------- instance field
}
Я упоминаю об этом, потому что, опять же, когда нет конфликта, это вопрос стиля, и вы увидите, что этот стиль иногда используется.