Дополнительные материалы:

  • Статья про то как выглядят поля и методы
  • Курс на 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);

Принесите готовый класс на следующий урок чтобы продемонстрировать мне свои результаты.

Обратите внимание что выше есть пример с комментариями (прочитайте их!) и ссылки - это должно помочь.