Классы и объекты в Java

Класс — это «чертёж», по которому создаются однотипные сущности. В нём описываются поля (состояние) и методы (поведение). Объект — конкретный экземпляр класса, занимающий память во время выполнения программы.

Если провести аналогию с электроникой: класс Led описывает, что у светодиода есть номер пина и состояние (горит/нет), а каждый физический светодиод на плате — это отдельный объект класса Led со своими значениями полей.

В Java объект создаётся оператором new, который вызывает конструктор класса и возвращает ссылку на новый объект. Ссылки хранятся в переменных, а сами объекты живут в куче (heap).

Синтаксис объявления класса

public class ИмяКласса {
    // поля
    тип имяПоля;

    // конструктор (не обязателен)
    public ИмяКласса(...) { ... }

    // методы
    тип имяМетода(...) { ... }
}

Создание объекта:

ИмяКласса obj = new ИмяКласса(...);

Пример 1. Минимальный класс

public class Led {
    int pin;
    boolean isOn;

    public static void main(String[] args) {
        Led led = new Led();
        led.pin = 13;
        led.isOn = false;
        System.out.println("Светодиод на пине " + led.pin + ", включён: " + led.isOn);
    }
}

Output:

Светодиод на пине 13, включён: false

Пример 2. Несколько объектов одного класса

public class Sensor {
    String name;
    int value;

    public static void main(String[] args) {
        Sensor temp = new Sensor();
        temp.name = "DHT22";
        temp.value = 24;

        Sensor light = new Sensor();
        light.name = "BH1750";
        light.value = 540;

        System.out.println(temp.name + " = " + temp.value);
        System.out.println(light.name + " = " + light.value);
    }
}

Output:

DHT22 = 24
BH1750 = 540

Пример 3. Методы как поведение объекта

public class Motor {
    String name;
    int speed;

    void setSpeed(int s) {
        if (s < 0) s = 0;
        if (s > 255) s = 255;
        speed = s;
    }

    void info() {
        System.out.println(name + ": скорость " + speed);
    }

    public static void main(String[] args) {
        Motor left = new Motor();
        left.name = "Левый";
        left.setSpeed(300); // будет ограничено 255

        Motor right = new Motor();
        right.name = "Правый";
        right.setSpeed(120);

        left.info();
        right.info();
    }
}

Output:

Левый: скорость 255
Правый: скорость 120

Пример 4. Ссылки на объекты

public class Led {
    int pin;

    public static void main(String[] args) {
        Led a = new Led();
        a.pin = 5;

        Led b = a;       // обе переменные ссылаются на один и тот же объект
        b.pin = 9;

        System.out.println("a.pin = " + a.pin);
        System.out.println("b.pin = " + b.pin);
    }
}

Output:

a.pin = 9
b.pin = 9

Пример 5. Несколько классов в одной программе

class Battery {
    int voltage;
}

public class Robot {
    String name;
    Battery battery;

    public static void main(String[] args) {
        Robot r = new Robot();
        r.name = "Phobo";
        r.battery = new Battery();
        r.battery.voltage = 12;

        System.out.println("Робот " + r.name + ", напряжение: " + r.battery.voltage + "В");
    }
}

Output:

Робот Phobo, напряжение: 12В

Подводные камни

  • Поле, не инициализированное явно, получает значение по умолчанию: 0 для чисел, false для boolean, null для ссылок. Локальные переменные таких значений по умолчанию не имеют.

  • Led b = a; копирует ссылку, а не объект. Изменения через b отражаются и через a.

  • Имя файла .java должно совпадать с именем public класса.

  • Обращение к полю объекта по null-ссылке вызывает NullPointerException.

  • В одном файле может быть только один public класс, остальные классы — package-private.

См. также

Примечание

Лицензия и источники

Концепция описана на основе официального Java Tutorial от Oracle (https://docs.oracle.com/javase/tutorial/), Oracle Free Documentation License. Перевод, примеры и пояснения — © AlashEd Wiki.