cari

Rumah  >  Soal Jawab  >  teks badan

java - 如何理解:在父类中如果有常量属性,在子类中使用常量属性时是不会进行父类的类加载。

是不是因为父类编译时会生成常量,而子类在使用时已经有常量了,不需要再对父类进行加载。

巴扎黑巴扎黑2888 hari yang lalu413

membalas semua(4)saya akan balas

  • 天蓬老师

    天蓬老师2017-04-17 17:36:01

    Penggunaan blok kod statik dan lampu pemalar statik kelas tidak bergantung pada pemuatan kelas. Iaitu, menggunakan pembolehubah statik kelas tidak akan mencetuskan pemuatan kelas itu.

    /**
     * Created by gongxufan on 3/31/16.
     */
    class Parent{
        public static final String const_str = "Super";
        static{
            System.out.println("Super Class Init");
        }
        public Parent(){
            System.out.println("Super Class Init");
        }
    }
    
    class Child extends Parent{
        public static final String const_str_child = "Super";
        static {
            System.out.println("Child Class Init");
            System.out.println(const_str);
        }
    }
    public class SuperClassInit {
        public static void main(String[] args) {
            System.out.println(Child.const_str);
        }
    }
    

    balas
    0
  • 天蓬老师

    天蓬老师2017-04-17 17:36:01

    Apabila memuatkan subkelas, kelas induk pasti akan dimuatkan.
    Dalam jujukan pemuatan JVM, kelas induk mesti dimuatkan dahulu, dan kemudian subkelas dimulakan.

    Jika saya ingat dengan betul, susunannya ialah pembolehubah statik kelas induk - blok kod statik kelas induk - pembolehubah statik subkelas - blok kod statik subkelas. Saya mungkin tersalah ingat pesanan itu.

    balas
    0
  • ringa_lee

    ringa_lee2017-04-17 17:36:01

    Memuatkan subkelas akan memuatkan kelas induk dahulu
    Saya menulis kod di bawah:
    Super

    public class Super
    {
        public static final int FIELD = 1;
    
        public static int FILED1 = 2;
    
        static {
            System.out.println("Super");
        }
    }

    Sub

    public class Sub extends Super
    {
        static {
            System.out.println("out main");
        }
        public static void main(String[] args)
        {
            System.out.println(FIELD);
            System.out.println(FILED1);
        }
    }

    Outputnya ialah:

    Sangat

    keluar utama
    1
    2

    Kelas ibu bapa akan dimuatkan. Apakah masalah yang anda bincangkan?

    balas
    0
  • 怪我咯

    怪我咯2017-04-17 17:36:01

    Tambahan:

    public class Demo {
    
        public static void main(String[] args) {
            System.out.println(Child.const_str);
            System.out.println(Child.const_str_child);
        }
    }
    class Parent{
        public static final String const_str = "P";
        static{
            System.out.println("P Init");
        }
    }
    
    class Child extends Parent{
        public static final String const_str_child = "C";
        static {
            System.out.println("C Init");
        }
    }

    Hasil jalankan:

    P
    C

    Nota:

    public class Demo {
    
        public static void main(String[] args) {
            System.out.println(Child.const_str);
            System.out.println(Child.const_str_child);
        }
    }
    class Parent{
        public static String const_str = "P";
        static{
            System.out.println("P Init");
        }
    }
    
    class Child extends Parent{
        public static String const_str_child = "C";
        static {
            System.out.println("C Init");
        }
    }

    Alih keluar perlawanan akhir daripada pemalar, hasilnya akan menjadi:

    P Init
    P
    C Init
    C

    jdk1.8
    Sebab mengapa ini berlaku adalah kerana muktamad dioptimumkan pada masa penyusunan kerana kebolehubahannya System.out.println(Child.const_str) terus menghala ke rentetan dalam kumpulan tetap selepas lokasi penyusunan dalam.

    balas
    0
  • Batalbalas