[Java] Классы/конструкторы/поля/getters/setters/toString()
Дополнительные материалы:
- Статья про то как выглядят поля и методы
- Курс на stepik - вероятно лекции около темы “Объявление класса”
Ниже приведен пример класса описывающего натуральное число:
public class NaturalValue {
int value;
NaturalValue(int value) {
// В конструкторе никто не мешает проверять аргументы на корректность и как-то их изменять (исправлять)
if (value < 1) {
this.value = 1;
} else {
this.value = value;
}
}
NaturalValue() {
// Это конструктор который вызывается без аргуметов, т.е. вот так:
// NaturalValue v = new NaturalValue();
// т.е. конструкторов может быть несколько (они отличаются набором аргументов)
// Java умная и поймет какой вызывается - на базе того какие аргументы передаются в конструктор из main-функции
// это называется "перегрузка" конструкторов
// так же может быть и "перегрузка" методов с одинаковыми названиями но разными аргументами
this.value = 1;
}
int getValue() {
// это так называемый getter, в java принято извне (из main) ВЕЖЛИВО узнавать значения полей
// т.е. через такие (тривиальные) функции
// getter от слова get = получить = узнать значение поля (соответственно тип результата = типу поля)
// называется он всегда getSomeFieldName где SomeFieldName - название поля (с большой буквы)
return value;
}
void setValue(int value) {
// это так называемый setter, в java принято извне (из main) ВЕЖЛИВО МЕНЯТЬ значения полей
// т.е. через такие (тривиальные) функции
// setter от слова set = установить значение поля (соответственно результата нет - void)
// называется он всегда setSomeFieldName где SomeFieldName - название поля (с большой буквы)
this.value = value;
// в частности такой способ позволяет проконтролировать что за значение нам подсунили и поправить его:
if (value < 1) {
this.value = 1;
} else {
this.value = value;
}
}
void fix() {
// А что если мы хотим часто менять наше натуральное число?
// Что если оно перестанет быть натуральным?
// В каждой функции писать if подобный тому что в конструкторе и setter-е? Утомительно и не красиво!
// Давайте просто сделаем функцию fix()="поправь натуральное число если это требуется" и будем ее вызывать отовсюду
// в т.ч. из конструктора можно было бы и из setter-а
if (value <= 1) {
value = 1;
}
}
void add(int value) {
this.value += value;
this.fix(); // если вдруг мы вычли слишком много и ушли в минус (или до нуля) - поправляем
}
void add(NaturalValue x) { // методы и функции могут быть "ПЕРЕГРУЖЕНЫ" (overloaded)
// т.е. их может быть несколько с одинаковым названием (см. add выше)
// но в момент вызова Java поймет какую функцию выполнять,
// т.к. они вызываются с разными типами аргументов.
// Обратите внимание что мы обращаемся к нашему полю (this.value) и к чужому полю (x.value)
this.value += x.value;
this.fix(); // на самом деле это не обязательно т.к. натуральное+натуральное=натуральное, но так спокойнее и надежнее...
}
NaturalValue plus(int x) {
return new NaturalValue(this.value + x); // нужен ли тут вызов fix?
}
NaturalValue plus(NaturalValue x) {
// обратите внимание что мы обращаемся к нашему полю (this.value) и к чужому полю (x.value)
return new NaturalValue(this.value + x.value);
}
// @Override - это указание что не мы не просто объявляем новый метод,
// а ПЕРЕОПРЕДЕЛЯЕМ метод который есть в более базовом классе
// в Java во всех классах есть toString(), именно он определяет что будет выведено
// если подставить объект x в System.out.println(x);
// поэтому ПЕРЕОПРЕДЕЛИВ этот метод - мы явно скажем как преобразовать объект в строку
// т.е. как представить объект в приятном человеческому глазу виде
@Override
public String toString() {
return "value=" + this.value + "";
}
}
Задание
Задание на дом - придумать и создать свой класс что-то олицетворяющий - например 3D точка/3D вектор/прямоугольник, собака/кошка/единорог, дворник/строитель/АСФАЛЬТОУКЛАДЧИК и т.д..
Если ваш класс будет похож на чей-то другой - я буду что-то подозревать… Поэтому рекомендуется придумать что-то оригинальное :)
В вашем классе должно быть:
0) По мере написания - в файле Main с public class Main
и с public static void main(String[] args)
проверяйте что ваши наработки работают, т.е. демонстрируйте там все ваши наработки - все конструкторы и все методы.
1) Конструктор без аргументов (создает нейтральный вариант объекта по умолчанию).
2) Основной конструктор с ключевыми параметрами описывающими объект.
4) Хотя бы три поля.
5) Геттеры и сеттеры.
5) Хотя бы три метода.
6) Хотя бы какой-то метод должен вызывать другой метод этого же объекта.
7) Реализуйте toString чтобы объект myObject
красиво выводился в консоль при System.out.println(myObject);
Принесите готовый класс на следующий урок чтобы продемонстрировать мне свои результаты.
Обратите внимание что выше есть пример с комментариями (прочитайте их!) и ссылки - это должно помочь.