В реальном программировании к свойствам не принято обращаться напрямую. Почти всегда их делают приватными, то есть закрытыми от прямого внешнего воздействия. Для доступа определяют "геттеры" и "сеттеры". Первые позволяют извлечь свойство, вторые – поменять.
var user = new User("Jonny", "Depp");
// Геттер
user.getFirstName(); // "Jonny"
// Сеттер
user.setFirstName("Monika"); // "Jonny"
// Геттер
user.getFirstName(); // "Monika"
И реализация:
class User {
// Свойства делаются приватными
// Попытка обратиться снаружи закончится ошибкой
private String firstName;
private String lastName;
User(String fName, String lName) {
this.firstName = fName;
this.lastName = lName;
}
// Методы не статичные
public String getFirstName() {
return this.firstName;
}
// void потому что ничего не возвращает
public void setFirstName(String name) {
this.firstName = name;
}
}
Геттер просто возвращает значение свойства, а сеттер его меняет. Пример выше можно упростить, так как this
не является обязательным. Java понимает, когда имя совпадает с именем свойства и использует его.
class User {
private String firstName;
private String lastName;
User(String fName, String lName) {
firstName = fName;
lastName = lName;
}
// Методы не статичные
public String getFirstName() {
return firstName;
}
// void потому что ничего не возвращает
public void setFirstName(String name) {
firstName = name;
}
}
Кроме методов доступа к свойствам, классы позволяют описывать любые другие методы, которые нам нужны. Благодаря им и реализуется логика программы. В примере выше это метод getFullName()
:
public String getFullName() {
return firstName + " " + lastName;
}
Во всех примерах выше, в определении методов, отсутствует слово static
. Статические методы не принадлежат объектам, и не могут быть через них вызваны. Статические методы связаны с классами. Поэтому, для работы объектов нужны не статические методы.
Когда нужен this
Существует одна ситуация, в которой использование this
обязательно, оно связано с совпадением имени свойства с локальным именем переменной. Например, в такой ситуации:
class User {
private String firstName;
// Имена параметров совпадают с именами свойств
User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
// Имя параметра совпадает с именем свойства
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getFirstName() {
// Имя свойства совпадает с именем локальной переменной
var firstName = /* что-то */;
return this.firstName;
}
}
В таких ситуациях можно поступить двумя способами:
- Проставить там где надо
this
. - Переименовать либо свойство, либо название параметра.
Соглашения и правила
При работе с классами нужно придерживаться некоторых соглашений:
- Один файл – один класс. Имя файла и класса совпадают.
- Классы начинаются с заглавной буквы. Методы с прописной за исключением конструктора.
- Сеттеры и Геттеры создаются путем добавления приставки set и get
- Свойства всегда приватные
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.