Rumah  >  Artikel  >  Java  >  Apakah Susunan Permulaan Blok Statik dan Instance dalam Warisan Java?

Apakah Susunan Permulaan Blok Statik dan Instance dalam Warisan Java?

Patricia Arquette
Patricia Arquetteasal
2024-11-27 07:00:14156semak imbas

What's the Initialization Order of Static and Instance Blocks in Java Inheritance?

Jujukan Permulaan Blok Statik dan Instance dalam Java

Apabila bekerja dengan berbilang kelas di Java, fahami susunan pelaksanaan untuk statik dan contoh blok pemula menjadi penting. Walaupun diketahui bahawa dalam kelas, blok ini dijalankan mengikut susunan penampilan, masih terdapat ketidakpastian mengenai kelakuannya merentas kelas.

Untuk menunjukkan tingkah laku ini, pertimbangkan kod berikut:

package pkg;

public class LoadTest {
    public static void main(String[] args) {
        System.out.println("START");
        new Child();
        System.out.println("END");
    }
}

class Parent extends Grandparent {
    // Instance init block
    {
        System.out.println("instance - parent");
    }

    // Constructor
    public Parent() {
        System.out.println("constructor - parent");
    }

    // Static init block
    static {
        System.out.println("static - parent");
    }
}

class Grandparent {
    // Static init block
    static {
        System.out.println("static - grandparent");
    }

    // Instance init block
    {
        System.out.println("instance - grandparent");
    }

    // Constructor
    public Grandparent() {
        System.out.println("constructor - grandparent");
    }
}

class Child extends Parent {
    // Constructor
    public Child() {
        System.out.println("constructor - child");
    }

    // Static init block
    static {
        System.out.println("static - child");
    }

    // Instance init block
    {
        System.out.println("instance - child");
    }
}

Dijangka, output kod ini sejajar dengan andaian bahawa blok statik dilaksanakan sebelum contoh blok:

START
static - grandparent
static - parent
static - child
instance - grandparent
constructor - grandparent
instance - parent
constructor - parent
instance - child
constructor - child
END

Walau bagaimanapun, pemerhatian ini sahaja tidak menjelaskan susunan permulaan antara kelas ibu bapa dan kanak-kanak. Untuk meneroka aspek ini dengan lebih lanjut, pertimbangkan untuk menambah kelas yang tidak digunakan berikut pada kod:

class IAmAClassThatIsNeverUsed {
    // Constructor
    public IAmAClassThatIsNeverUsed() {
        System.out.println("constructor - IAACTINU");
    }

    // Instance init block
    {
        System.out.println("instance - IAACTINU");
    }

    // Static init block
    static {
        System.out.println("static - IAACTINU");
    }
}

Hebatnya, kod yang diubah suai masih menghasilkan output yang sama seperti kod asal. Ini menunjukkan bahawa blok pemula statik dan instance dilaksanakan dalam urutan berikut:

  • Blok pemula statik semua kelas dan antara muka dilaksanakan dalam susunan atas ke bawah yang luas-pertama, tanpa mengira pergantungan mereka perhubungan.
  • Setelah semua blok pemula statik telah dilaksanakan, contoh blok pemula dan pembina semua kelas dilaksanakan mengikut susunan kelas dimulakan dalam program.

Tingkah laku ini sejajar dengan Spesifikasi Bahasa Java (JLS), yang memberikan penjelasan terperinci dalam bahagian 12.4 dan 12.5 .

Atas ialah kandungan terperinci Apakah Susunan Permulaan Blok Statik dan Instance dalam Warisan Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn