[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-java-core-kakov-poryadok-vyzova-konstruktorov-i-blokov-initsializatsii-s-uchyotom-ierarkhii-klassov":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":20,"progress":21,"seo":22},28,"kakov-poryadok-vyzova-konstruktorov-i-blokov-initsializatsii-s-uchyotom-ierarkhii-klassov",2,"java-core","Java Core","☕","Каков порядок вызова конструкторов и блоков инициализации с учётом иерархии классов?","Сначала вызываются все статические блоки в очередности от первого статического блока корневого предка и выше по цепочке иерархии до статических блоков самого класса.\n\nЗатем вызываются нестатические блоки инициализации корневого предка, конструктор корневого предка и так далее вплоть до нестатических блоков и конструктора самого класса.\n\n>Parent static block(s) → Child static block(s) → Grandchild static block(s)\n>\n> → Parent non-static block(s) → Parent constructor →\n>\n> → Child non-static block(s) → Child constructor →\n>\n> → Grandchild non-static block(s) → Grandchild constructor\n\nПример 1:\n\n```java\npublic class MainClass {\n\n    public static void main(String args[]) {\n        System.out.println(TestClass.v);\n        new TestClass().a();\n    }\n\n}\n```\n\n```java\npublic class TestClass {\n\n    public static String v = \"Some val\";\n\n    {\n        System.out.println(\"!!! Non-static initializer\");\n    }\n\n    static {\n        System.out.println(\"!!! Static initializer\");\n    }\n\n    public void a() {\n        System.out.println(\"!!! a() called\");\n    }\n\n}\n```\n\nРезультат выполнения:\n\n```\n!!! Static initializer\nSome val\n!!! Non-static initializer\n!!! a() called\n```\n\nПример 2:\n\n```java\npublic class MainClass {\n\n    public static void main(String args[]) {\n        new TestClass().a();\n    }\n\n}\n```\n\n```java\npublic class TestClass {\n\n    public static String v = \"Some val\";\n\n    {\n        System.out.println(\"!!! Non-static initializer\");\n    }\n\n    static {\n        System.out.println(\"!!! Static initializer\");\n    }\n\n    public void a() {\n        System.out.println(\"!!! a() called\");\n    }\n\n}\n```\n\nРезультат выполнения:\n\n```\n!!! Static initializer\n!!! Non-static initializer\n!!! a() called\n```","","middle",[15,16,17,18,19],"наследование","core","static","инициализация","конструктор",[],null,{"title":23,"description":24,"ogTitle":25,"ogDescription":26,"keywords":27,"schemaAnswer":32,"featuredSnippetReady":33},"Порядок вызова конструкторов и блоков инициализации в Java — Gymterview","Порядок инициализации: статические блоки предков → статические блоки класса → нестатические блоки предков → конструктор предка → нестатические блоки → конструктор.","Порядок инициализации классов в Java с иерархией","Parent static → Child static → Parent non-static → Parent constructor → Child non-static → Child constructor. Полный порядок с примерами.",[28,29,30,31],"порядок инициализации Java","порядок вызова конструкторов","блоки инициализации Java","static блок порядок","Сначала выполняются статические блоки от корневого предка вниз по иерархии. Затем — нестатические блоки и конструктор корневого предка, далее нестатические блоки и конструктор каждого потомка по цепочке. Порядок: Parent static → Child static → Parent non-static → Parent constructor → Child non-static → Child constructor.",true]