Всеки път, когато чуех за концепции за обектно ориентирано програмиране на Java, всичко, което ми идва наум, са дефиниции и основен синтаксис на абстракция, капсулиране, наследяване, полиморфизъм, но след като започнах да пиша кодове за него, се запознах с много пермутации и комбинация от концепции това просто ми отбива ума. На пръв поглед изглежда сложно, но след като разберете логиката зад него, всичко има смисъл.

Първо нека дойдем до конструктора, изображението, което идва в ума ви, когато четете конструктора, е:

  1. Това е специална функция, която се извиква автоматично, когато се създава обект от този клас.
  2. Използва се за инициализиране на състоянието на обект
  3. Името му е същото като името на класа
  4. Може да има 0 или произволен брой параметри
  5. Няма тип връщане

Нещо като това:

class Parent{
Parent(){
System.out.println(“ i am in parents constructor “);
}
}

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

class Parent{
Parent(){
System.out.println(“ i am in parents constructor “);
}
}
class Child extends Parent{
Child (){
System.out.println(“ i am in child constructor “);
}
}
class Main{
public static void main(String[] args) {
Child c1= new Child(); 
}
}

изходът ще бъде:

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

аз съм в детски конструктор

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

class Parent{
static {
System.out.println(“ i am in parent static block “);
}
Parent(){
System.out.println(“ i am in parents constructor “);
}
}
class Main{
public static void main(String[] args) {
Parent p= new Parent(); 
}
}

изходът ще бъде:

аз съм в родителски статичен блок

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

Добре, това изглежда добре. Но какво, когато статичен блок присъства и в родителския клас, и в дъщерния клас. Така че по това време, ако създадем обект на дъщерен клас и „все още не е създаден обект на родителски клас“ (тъй като статичният блок се изпълнява само веднъж), тогава първо ще се изпълни статичният блок на родител, след това статичен блок на дъщерен, след това конструкторът на родител след това конструктор на дете.

class Parent{
static {
System.out.println(“ i am in parent static block “);
}
Parent(){
System.out.println(“ i am in parents constructor “);
}
}
class Child extends Parent{
static {
System.out.println(“ i am in child static block “);
}
Child (){
System.out.println(“ i am in child constructor “);
}
}
class Main {
public static void main(String[] args) {
Child c1= new Child();
}
}

изходът ще бъде:

аз съм в родителски статичен блок
аз съм в дъщерен статичен блок
аз съм в родителски конструктор
аз съм в дъщерен конструктор

Някои допълнителни неща за конструктора:

  1. Не може да бъде абстрактен, окончателен, статичен
  2. Модификаторите public, protected и private са разрешени с конструкторите. по подразбиране се декларира, когато не е указано изрично име на модификатор. (информация)