Rumah > Soal Jawab > teks badan
是不是因为父类编译时会生成常量,而子类在使用时已经有常量了,不需要再对父类进行加载。
天蓬老师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);
}
}
天蓬老师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.
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?
怪我咯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.