java-se - Java:请问这段代码的执行顺序是怎么样的,如果能够详细点更好,谢谢
PHPz
PHPz 2017-04-18 10:36:29
0
2
392
PHPz
PHPz

学习是最好的投资!

membalas semua(2)
小葫芦

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 return App 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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan