Pembolehubah kelas (pembolehubah statik)>Blok statik>Kaedah pembinaan>Pembolehubah ahli biasa>Kecuali statik untuk subkelas. Semua pengubahsuaian statik dalam JAVA akan memperuntukkan ruang pada masa penyusunan, dan objek hanya akan diperuntukkan apabila digunakan, iaitu, apabila baru digunakan, apabila subkelas mewarisi kelas induk, ia jelas perlu diperuntukkan kepada kelas induk terlebih dahulu boleh jadi anak tanpa ayah kan
Subjek boleh membantu memahami proses permulaan dengan menyahkompilasi fail class yang disusun.
Arahan javap -l -c -p -v App dalam baris arahan akan mendapat kandungan yang dinyahkompilasi selepas pelaksanaan Mari kita menganalisisnya secara ringkas berdasarkan kod sumber yang diberikan oleh penyoal: Yang berikut menunjukkan sebahagian daripada kandungan yang dikompilasi berkaitan dengan pemula fail kelasApp
private static com.real.test.App d;
descriptor: Lcom/real/test/App;
flags: ACC_PRIVATE, ACC_STATIC
private com.real.test.SubClass t;
descriptor: Lcom/real/test/SubClass;
flags: ACC_PRIVATE
static {};
descriptor: ()V
flags: ACC_STATIC
Code:
stack=2, locals=0, args_size=0
0: new #1 // class com/real/test/App
3: dup
4: invokespecial #12 // Method "<init>":()V **调用App的构造函数**
7: putstatic #15 // Field d:Lcom/real/test/App;
10: getstatic #17 // Field java/lang/System.out:Ljava/io/PrintStream;
13: iconst_3 **得到数字常量3**
14: invokevirtual #23 // Method java/io/PrintStream.println:(I)V **打印数字常量3**
17: return
LineNumberTable:
line 4: 0
line 8: 10
line 3: 17
LocalVariableTable:
Start Length Slot Name Signature
com.real.test.App(); **构造函数详细内容**
descriptor: ()V
flags:
Code:
stack=3, locals=1, args_size=1
0: aload_0
1: invokespecial #31 // Method java/lang/Object."<init>":()V **调用Object的构造函数**
4: aload_0
5: new #32 // class com/real/test/SubClass
8: dup
9: invokespecial #34 // Method com/real/test/SubClass."<init>":()V **调用SubClass的构造函数**
12: putfield #35 // Field t:Lcom/real/test/SubClass;
15: getstatic #17 // Field java/lang/System.out:Ljava/io/PrintStream;
18: iconst_4 **得到数字常量4**
19: invokevirtual #23 // Method java/io/PrintStream.println:(I)V **打印数字常量4**
22: return
LineNumberTable:
line 11: 0
line 5: 4
line 12: 15
line 13: 22
LocalVariableTable:
Start Length Slot Name Signature
0 23 0 this Lcom/real/test/App;
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=1, args_size=1
0: getstatic #17 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #40 // String Hello **得到字符串Hello**
5: invokevirtual #42 // Method java/io/PrintStream.println:(Ljava/lang/String **打印字符串**
8: return
LineNumberTable:
line 16: 0
line 17: 8
LocalVariableTable:
Start Length Slot Name Signature
0 9 0 args [Ljava/lang/String;
Fail kelas
SubClass
static {}; **静态块**
descriptor: ()V
flags: ACC_STATIC
Code:
stack=2, locals=0, args_size=0
0: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream;
3: iconst_1 **得到数字常量1**
4: invokevirtual #14 // Method java/io/PrintStream.println:(I)V **打印数字常量1**
7: return
LineNumberTable:
line 28: 0
line 26: 7
LocalVariableTable:
Start Length Slot Name Signature
public com.real.test.SubClass(); **构造函数**
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=2, locals=1, args_size=1
0: aload_0
1: invokespecial #23 // Method com/real/test/SuperClass."<init>":()V **调用SuperClass的构造函数**
4: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream;
7: iconst_2 **得到数字常量2**
8: invokevirtual #14 // Method java/io/PrintStream.println:(I)V **打印数字常量2**
11: return
LineNumberTable:
line 31: 0
line 32: 4
line 33: 11
LocalVariableTable:
Start Length Slot Name Signature
0 12 0 this Lcom/real/test/SubClass;
Fail kelas
SuperClass
com.real.test.SuperClass();
descriptor: ()V
flags:
Code:
stack=2, locals=1, args_size=1
0: aload_0
1: invokespecial #8 // Method java/lang/Object."<init>":()V **Object的构造函数**
4: getstatic #10 // Field java/lang/System.out:Ljava/io/PrintStream;
7: ldc #16 // String 构造SuperClass **得到字符串构造SuperClass**
9: invokevirtual #18 // Method java/io/PrintStream.println:(Ljava/lang/String;)V **打印字符串**
12: return
LineNumberTable:
line 21: 0
line 22: 4
line 23: 12
LocalVariableTable:
Start Length Slot Name Signature
0 13 0 this Lcom/real/test/SuperClass;
Terangkan kandungan secara kasar (jika subjek berminat dengan
, anda boleh membaca spesifikasi JVM指令集, yang mempunyai penjelasan yang sangat terperinci). JVMBahagian bertanda bintang dalam kandungan yang dinyahkompilasi di atas ialah anotasi yang saya tambahkan. Mengikut susunan pelaksanaan kod: 1. JVM memuatkan kelas , pembolehubah statik dalam App akan dimulakan pada masa ini, sepadan dengan kod bait App dalam Apl 调用App的构造函数 2. Lompat ke pembina , mula-mula mulakan kelas induk App, sepadan dengan Object调用Object的构造函数 dalam Apl 3. Mulakan pembolehubah contoh , sepadan dengan SubClass调用SubClass的构造函数 dalam Apl 4. Pada masa ini, mesti dimuatkan kelas pertama, sambil memulakan pembolehubah statik dan melaksanakan blok statik, sepadan dengan SubClass静态块5 dalam SubClass Pada masa ini, melaksanakan kod dalam mencetak ". 1" SubClass6. Laksanakan pembina selepas dimuatkan. , sepadan dengan SubClass构造函数7 dalam SubClass. pembina pada mulanya melaksanakan pembina SubClass, sepadan dengan SuperClass调用SuperClass的构造函数8 dalam SubClass Jalankan cetakan kod dalam pembina dalam Keluar "Dapatkan pembinaan rentetan SuperClass" SuperClass 9. Pembinaan selesai SuperClass Pergi ke kedudukan kod dalam 7, teruskan laksanakan return baki kod SubClass 10. Jalankan kod pembina dalam untuk mencetak Output "2" SubClass 11. Selepas melaksanakan pembina SubClass ke lokasi kod dalam 3, teruskan melaksanakan kod yang tinggal dalam returnApp 12. Jalankan kod pembina dalam dan cetak " 4"App13 Selepas melaksanakan pembina App, pergi ke kedudukan kod dalam 1 dan teruskan untuk memulakan. pembolehubah statik return14 Jalankan kaedah dalam blok statik dan benarkan "3" 15 .Masukkan kaedah entri dan cetak “Hello” main.
Proses di atas adalah urutan pelaksanaan yang kasar.
Kandungan jawapan mungkin agak mengelirukan Jika anda tidak memahami sesuatu, anda boleh bertanya kepada saya.
Pembolehubah kelas (pembolehubah statik)>Blok statik>Kaedah pembinaan>Pembolehubah ahli biasa>Kecuali statik untuk subkelas. Semua pengubahsuaian statik dalam JAVA akan memperuntukkan ruang pada masa penyusunan, dan objek hanya akan diperuntukkan apabila digunakan, iaitu, apabila baru digunakan, apabila subkelas mewarisi kelas induk, ia jelas perlu diperuntukkan kepada kelas induk terlebih dahulu boleh jadi anak tanpa ayah kan
Subjek boleh membantu memahami proses permulaan dengan menyahkompilasi fail
class
yang disusun.Arahan
Fail kelasjavap -l -c -p -v App
dalam baris arahan akan mendapat kandungan yang dinyahkompilasi selepas pelaksanaan Mari kita menganalisisnya secara ringkas berdasarkan kod sumber yang diberikan oleh penyoal:Yang berikut menunjukkan sebahagian daripada kandungan yang dikompilasi berkaitan dengan pemula
fail kelas
App
Fail kelasSubClass
Terangkan kandungan secara kasar (jika subjek berminat denganSuperClass
, anda boleh membaca spesifikasi
Proses di atas adalah urutan pelaksanaan yang kasar.JVM指令集
, yang mempunyai penjelasan yang sangat terperinci).JVM
Bahagian bertanda bintang dalam kandungan yang dinyahkompilasi di atas ialah anotasi yang saya tambahkan. Mengikut susunan pelaksanaan kod:1. JVM memuatkan kelas
, pembolehubah statik dalam
App
akan dimulakan pada masa ini, sepadan dengan kod baitApp
dalam Apl调用App的构造函数
2. Lompat ke pembina, mula-mula mulakan kelas induk
App
, sepadan denganObject
调用Object的构造函数
dalam Apl 3. Mulakan pembolehubah contoh, sepadan dengan
SubClass
调用SubClass的构造函数
dalam Apl 4. Pada masa ini,mesti dimuatkan kelas pertama, sambil memulakan pembolehubah statik dan melaksanakan blok statik, sepadan dengan
SubClass
静态块
5 dalam SubClass Pada masa ini, melaksanakan kod dalammencetak ". 1"
SubClass
6. Laksanakan pembina selepasdimuatkan. , sepadan dengan
SubClass
构造函数
7 dalam SubClass.pembina pada mulanya melaksanakan pembina
SubClass
, sepadan denganSuperClass
调用SuperClass的构造函数
8 dalam SubClass Jalankan cetakan kod dalam pembina dalamKeluar "Dapatkan pembinaan rentetan SuperClass"
SuperClass
9.Pembinaan selesai
SuperClass
Pergi ke kedudukan kod dalam 7, teruskan laksanakanreturn
baki kodSubClass
10. Jalankan kod pembina dalamuntuk mencetak Output "2"
SubClass
11. Selepas melaksanakanpembina
SubClass
ke lokasi kod dalam 3, teruskan melaksanakan kod yang tinggal dalamreturn
App
12. Jalankan kod pembina dalamdan cetak " 4"
App
13 Selepas melaksanakan pembinaApp
, pergi ke kedudukan kod dalam 1 dan teruskan untuk memulakan. pembolehubah statikreturn
14 Jalankan kaedah dalam blok statik dan benarkan "3"15 .Masukkan kaedah entri
dan cetak “Hello”
main
.