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

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

Неявное связывание конструктора

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

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

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

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

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

 class Animal {
//конструктор
Animal () {

data-type = “code”>

 System.out.println ("Мы в конструкторе класса Animal."); 
}
}

data-type = “code”>

 class Mammal extends Animal {
//конструктор
Mammal () {

data-type = “code”>

 System.out.println ("Мы находимся в конструкторе класса Mammal."); 
}
}

data-type = “code” >

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

 public class ChainingConstructors {

data -type = “code”>

/** 
* @param args
*/
public static void main ( String [] args) {
Mammal m = new Mammal ();
}
}

data-type = ” code “>

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

 Мы находимся в конструкторе класса Animal 
Мы находимся в конструкторе класса Mammal

data -type = “code”>

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

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

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

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

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

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

 public class Animal 
private String name;
public Animal (String name)//конструктор с аргументом
{
this.name = name;
System.out.println («Я выполняю первым.»);
}
}

Обратите внимание, что конструктор теперь принимает имя типа String в качестве параметра и что тело класса вызывает this () на конструкторе. Без явного использования this. namedata-type = “code”>

Вот подкласс Mammal:

 публичный класс Mammal расширяет Animal {
public Mammal (String name)
{
super (name);
System.out.println ("Меня казнят вторым");
}
}

data-type = “code”>

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

Вот еще один подкласс Carnivore. Это наследуется от Mammal:

 публичный класс Carnivore расширяет Mammal {
public Carnivore (String name)
{
super (имя);
System.out.println ("Меня казнили последним");
}
}

data-type = “code”>

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

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

data-type = “code”>

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

Оцените статью
recture.ru
Добавить комментарий