Перейти к содержанию

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

В этом кратком руководстве рассмотрим два основных строительных блока языка программирования Java – классы и объекты. Это базовые концепции объектно-ориентированного программирования (ООП), которые используем для моделирования реальных объектов.

В ООП классы – это чертежи или шаблоны объектов. Мы используем их для описания типов сущностей.

С другой стороны, объекты – это сущности, созданные из классов. Они содержат определенные состояния в своих полях и представляют определенное поведение своими методами.

Классы

Проще говоря, класс представляет определение или тип объекта. В Java классы могут содержать поля, конструкторы и методы.

Рассмотрим пример с использованием простого класса Java, представляющего автомобиль:

class Car {

    // поля
    String type;
    String model;
    String color;
    int speed;

    // конструктор
    Car(String type, String model, String color) {
        this.type = type;
        this.model = model;
        this.color = color;
    }
    
    // методы
    int increaseSpeed(int increment) {
        this.speed = this.speed + increment;
        return this.speed;
    }
    
    // ...
}

Этот класс Java представляет автомобиль в целом. Можно создать любой тип автомобиля из этого класса. Мы используем поля для хранения состояния и конструктор для создания объектов из этого класса.

Каждый класс Java по умолчанию имеет пустой конструктор. Мы используем его, если не предоставляем конкретную реализацию, как сделали выше. Вот как будет выглядеть конструктор по умолчанию для класса Car:

Car(){}

Этот конструктор просто инициализирует все поля объекта значениями по умолчанию. Строки инициализируются null, а целые числа – нулем.

Теперь у класса есть специальный конструктор, потому что мы хотим, чтобы поля объектов были определены при их создании:

Car(String type, String model) {
    // ...
}

Итак, мы написали класс, который определяет автомобиль. Его свойства описываются полями, содержащими состояние объектов класса, а его поведение описывается с помощью методов.

Объекты

В то время как классы транслируются во время компиляции, объекты создаются из классов во время выполнения.

Объекты класса называются экземплярами, и мы создаем и инициализируем их с помощью конструкторов:

Car focus = new Car("Ford", "Focus", "красный");
Car auris = new Car("Toyota", "Auris", "синий");
Car golf = new Car("Volkswagen", "Golf", "зеленый");

Теперь мы создали разные объекты Car из одного класса. Смысл всего этого в том, чтобы определить схему в одном месте, а затем повторно использовать ее много раз во многих местах.

Пока что у нас есть три объекта Car, и все они припаркованы, так как их скорость равна нулю. Это можно изменить, вызвав метод increaseSpeed:

focus.increaseSpeed(10);
auris.increaseSpeed(20);
golf.increaseSpeed(30);

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

Более того, мы можем и должны определить контроль доступа к классу, его конструкторам, полям и методам. Это можно сделать, используя модификаторы доступа, как увидим в следующем разделе.

Модификаторы доступа

В предыдущих примерах мы опустили модификаторы доступа, чтобы упростить код. Таким образом, мы фактически использовали модификатор package-private по умолчанию. Этот модификатор разрешает доступ к классу из любого другого класса в том же пакете.

Обычно мы использовали модификатор public для конструкторов, чтобы разрешить доступ из всех других объектов:

public Car(String type, String model, String color) {
    // ...
}

Каждое поле и метод в классе также должны определять контроль доступа с помощью определенного модификатора. Классы обычно имеют модификатор public, а поля – private.

Поля содержат состояние объекта, поэтому необходимо контролировать доступ к этому состоянию. Можно оставить некоторые из них private, а другие public. Это достигается с помощью специальных методов, называемых геттерами и сеттерами.

Посмотрим на наш класс с полностью определенным контролем доступа:

public class Car {
    private String type;
    // ...

    public Car(String type, String model, String color) {
       // ...
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public int getSpeed() {
        return speed;
    }

    // ...
}

Класс помечен как public, что означает, что можно использовать его в любом пакете. Кроме того, конструктор является public, что означает, что можно создать объект из этого класса внутри любого другого объекта.

Поля помечены как private, что означает, что они не доступны из объекта напрямую, но мы предоставляем доступ к ним через геттеры и сеттеры.

Поля type и model не имеют геттеров и сеттеров, потому что они содержат внутренние данные объектов. Можно определить их только через конструктор при инициализации.

Кроме того, можно получить доступ к цвету и изменить его, тогда как к скорости можно получить доступ, но не изменить. Мы принудительно корректировали скорость с помощью специализированных общедоступных методов increaseSpeed() и decreaseSpeed().

Другими словами, мы используем контроль доступа для инкапсуляции состояния объекта.

Заключение

В этой статье мы рассмотрели два основных элемента языка Java – классы и объекты – и показали, как и почему они используются. Мы также представили основы управления доступом и продемонстрировали его использование.

Чтобы изучить другие концепции языка Java, предлагаем в качестве следующего шага прочитать о наследовании, ключевом слове super и абстрактных классах.

Полный исходный код примера доступен на GitHub.

Оригинал