ושיטות ב- JVM

1. סקירה כללית

ה- JVM משתמש בשתי שיטות ייחודיות לאתחול מופעי מחלקה ומחלקות.

במאמר מהיר זה, נראה כיצד המהדר וזמן הריצה משתמשים ב- ו שיטות למטרות אתחול.

2. שיטות אתחול למופע

נתחיל בהקצאת אובייקטים והקצאה פשוטים:

אובייקט אובייקט = אובייקט חדש ();

אם נרכיב את קטע זה ונבחן את קוד הביץ שלו דרך javap -cנראה משהו כמו:

0: חדש # 2 // מחלקה java / lang / Object 3: dup 4: invokespecial # 1 // שיטה java / lang / Object. "" :() V 7: astore_1

לאתחל האובייקט, ה- JVM מכנה שיטה מיוחדת בשם .בז'רגון JVM, שיטה זו היא שיטת אתחול מופע. שיטה היא אתחול מופע אם ורק אם:

  • זה מוגדר בכיתה
  • שמו הוא <init>
  • זה חוזר בָּטֵל

לכל מחלקה יכולות להיות אפס או יותר שיטות אתחול מופע. שיטות אלה בדרך כלל תואמות לבנאים בשפות תכנות מבוססות JVM כגון Java או Kotlin.

2.1. קונסטרוקטורים וחסימת אתחול מופעים

כדי להבין טוב יותר כיצד מהדר Java מתרגם קונסטרוקטורים ל- הבה נבחן דוגמה נוספת:

אדם בכיתה ציבורית {private String firstName = "Foo"; // פרטי מחרוזת lastName = "בר"; // // {System.out.println ("אתחול ..."); } // אדם ציבורי (שם מחרוזת, שם משפחה מחרוזת) {this.firstName = שם פרטי; this.lastName = lastname; } // אדם ציבורי () {}}

זהו קוד הביס של הכיתה הזו:

אדם ציבורי (java.lang.String, java.lang.String); קוד: 0: aload_0 1: invokespecial # 1 // שיטה java / lang / Object. "" :() V 4: aload_0 5: ldc # 7 // String Foo 7: putfield # 9 // First first Name: Ljava / lang /חוּט; 10: aload_0 11: ldc # 15 // סרגל מחרוזות 13: putfield # 17 // שם משפחה של שדה: Ljava / lang / String; 16: getstatic # 20 // שדה java / lang / System.out: Ljava / io / PrintStream; 19: ldc # 26 // מחרוזת אתחול ... 21: invokevirtual # 28 // שיטה java / io / PrintStream.println: (Ljava / lang / String;) V 24: aload_0 25: aload_1 26: putfield # 9 // שם פרטי בשדה: Ljava / lang / String; 29: aload_0 30: aload_2 31: putfield # 17 // שם משפחה של שדה: Ljava / lang / String; 34: לחזור

למרות שבניית בנאי האתחול נפרדים ב- Java, הם באותה שיטת אתחול של מופע ברמת קוד הקוד. למען האמת, זה שיטה:

  • ראשית, מאותחל את שם פרטי ו שם משפחה שדות (אינדקס 0 עד 13)
  • ואז הוא מדפיס משהו לקונסולה כחלק מבלוק אתחול המופע (אינדקס 16 עד 21)
  • ולבסוף, הוא מעדכן את משתני המופעים בארגומנטים של הבנאי

אם ניצור א אדם כדלהלן:

אדם אדם = אדם חדש ("בריאן", "גץ");

ואז זה מתורגם לקוד הביט הבא:

0: חדש # 7 // כיתה אדם 3: dup 4: ldc # 9 // String Brian 6: ldc # 11 // String Goetz 8: invokespecial # 13 // Method Method. "" :( Ljava / lang / String; Ljava / lang / String;) V 11: astore_1

הפעם JVM מתקשר לעוד אחד שיטה עם חתימה המתאימה לבנאי Java.

המפתח העיקרי כאן הוא שהבונים ומתחילים למופעים אחרים שווים ל- שיטה בעולם ה- JVM.

3. שיטות אתחול כיתתי

ב- Java, בלוקים לאתחול סטטי שימושיים כאשר אנו הולכים לאתחל משהו ברמת הכיתה:

אדם ממעמד ציבורי {לוגר לוגרי פרטי סטטי פרטי LOGGER = LoggerFactory.getLogger (Person.class); // // static {System.out.println ("אתחול סטטי ..."); } // הושמט }

כאשר אנו מחברים את הקוד הקודם, המהדר מתרגם את החסימה הסטטית לשיטת אתחול מחלקה ברמת קוד הקוד.

במילים פשוטות, שיטה היא אתחול מחלקה אם ורק אם:

  • שמו הוא
  • זה חוזר בָּטֵל

לכן, הדרך היחידה ליצור השיטה בג'אווה היא להשתמש בשדות סטטיים ומתחילים לחסימה סטטית.

JVM קוראת ל- בפעם הראשונה שאנחנו משתמשים בכיתה המתאימה. לכן, ה קריאה מתרחשת בזמן ריצה, ואנחנו לא יכולים לראות את ההפעלה ברמת קוד הקוד.

4. מסקנה

במאמר מהיר זה ראינו את ההבדל בין ו שיטות ב- JVM. ה השיטה משמשת לאתחול מופעי אובייקט. כמו כן, ה- JVM קורא ל שיטה לאתחול כיתה במידת הצורך.

כדי להבין טוב יותר כיצד אתחול פועל ב- JVM, מומלץ מאוד לקרוא את מפרט ה- JVM.


$config[zx-auto] not found$config[zx-overlay] not found