Порядок вызова конструкторов классов в Java

Порядок вызова конструкторов классов в Java

В каком порядке вызываются конструкторы классов, образующих иерархию при ее создании? Например, какой конструктор вызывается раньше: АA() или ВB(), если ВB это подкласс, а АA суперкласс?

В иерархии классов конструкторы вызыва­ются в порядке наследования, начиная с суперкласса и кончая подклассом.

Болеетого, этот порядок остается неизменным независимо от того, используется форма super() или нет, поскольку вызов метода super() должен быть в первом операто­ре, выполняемом в конструкторе подкласса.

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

В следующем примере программы демонстрируется по­рядок вызова и выполнения конструкторов:

//     

//   AA

class AA {

    AA() {
        System.out.println("  AA.");
    }

}

//      AA

class BB extends AA {

    BB() {
        System.out.println("  BB.");
    }

}

//       BB

class CC extends BB {

    CC() {
        System.out.println("  CC.");
    }

}

//   ,   CC

class DD extends CC {

    DD() {
        System.out.println("  DD.");
    }

}

//  

class ConstructorCall {

    public static void main(String args[]) {
        DD dd = new DD();
    }

}

Программа выводит следующий результат:

pro-java.ru@admin:~$ javac constructor.java  
pro-java.ru@admin:~$ java ConstructorCall  
  AA.
  BB.
  CC.
  DD.
pro-java.ru@admin:~$

Как видите, конструкторы вызываются в порядке наследования. По зрелом раз­мышлении становится ясно, что выполнение конструкторов в порядке наследова­ния имеет определенный смысл.

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

Обучающее видео по теме:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *