[Java] Классы/конструкторы/поля/методы
Видеозаписи двух уроков:
Дополнительные материалы:
- Статья про то как выглядят поля и методы
- Курс на 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;
}
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);
}
}
Задание
Задание на дом - придумать и создать свой класс что-то олицетворяющий - например 3D точка/3D вектор/прямоугольник, собака/кошка/единорог, дворник/строитель/АСФАЛЬТОУКЛАДЧИК и т.д..
Если ваш класс будет похож на чей-то другой - я буду что-то подозревать… Поэтому рекомендуется придумать что-то оригинальное :)
В вашем классе должно быть:
0) По мере написания - в файле Main с public class Main и с public static void main(String[] args) проверяйте что ваши наработки работают, т.е. демонстрируйте там все ваши наработки - все конструкторы и все методы.
1) Конструктор без аргументов (создает нейтральный вариант объекта по умолчанию).
2) Основной конструктор с ключевыми параметрами описывающими объект.
4) Хотя бы три поля.
5) Хотя бы три метода.
6) Хотя бы один метод должен уметь взаимодействовать с другим объектом этого же класса. Например метод “играть” с другой кошкой для кошки, и в зависимости от их суммарной веселости - напечатать пропорционально много веселых “мяу” в консоль.
Принесите готовый класс на следующий урок чтобы продемонстрировать мне свои результаты.
Обратите внимание что выше есть пример с комментариями (прочитайте их!) и ссылки - это должно помочь.