Покрытые темы

public class Human {

    // Любой класс состоит из описания что присуще каждому объекту этого класса:
    //  - поля   - хранят ЗНАНИЯ каждого объекта, например каждый человек хранит в себе переменную возраста и имени
    //  - методы - хранят УМЕНИЯ каждого объекта, например человек может громко и гордо крикнуть свое имя
    //    естественно методы могут использовать значения полей, поэтому каждый конкретный человек крикнет именно свое имя
    //  - конструкторы - они очень похожи на методы, по сути это метод конструирования (отсюда название) каждого нового объекта

    // Эти переменные (поля) - являются внутренними знаниями каждого конкретного объета этого класса Human
    // они объявляются так же как и локальные переменные ввиде:
    // <типПоля> <имяПоля>;
    int age;
    String name;

    // Это конструктор - то что создает новый объект этого класса Human и заполняет его поля изначальными значениями
    Human(int age, String name) {
        // this.age - способ обратиться к переменной (полю) текущего объекта, т.е. того объекта который мы сейчас создаем
        this.age = age;
        this.name = name;
    }
    
    // Это метод - является навыком который есть у каждого конкретного объекта этого класса Human
    // в скобочках у функции указан аргумент - чтобы в момент когда этому человеку сказали "вырасти на столько-то лет"
    // был способ указать на сколько лет - передав это число в скобочки (см. ниже в main() использование этого метода)
    void grow(int n) {
        age += n; // он может обращаться к переменным (полям) этого класса, т.е. он может пользоваться своими знаниям, обновлять их
    }

    // Это тоже метод, и как и прошлый - оба метода ничего не возвращают как результат, в них нет return
    // поэтоме тип их результата - void = пустота = отсутствие результата
    // Каждый метод имеет общий вид:
    // <типРезультатаРаботыМетода> <имяМетода>(<аргументы>) {
    //     <код>;
    //     return <результат>;    // эта строка есть только если <типРезультатаРаботыМетода> отличается от void (он и переводится как "пустота")
    // }
    void tellYourNameLoudly() {
        System.out.print("MY NAAAME ISSS: ");
        System.out.println(name);
    }

    // Этот метод возвращает возраст через год, поэтому здесь есть return и тип результата - int
    int tellMeYourAgeInNextYear() {
        int result = age + 1;
        return result; // обратите внимание что тип возращаемой переменной result (int)
                       // совпадает с типом результата метода - который заявлен чуть выше прямо перед названием метода
    }
    
    // В этом методе наш объект Human сравнивает свое имя с именем другого объекта Human
    // этот другой объект класса Human передан в эту функцию как параметр
    // ровно так же как было в grow(int n), только там был параметр число, а тут параметр - другой человек
    boolean isHeYourTeska(Human h) {
        // boolean - это еще один тип как int/double
        // в нем может быть либо логическое ИСТИНА, либо ЛОЖЬ
        // т.е. true или false
        boolean res = false;
        
        // чтобы узнать свое имя (т.е. имя того у кого был вызван метод <КТО-ТО>.isHeYourTeska(...))
        // можно использовать: name или this.name
        // чтобы узнать чужое имя этого другого человека h
        // нужно использовать: h.name
        if (name.equals(h.name)) { // не забываем что строки надо сравнивать через equals(), а не через ==
            res = true;
        }
        return res;
    }
    
    // Этот метод делает полного клона человека
    Human makeClone() {
        // Создаем нового человека и подставляем в него тот же возраст и имя что и у нас
        Human res = new Human(this.age, this.name);
        // Если в будущем у этого клона изменится возраст или имя - эти изменения не затронут нас (и наоборот)
        return res;
    }

}

И можно использовать в main-функции:

class Main {
    public static void main(String[] args) {
        Human petya = new Human(10, "Petya");          // здесь мы вызвали конструктор - создали новый объект класса Human и заполнили его внутренние переменные
        petya.grow(1);                                 // здесь мы сказали ему позврослеть на один годик (его возраст увеличился на 1)
        int n = 4;
        petya.grow(n);                                 // здесь мы сказали ему позврослеть на 4 годика (его возраст увеличился на 4)
        int nextAge = petya.tellMeYourAgeInNextYear(); // здесь мы спросили какой возраст у него будет еще через год и смогли сохранить этот возраст в переменную
        System.out.println("Next age: " + nextAge);
        
        Human vasya = new Human(20, "Vasya");
        boolean isTheSameNames = vasya.isHeYourTeska(petya);
        if (isTheSameNames) {
            System.out.println("They have the same name!");
        } else {
            System.out.println("They have different names!");
        }
        
        Human vasya2 = vasya.makeClone(); // клонирование! теперь у нас два Васи, и каждый живет своей жизнью
    }
}

Правила игры

Из выполненных заданий вы должны постепенно накопить небольшую программу которая и является результатом вашей работы.

Не уходите с урока пока не покажите мне как далеко вы зашли. И не забудьте взять с собой исходники домой (можно отправить себе на почту).

Дома сделайте три небольших задачки на дом в mdl (см. следующую статью). И затем доделайте то что осталось из заданий ниже - на следующих уроках у вас должны быть с собой исходники (скиньте их сами себе на почту например, или на флешку).

Задание

Задание 1. Создайте описание класса прямоугольник

Создайте класс Rectangle описывающий прямоугольник с вещественными координатами.

Нужно сделать:

  • Четыре вещественных поля
  • Конструктор
  • Метод print который выводит в консоль описание прямоугольника в симпатичном виде - например Rectangle [(10, 20); (30, 50)]
  • Метод area который возвращает площадь прямоугольника

Задание 2. Создайте метод проверки пересечения

Добавьте метод isIntersects который принимает другой прямоугольник и возвращает boolean значение:

  • true если прямоугольники пересекаются
  • false если прямоугольники не пересекаются

Задание 3. Создайте метод пересечения

Добавьте метод intersect который принимает аргументом второй прямоугольник и возвращает новый прямоугольник являющийся их пересечением. Если прямоугольники не пересекаются - пусть возвращается null.

Вам поможет разобраться как это сделать пример в начале этой статьи - про boolean isHeYourTeska(Human h) и Human makeClone().

Задание 4. Создайте описание класса окружность

Создайте окружность:

  • Подумайте какие у нее должны быть поля
  • Сделайте конструктор
  • Сделайте метод print
  • Сделайте метод area
  • Сделайте метод isIntersects принимающий аргументом вторую окружность

Задание 5. Создайте класс человечек

Создайте класс Human.

Конструктор должен принимать три числа:

  • Рост человечка \(height\)
  • \(x\) и \(y\) его местоположения

При этом среди полей человечка должны быть руки, ноги, голова и туловище, описанные соответствующими прямоугольниками и окружностями (с координатами относительно местоположения человечка и с учетом роста).

  • Сделайте метод area (он должен суммировать площадь по всем его частям, т.е. вызвать метод area у каждой из них)
  • Сделайте метод isIntersects (он должен проверять пересекаем ли мы другого человечка, т.е. попробовать пересечь каждую нашу часть с каждой его частью)

Возможные ошибки