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

Author: Tatyana Milkina
  1. Что такое объект и класс в Java?
  2. Как создать класс в Java
  3. Создание объекта в Java
  4. Присваивание переменным ссылок на объекты
  5. Добавляем методы в класс

1. Что такое объект и класс в Java?

Класс в Java - это шаблон для создания объекта, а объект - это экземпляр класса. Класс определяет структуру и поведение, которые будут совместно использоваться набором объектов. Класс содержит переменные (поля) и методы, которые называются элементами класса, членами класса. Он составляет основу инкапсуляции в Java. Каждый объект данного класса содержит структуру и поведение, которые определены классом. Иногда объекты называют экземплярами класса.

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

Рассмотрим картинку, приведенную ниже. Объявлен класс Student, у которого есть переменные name и id, а также методы setName() и setId() для установки этих значений. На основе этого класса создано несколько объектов: Anna, Leo, Sara, Max. У каждого объекта, то есть студента, есть name и id, но они разные.

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

2. Как создать класс в Java

Рассмотрим как создать класс в языке Java. Упрощенная общая форма определения класса:

class ИмяКласса{  
       тип переменнаяЭкземпляра1; 
       тип переменнаяЭкземпляра2; 
         // ... 
       тип переменнаяЭкземпляраN; 

       тип имяМетода 1 ( список параметров) {
         // тело метода 
       }

       тип имяМетода2 (список параметров) {
         // тело метода 
       }
       …
       тип имяМетодаN (список  параметров ) {
        // тело метода 
       }
}

После ключевого слова class пишется имя класса. В теле класса объявляются переменные и методы класса. Их может быть сколько угодно.

Опишем класс для объекта Box (коробка). У коробки есть три главные характеристики: ширина, высота и глубина, описанные с помощью переменных:

public class Box {
    double width;
    double height;
    double depth;
}

3. Создание объекта в Java

Объявление класса создает только шаблон, но не конкретный объект. Чтобы создать объект класса Вох в Java, нужно воспользоваться оператором наподобие следующего:

Box myBox = new Box();

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

Создание объектов класса представляет собой двухэтапный процесс:

  1. Объявление переменной типа класса. Эта переменная не определяет объект. Она является лишь переменной, которая может ссылаться на объект:
    Вох myBox;​
  2. Создание объекта. С помощью оператора new динамически (то есть во время выполнения) резервируется память для объекта и возвращается ссылка на него:
    myBox = new Вох();​

Объявление объектов фото

После объявления объекта класса Box, всем переменным класса присваивается значение по умолчанию для заданного типа (0 для чисел, false для boolean, null для ссылочных типов). Для того чтобы обратиться к переменной класса и изменить ее или получить значение, используется имя переменной объекта:

public class BoxExample1 {
    public static void main(String[] args) {
        Box myBox = new Box();
        // присвоить значение переменным экземпляра mybox
        myBox.width = 10;
        myBox.height = 20;
        myBox.depth = 15;
        // рассчитать объем параллелепипеда
        double volume = myBox.width * myBox.height * myBox.depth;
        System.out.println("Объем равен " + volume);
    }
}

В следующем примере объявляется два объекта класса Box и каждому устанавливаются свои значения. Изменения в переменных экземпляре одного объекта не влияют на переменные экземпляра другого. 

public class BoxExample7 {
    public static void main(String[] args) {
        Box myBox1 = new Box();
        Box myBox2 = new Box();
        double volume;
        // присвоить значения переменным экземпляра myBox1
        myBox1.width = 10;
        myBox1.height = 20;
        myBox1.depth = 15;
        //присвоить другие значения переменным экземпляра myBox2
        myBox2.width = 3;
        myBox2.height = 6;
        myBox2.depth = 9;
        // рассчитать объем первого параллелепипеда
        volume = myBox1.width * myBox1.height * myBox1.depth;
        System.out.println("Объем равен " + volume);
        // рассчитать объем второго параллелепипеда
        volume = myBox2.width * myBox2.height * myBox2.depth;
        System.out.println(" Объем равен " + volume);
    }
}

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

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

Присваивание переменным ссылок на объекты фото

Рассмотрим как это происходит на следующем примере.

При объявлении переменной b1 создается новый объект в памяти. При объявлении переменной b2, вместо создания нового объекта, переменной присваивается ссылка на объект b1. Далее объекту, на который указывает переменная b1, присваиваются значения 10, 20, 30. А ширине объекта, на который указывает переменная b2, присваивается значение 3:

public class BoxExample6 {
    public static void main(String[] args) {
        Box1 b1 = new Box1();
        Box1 b2 = b1;

        b1.width = 10;
        b1.height = 20;
        b1.depth = 15;

        b2.width = 3;

        System.out.println("Width: " + b1.width);
        System.out.println("Width: " + b2.width);
    }
}

Но обе переменные указывают на один и тот же объект, поэтому результат выполнения этой программы будет:

Width: 3.0
Width: 3.0

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

5. Добавляем методы в класс

Кроме переменных класс может содержать методы, которые позволяют скрыть детали реализации и избежать дублирования кода. В следующем примере в класс Box добавляется два метода: getVolume() - для вычисления объема коробки и setDim() - для установки размера коробки. Обратите внимание, что теперь мы объявляем методы нестатические (без ключевого слова static). В обоих методах мы имеем доступ к переменным класса.

public class Box {
    double width;
    double height;
    double depth;

    /**
     * Подсчитать объем коробки
     *
     * @return Объем
     */
    double getVolume() {
        return width * height * depth;
    }

    /**
     * Установить размер коробки
     *
     * @param w - ширина
     * @param h - высота
     * @param d - глубина
     */
    void setDim(double w, double h, double d) {
        width = w;
        height = h;
        depth = d;
    }
}

В следующей программе создаются два объекта класса Box. И вместо инициализации каждой переменной класса, как мы делали ранее, вызывается метод setDim(), куда передаются необходимые значения для ширины, высоты и глубины. Таким образом программа становится более компактной. Нестатический метод класса всегда вызывается для какого-то объекта. Аналогично, для подсчета объема коробки вызываем метод getVolume() для каждого объекта отдельно:

public class BoxExample2 {
    public static void main(String[] args) {
        Box myBox1 = new Box();
        Box myBox2 = new Box();

        myBox1.setDim(10, 20, 15);
        myBox2.setDim(1, 5, 5);

        System.out.println("Объем: " + myBox1.getVolume());
        System.out.println("Объем: " + myBox2.getVolume());
    }
}
Курс 'Java для начинающих' на Udemy Курс 'Java для начинающих' на Udemy
Читайте также:
Комментарии