כריכה סטטית ודינמית בג'אווה

1. הקדמה

פולימורפיזם מאפשר לאובייקט ללבוש צורות מרובות - כאשר שיטה מציגה פולימורפיזם, על המהדר למפות את שם השיטה ליישום הסופי.

אם הוא ממופה בזמן הקומפילציה, זה מחייב סטטי או מוקדם.

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

2. הבנה באמצעות קוד

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

לדוגמא, בואו ניצור מעמד-על בעל חיים:

מחלקה ציבורית חיה {לוגר לוגר סטטי = LoggerFactory.getLogger (Animal.class); חלל ציבורי makeNoise () {logger.info ("רעש בעלי חיים כללי"); } חלל ציבורי makeNoise (חזרות שלמות) {while (חזרות! = 0) {logger.info ("ספירה לאחור של רעשי בעלי חיים" + חזרות); חזרות - = 1; }}}

ותת-מחלקה כֶּלֶב:

מעמד ציבורי כלב מאריך בעלי חיים {לוגר לוגר סטטי = LoggerFactory.getLogger (Dog.class); @ ביטול הריק הציבורי makeNoise () {logger.info ("ווף ווף!"); }}

על עומס יתר על שיטה, כמו לעשות רעש() שֶׁל בעל חיים בכיתה, המהדר יפתור את השיטה והקוד שלה בזמן הקומפילציה. זו דוגמה לכריכה סטטית.

עם זאת, אם נקצה אובייקט מסוג כֶּלֶב להתייחסות מסוג בעל חיים, המהדר יפתור את מיפוי קוד הפונקציה בזמן הריצה. זוהי כריכה דינמית.

כדי להבין איך זה עובד, בואו נכתוב קטע קוד קטן כדי לקרוא לשיעורים ולשיטות שלו:

חיה מהחי = חיה חדשה (); // שיטות קריאה של חפץ מן החי animal.makeNoise (); animal.makeNoise (3); // הקצאת אובייקט כלב להפניה לסוג בעלי החיים בעלי חיים כלב בעלי חיים = כלב חדש (); dogAnimal.makeNoise (); הפלט של הקוד שלעיל יהיה:
com.baeldung.binding.Animal - רעש בעלי חיים כללי com.baeldung.binding.Animal - ספירה לאחור של רעשי בעלי חיים 3 com.baeldung.binding. בעלי חיים - ספירה לאחור של רעשי בעלי חיים 2 com.baeldung.binding. בעלי חיים - ספירה לאחור של רעשי בעלי חיים 1 com.baeldung.binding.Dog - ווף ווף!

עכשיו בואו ניצור כיתה:

class AnimalActivity {חלל סטטי ציבורי אוכל (בעלי חיים) {System.out.println ("חיה אוכלת"); } חלל סטטי ציבורי לאכול (כלב כלב) {System.out.println ("הכלב אוכל"); }}

בואו נוסיף את השורה למעמד הראשי:

AnimalActivity.eat (dogAnimal);

התפוקה תהיה:

com.baeldung.binding.AnimalActivity - חיה אוכלת

דוגמה זו מראה כי פונקציה סטטית עוברת קשירה סטטית.

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

שיטה מאוגדת סטטית אינה קשורה לאובייקט מסוים אלא נקראת סוּג (כיתה בג'אווה). הביצוע של שיטה כזו מהיר בשוליים.

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

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

3. מסקנה

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

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

כמו תמיד, הקוד זמין ב- GitHub.