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

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

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

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

Рассмотрим картинку, приведенную ниже. Объявлен класс Student, у которого есть переменные name и rollNo, а также методы setName() и setRollNo() для установки этих значений. На основе этого класса создано несколько объектов: Jenna, John, Maria, James. У каждого объекта, то есть студента, есть name и rollNo, но они разные.

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

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

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

class ИмяКласса{  

       тип переменнаяЭкземпляра1; 
       тип переменнаяЭкземпляра2; 
         // ... 
       тип переменнаяЭкземпляраN; 

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

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

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

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

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

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

Вох myBox = new Вох();

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

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

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

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

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

public class BoxDemo1 {
    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 BoxDemo7 {
    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 BoxDemo6 {
    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 BoxDemo2 {
    public static void main(String[] args) {
        Box myBox1 = new Box();
        Box myBox2 = new Box();

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

        System.out.println("Объем: " + myBox1.getVolume());
        System.out.println("Объем: " + myBox2.getVolume());
    }
}
Read also:
Comments