Rumah  >  Artikel  >  Java  >  Apakah susunan blok kod dan pembina dipanggil semasa pemulaan objek Java?

Apakah susunan blok kod dan pembina dipanggil semasa pemulaan objek Java?

王林
王林ke hadapan
2023-05-10 09:52:081080semak imbas

    Tertib keutamaan pemuatan kod

    Blok kod statik, pembolehubah ahli statik->Blok kod bukan statik, pembolehubah ahli bukan statik-> baru Objek lain memanggil kaedah pembinaan objek yang sepadan (termasuk kaedah pembinaan sebagai tambahan kepada kaedah objek tempatan) -> objek tempatan baharu memanggil kaedah pembinaan.

    [Nota: Jika objek baharu, terdapat blok kod statik dan blok kod bukan statik dalam objek Setiap kali objek baharu, blok kod bukan statik akan dilaksanakan sekali, tetapi blok kod statik akan dilaksanakan sekali Ia hanya akan dilaksanakan sekali dan kemudian objek baharu tidak akan dilaksanakan lagi. 】

    Urutan pelaksanaan kaedah pembina

    Blok kod statik kelas induk (pembolehubah statik> blok statik subkelas> kaedah pembinaan subkelas

    Takrifan pelbagai blok kod

    Blok kod statik

    class Demo{ static { //静态代码块...... } }

    Ciri-ciri: 1. Blok kod statik Java Kod akan dijalankan apabila kelas dimuatkan ke dalam JVM dan hanya akan dilaksanakan sekali 2. Blok statik sering digunakan untuk memulakan atribut kelas dan beberapa kerja permulaan global 3. Blok statik mempunyai keutamaan berbanding pelbagai blok kod dan pembina blok di dalamnya, yang akan dilaksanakan secara berurutan dalam susunan ia ditulis 4. Blok kod statik boleh ditakrifkan di mana-mana dalam kelas kecuali dalam badan kaedah [badan kaedah di sini ialah mana-mana badan kaedah] 5. Blok kod statik tidak boleh diakses. pembolehubah biasa.

    Blok kod statik akan diperkenalkan secara terperinci

    Blok kod statik: blok kod yang diisytiharkan menggunakan kata kunci statik dalam java. Blok statik digunakan untuk memulakan kelas dan memulakan sifat kelas. Setiap blok kod statik dilaksanakan sekali sahaja.

    Memandangkan JVM akan melaksanakan blok kod statik semasa memuatkan kelas, blok kod statik dilaksanakan sebelum kaedah utama. Jika kelas mengandungi berbilang blok kod statik, maka kod yang ditakrifkan dahulu akan dilaksanakan dahulu, dan kod yang ditakrifkan kemudian akan dilaksanakan. [Nota: 1 Blok kod statik tidak boleh wujud dalam mana-mana badan kaedah. 2 Blok kod statik tidak boleh mengakses pembolehubah contoh statik dan kaedah contoh ia perlu diakses melalui objek contoh kelas. 】 Blok kod contoh Blok kod contoh juga dipanggil blok permulaan pembinaan, blok kod pembinaan, dan blok permulaan.

    class Demo{ { //实例代码块...... } }

    Ciri:

    • 1. Blok kod pembinaan dipanggil semasa mencipta objek, dan ia akan dipanggil sekali setiap kali objek dicipta

    • 2 Blok kod pembinaan diutamakan daripada fungsi pembina, dan pelaksanaan blok kod pembinaan bergantung pada pembina

    • 3. Blok kod pembinaan berada dalam Ditakrifkan dalam kelas

    Blok kod separa

    Blok kod separa juga dipanggil blok kod biasa, blok kod kaedah

    class Demo{ public void test(){ { //局部代码块...... } } }

    Ciri-ciri : 1. Blok kod biasa ditakrifkan dalam badan kaedah 2. Format blok kod biasa dan blok kod contoh adalah sama seperti {} 3. Satu-satunya yang boleh dilihat secara langsung perbezaan antara blok kod biasa dan blok kod yang dibina ialah blok kod yang dibina berada dalam kelas ditakrifkan dalam , manakala blok kod biasa ditakrifkan dalam badan kaedah 4. Anda boleh mengehadkan kitaran hayat pembolehubah, melepaskannya lebih awal dan menambah baik penggunaan memori

    Sahkan susunan pelaksanaan setiap blok kod

    Kod contoh adalah seperti berikut:

    class Init {
        public Init() {
            System.out.println("无参构造器");
        }
        public Init(int a) {
            System.out.println("有参构造器");
        }
        {
            System.out.println("实例代码块1");
        }
        {
            System.out.println("实例代码块2");
        }
        {
            System.out.println("实例代码块3");
        }
        static {
            System.out.println("静态初始化块1");
        }
     
        static {
            System.out.println("静态初始化块2");
        }
    
        public void method(){
        	{
        		System.out.println("普通初始化块");
        	}
        }
    }

    Ujian kod adalah seperti berikut:

    class Demo {
        public static void main(String[] args) {
            Init init1 = new Init();
            init1.method();
            System.out.println("------------");
            Init init2 = new Init();
            init2.method();
            //多打印几个对象的目的是:方便看出Static静态代码块 是否只执行一次!!!
            System.out.println("------------");
            Init init3 = new Init();
            init3.method();
        }
    }

    Hasil larian adalah seperti berikut:

    Apakah susunan blok kod dan pembina dipanggil semasa pemulaan objek Java?

    Kesimpulan:

    Arahan pelaksanaan ialah: blok kod instance> kelas dimuatkan, dan hanya dipanggil sekali (dilaksanakan semasa kelas dimuatkan).

    Jadi bilakah kelas akan dimuatkan?

    - Apabila mencipta contoh objek (baru)
    - Apabila mencipta contoh objek subkelas, kelas induk juga akan dimuatkan

    - Apabila menggunakan ahli statik kelas (sifat statik, kaedah statik )


    Sahkan susunan pelaksanaan setiap blok kod dalam hubungan warisan

    Contoh hubungan warisan ialah
    Tiga——> 🎜>,

    Kodnya adalah seperti berikut:

    class One {
        public One() {
            System.out.println("One构造器");
        }
     
        {
            System.out.println("One实例化块");
        }
     
        static {
            System.out.println("One静态代码块");
     
        }
     
    }
    class Two extends One {
     
        public Two() {
            System.out.println("Two构造器");
        }
     
        {
            System.out.println("Two实例化块");
        }
     
        static {
            System.out.println("Two静态代码块");
        }
     
    }
     
    class Three extends Two {
     
        public Three() {
            System.out.println("Three构造器");
        }
     
        {
            System.out.println("Three实例化块");
        }
        static {
            System.out.println("Three静态代码块");
        }
     
    }
    //测试代码 如下:
    public class Demo {
        public static void main(String[] args) {
            Three three = new Three();
            System.out.println("-----");
            Three three1 = new Three(); //重复执行的目的是为了 验证static是否只执行一次
            System.out.println("-----");
            Two three2 = new Three();   //验证 多态的情况下 用后面的类进行初始化 结果和上面一样
        }
    }

    Mengikut keputusan pelaksanaan, ia boleh dilihat bahawa terdapat blok permulaan dan blok permulaan statik dalam warisan berbilang kelas , pembina, susunan pelaksanaan sebenar ialah: jalankan blok statik kelas induk A, blok statik kelas induk B, dan akhirnya blok statik subkelas , kemudian laksanakan blok kod contoh dan pembina kelas induk A, dan kemudian kelas B Blok kod contoh dan pembina, dan akhirnya laksanakan blok kod contoh dan pembina subkelas C [Nota: ABC di sini sepadan dengan Satu, Dua, Tiga]

    Apakah susunan blok kod dan pembina dipanggil semasa pemulaan objek Java?

    Kesimpulan:

    Dalam pewarisan berbilang kelas, susunan pelaksanaan blok permulaan, blok permulaan statik dan pembina ialah:

    父类静态块——>子类静态块——>父类实例代码块——>父类构造器——>子类实例代码块——>子类构造器 ——>(如果有局部代码块, 再正常执行即可, 这里就没必要进行测试了)

    通过字节码深究实例代码块优先于构造器原因

    我们那一段代码作为例子说明下,代码如下:

    class Init {
        public Init() {
            System.out.println("无参构造器");
        }
        public Init(int a) {
            System.out.println("有参构造器");
     
        }
     
        {
            System.out.println("实例代码块1");
        }
     
        {
            System.out.println("实例代码块2");
        }
     
        {
            System.out.println("实例代码块3");
        }
     
        static {
            System.out.println("静态初始化块1");
        }
     
        static {
            System.out.println("静态初始化块2");
        }
     
        public void method(){
            {
                System.out.println("普通初始化块");
            }
        }
    }

    接下来让我们看看 , Init.java编译完的的字节码文件(Init.class)

    Apakah susunan blok kod dan pembina dipanggil semasa pemulaan objek Java?

    从这个字节码文件就可以很清晰的看出, 实例代码块实际上是被依次放到了构造方法的第一句, 所以可以的出此结论: 实例代码块的执行顺序是优先于构造器的。

    Atas ialah kandungan terperinci Apakah susunan blok kod dan pembina dipanggil semasa pemulaan objek Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan:
    Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam