Неявное и явное построение цепочек

Цепочка конструктора в Java это просто действие одного конструктора, вызывающего другого конструктора через наследование. Это происходит неявно, когда создается подкласс: его первой задачей является вызов метода конструктора его родителя. Но программисты также могут явно вызывать другой конструктор, используя ключевые слова это() или супер(). это() Ключевое слово вызывает другой перегруженный конструктор в том же классе; супер() Ключевое слово вызывает конструктор не по умолчанию в суперклассе.

Неявная цепочка конструктора

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

В цепочке наследования может быть любое количество классов. Каждый метод конструктора вызывает цепочку, пока класс в верхней части не будет достигнут и инициализирован. Затем каждый последующий класс, указанный ниже, инициализируется, когда цепочка возвращается к исходному подклассу. Этот процесс называется конструированием цепочки.

instagram viewer

Обратите внимание, что:

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

Рассмотрим этот суперкласс Animal, расширенный Mammal:

Класс Animal {
// конструктор
Animal () {
 System.out.println («Мы в конструкторе класса Animal.»);
}
}
класс млекопитающих расширяется Animal {
//constructor
Млекопитающее () {
 System.out.println («Мы в конструкторе класса Mammal».);
}
}

Теперь давайте создадим экземпляр класса Mammal:

открытый класс ChainingConstructors {
 /**
* @param args
*/
public static void main (String [] args) {
Млекопитающее m = новый Млекопитающее ();
}
}

Когда вышеуказанная программа запускается, Java неявно инициирует вызов конструктора суперкласса Animal, а затем конструктора класса. Таким образом, результат будет:

Мы в классе конструктор животных
Мы в классе конструктора Млекопитающих

Явная цепочка конструктора с использованием this () или super ()

Явное использование это() или супер() ключевые слова позволяют вам вызывать конструктор не по умолчанию.

  • Чтобы вызвать не-args конструктор по умолчанию или перегруженный конструктор из того же класса, используйте это() ключевое слово.
  • Чтобы вызвать конструктор суперкласса по умолчанию из подкласса, используйте супер() ключевое слово. Например, если суперкласс имеет несколько конструкторов, подкласс может всегда хотеть вызвать определенный конструктор, а не по умолчанию.

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

Рассмотрим приведенный ниже код, в котором новый подкласс Carnivore наследуется от класса Mammal, который наследуется от класса Animal, и теперь у каждого класса есть конструктор, который принимает аргумент.

Вот суперкласс Animal:

общественный класс животных
личное строковое имя;
public Animal (String name) // конструктор с аргументом
{
this.name = имя;
System.out.println («Я исполнен первым»);
}
}
Обратите внимание, что конструктор теперь принимает имя типа строка в качестве параметра и что тело класса вызывает это() на конструкторе. Без явного использования это имяJava создаст конструктор по умолчанию без аргументов и вызовет его.

Вот подкласс млекопитающих:

Млекопитающее публичного класса расширяет Animal {
публичный млекопитающее (строковое имя)
{
супер (имя);
System.out.println («Я исполнен вторым»);
}
}

Его конструктор также принимает аргумент, и он использует супер (имя) вызвать конкретный конструктор в своем суперклассе.

Вот еще один подкласс хищника. Это наследуется от млекопитающих:

хищник публичного класса расширяет Млекопитающее {
хищник (Строковое имя)
{
супер (имя);
System.out.println («Я был казнен последним»);
}
}

При запуске эти три блока кода будут печатать:

Я казнен первым.
Я казнен вторым.
Я казнен последним.

Подведем итоги: Когда создается экземпляр класса Carnivore, первое действие его метода конструктора - вызвать метод конструктора Mammal. Аналогично, первым действием метода конструктора Mammal является вызов метода конструктора Animal. Цепочка вызовов методов конструктора гарантирует, что экземпляр объекта Carnivore правильно инициализировал все классы в своей цепочке наследования.

instagram story viewer