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

Конструкторни вериги в Java е просто актът на един конструктор да извика друг конструктор чрез наследяване. Това се случва имплицитно, когато се конструира подклас: първата му задача е да извика метода на своя родител. Но програмистите могат също да извикат друг конструктор изрично, използвайки ключовите думи това() или супер (). Най- това() ключова дума извиква друга претоварен конструктор в същия клас; на супер () ключова дума извиква конструктор без подразбиране в суперклас.

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

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

Може да има произволен брой класове в наследствената верига. Всеки метод на конструктор извиква веригата, докато класът в горната част не бъде достигнат и инициализиран. След това всеки следващ клас по-долу се инициализира, тъй като веригата се връща обратно към първоначалния подклас. Този процес се нарича свързване на конструктори.

instagram viewer

Отбележи, че:

  • Това неявно извикване на суперклас е същото, както ако подкласът е включил супер () ключова дума, т.е. супер () тук е имплицитно.
  • Ако конструктор без args не е включен в класа, Java създава такъв зад кулисите и го извиква. Това означава, че ако единственият ви конструктор вземе аргумент, трябва изрично използвай това() или супер () ключова дума за извикването му (вижте по-долу).

Помислете за това животно от суперклас, разширено от бозайник:

клас Животни {
// конструктор
Животните () {
 System.out.println ("Ние сме в клас конструктор на Animal.");
}
}
клас Бозайник удължава Animal {
//constructor
Бозайник(){
 System.out.println ("Ние сме в конструктора на Mammal клас.");
}
}

Сега, нека инстанцираме класа Mammal:

обществена класа ChainingConstructors {
 /**
* @param аргументи
*/
public static void main (String [] args) {
Бозайник m = нов бозайник ();
}
}

Когато горната програма работи, Java неявно задейства повикване към конструктора на суперклас Animal, а след това към конструктора на класа. Следователно, резултатът ще бъде:

Ние сме в клас Конструктор на Animal
Ние сме в класния конструктор на Mammal

Изрично свързване на конструктор с помощта на това () или супер ()

Изрично използване на това() или супер () ключови думи ви позволява да се обадите на конструктор, който не е по подразбиране.

  • За да извикате конструктор по подразбиране без args или претоварен конструктор от същия клас, използвайте това() ключова дума.
  • За да извикате конструктор на суперклас без подразбиране от подклас, използвайте супер () ключова дума. Например, ако суперкласът има множество конструктори, подклас може винаги да иска да извика конкретен конструктор, а не по подразбиране.

Обърнете внимание, че повикването към друг конструктор трябва да бъде първото изявление в конструктора или Ява ще хвърли грешка при компилация.

Помислете кода по-долу, в който нов подклас, Carnivore, наследява от клас Mammal, който наследява от класа Animal, а всеки клас има конструктор, който взема аргумент.

Ето животинския суперклас:

обществена класа Животни
частно име на низ;
public Animal (име на струна) // конструктор с аргумент
{
this.name = име;
System.out.println ("Изпълнявам се първо.");
}
}
Обърнете внимание, че сега конструкторът взема a име от тип низ като параметър и който тялото на класа извиква това() върху конструктора. Без изричното използване на this.name, Java ще създаде конструктор по подразбиране, no-args и ще го извика вместо това.

Ето подклас Бозайник:

публичен клас Mammal удължава Animal {
обществен бозайник (име на низ)
{
супер (име);
System.out.println ("Изпълнен съм втори");
}
}

Конструкторът му също взема аргумент и той използва супер (име) да се позове на конкретен конструктор в неговия суперклас.

Ето още един подклас Месоядни. Това наследява от бозайник:

обществена класа Carnivore разширява бозайник {
обществен хищник (име на стринг)
{
супер (име);
System.out.println ("Изпълнен съм последен");
}
}

Когато стартирате, тези три кодови блока ще отпечатат:

Аз съм екзекутиран първи.
Изпълнен съм втори.
Изпълнен съм последен.

За резюме: Когато се създаде екземпляр от класа Carnivore, първото действие на неговия метод конструктор е да извика метода конструктор Mammal. По същия начин, първото действие на метода на конструктор на бозайници е да се извика методът на конструктора на животни. Верига от конструкторски метод извиква се гарантира, че инстанцията на обекта Carnivore правилно инициализира всички класове в неговата наследствена верига.

instagram story viewer