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

Вот мы и дошли до созданий объектов. Вы уже сталкивались с этим ранее, просто сейчас мы разберем эту тему более подробно. На самом деле создавать объекты очень просто.

Чтобы создать объект, нужно использовать оператор new. Выглядит создание объекта примерно так:

new Класс(параметры)

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

Класс имя = new Класс(параметры)

Где Класс имя — это создание новой переменной, а код справа от знака равенства — это создание нового объекта типа Класс.

Примеры:

Код Примечание
Object o = new Object();
Создание объекта типа Object
Cat pet = new Cat();
Создание объекта типа Cat
Scanner console = new Scanner(System.in)
Создание объекта типа Scanner

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

Код
BufferedReader bufferedReader = new BufferedReader( reader );
Cat cat = new Cat();
PersonInfo personInfo = new PersonInfo()

По факту в этом коде нет ничего страшного — это самый обычный код, в котором создается переменная и тут же инициализируется объектом ее же типа.

Слева от знака равенства — создание переменной. Справа — создание объекта. Все.

2. Конструктор

Вы, наверное, часто видели, что при создании объекта в него передаются какие-то параметры. Причем в некоторые объекты параметры передаются, а в некоторые — нет. Как вообще работает весь этот механизм с параметрами?

Тут тоже все просто: у каждого класса есть специальный метод (или методы), которые отвечают за обработку параметров при создании объекта. Такие методы называются конструкторы. А один метод, соответственно, конструктор.

Отличить метод-конструктор от обычного метода в коде несложно. Такой метод обладает двумя особенностями:

  • имя метода-конструктора совпадает с именем его класса (и начинается с большой буквы)
  • метод-конструктор не имеет типа возвращаемого результата.

Общий вид его обычно такой:

модификаторы Класс(параметры)
{
   код
}

Пример:

Код Примечание
public class Point
{
   public int x;
   public int y;

   Point(int x, int y)
   {
      this.x = x;
      this.y = y;
   }
}
Класс Point




Конструктор класса Point
public class Solution
{
   public static void main(String[] args)
   {
      Point point = new Point(5, 10);
   }
}




Создание объекта класса Point, будет вызван конструктор класса.

Обратите внимание, как выглядит метод-конструктор: у него нет типа-результата и его имя совпадает с именем-класса.

И еще один момент: посмотрите на код внутри конструктора. Переменные-параметры конструктора имеют те же имена, что и поля класса – x, y. Это стандартная практика, чтобы не выдумывать названия переменных. Берутся те же имена, что у полей класса, а конфликт имен решается с помощью ключевого слова this.

3. Вызов конструктора

Когда вы создаете новый объект с помощью оператора new и команды вида «new Класс(параметры)», происходят две вещи:

  • Java-машина создает объект типа Класс
  • Java-машина вызывает у объекта конструктор и передает туда ваши параметры

Вы как программист сами решаете, какие у вашего класса должны быть конструкторы, и какие у этих конструкторов должны быть параметры.

Допустим, вы решили создать класс для учета котов в приюте для животных. Тогда ваш класс Cat может иметь такой вид:

class Cat
{
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }
}
Cat cat = new Cat("Васька", 2);
Так можно
Cat cat = new Cat("Васька");
А так — нельзя. Код не скомпилируется.
Cat cat = new Cat();
И так нельзя. Код не скомпилируется.

У класса Cat всего один конструктор с параметрами name и age. Т.к. других конструкторов нет, вы обязаны при создании объекта передать в качестве параметров имя (name) и возраст (age) кота. Вы не можете не передать параметры в конструктор.

4. Несколько конструкторов

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

Код Примечание
class Cat
{
   public static final int UNKNOWN = -1;
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }
   public Cat(String name)
   {
      this.name = name;
      this.age = UNKNOWN; // неизвестно
   }
}
Cat cat = new Cat("Васька", 2);
Так можно: вызовется первый конструктор
Cat cat = new Cat("Васька");
Так можно: вызовется второй конструктор
Cat cat = new Cat();
А так — нельзя. Код не скомпилируется.

Мы решили учесть ситуацию, что возраст кота может быть неизвестен. Для этого случая добавили в код специальную константу — UNKNOWN и конструктор, который принимает только один параметр — имя кота.

Обратите внимание, что мы по-прежнему инициализируем обе переменные-класса внутри обоих конструкторов. Неизвестные/отсутствующие параметры мы заменяем на константу UNKNOWN.

Если переменной age не присвоить никакого значения, она будет хранить значение по умолчанию == 0. А ведь найденному на улице котенку вполне себе может быть 0 полных лет. Поэтому ноль в переменой age совсем не обязательно обозначает «неизвестный возраст».

5. Конструктор по умолчанию

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

Конструктор без параметров — это не обязательно конструктор без кода, он вполне себе может содержать код, который инициализирует переменные класса стартовыми значениями:

Код Примечание
class Cat
{
   public static final int UNKNOWN = -1;
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }

   public Cat()
   {
      this.name = "Безымянный";
      this.age = UNKNOWN; // неизвестно
   }
}
Cat cat = new Cat("Васька", 2);
Так можно: вызовется первый конструктор
Cat cat = new Cat();
Так можно: вызовется второй конструктор

Конструктор по умолчанию

Есть очень важный момент, который вам следует знать и помнить.

Если у вашего класса вообще нет ни одного конструктора, компилятор добавит вам в класс конструктор-по-умолчанию – конструктор без параметров и кода, но с модификатором public.

Однако, если в вашем классе есть хотя бы один конструктор, конструктор-по-умолчанию уже добавляться не будет – вам нужно будет дописать его самостоятельно.

Код Примечание
class Cat
{
   public String name;
   public int age;
}
Cat cat = new Cat();
Так можно: вызовется конструктор-по-умолчанию