CodeGym /בלוג Java /Random-HE /אוטו-בוקסינג ו-Unboxing ב-Java
John Squirrels
רָמָה
San Francisco

אוטו-בוקסינג ו-Unboxing ב-Java

פורסם בקבוצה
בג'אווה, תכונה של פרימיטיבים והעטיפות שלהם היא אוטובוקסינג / unboxing. בואו נחפור בקונספט הזה. כפי שכבר למדנו, Java היא שפה מונחה עצמים. זה אומר שכל התוכניות שנכתבות ב-Java עשויות מאובייקטים. פרימיטיבים אינם אובייקטים. אבל למרות זאת, למשתנה עטיפה ניתן להקצות ערך פרימיטיבי. תהליך זה נקרא אוטובוקסינג. באופן דומה, ניתן להקצות למשתנה פרימיטיבי אובייקט עטיפה. תהליך זה נקרא unboxing. לדוגמה:
public class Main {
   public static void main(String[] args) {
       int x = 7;
       Integer y = 111;
       x = y; // Unboxing
       y = x * 123; // Autoboxing
   }
}
בשורה 5, אנו מקצים את y, שהוא אובייקט של מספר שלם , ל- x הפרימיטיבי . כפי שאתה יכול לראות, אנחנו לא צריכים לנקוט בצעדים נוספים: המהדר יודע ש- int ו- Integer הם, בעצם, אותו דבר. זה unboxing. משהו דומה קורה עם אגרוף אוטומטי בשורה 6: הערך הפרימיטיבי (x * 123) מוקצה בקלות לאובייקט y . זוהי דוגמה ל-autoboxing. זו הסיבה שהמונח כולל את המילה "אוטו": כי לא צריך לעשות שום דבר מיוחד כדי להקצות פרימיטיביים לאובייקטים העוטפים המתאימים להם (ולהיפך). הכל קורה אוטומטית. נוח, הא? :) אנו רואים דוגמה נוספת לנוחות של אוטובוקסינג / unboxing בעבודה עם שיטות. הסיבה לכך היא שארגומנטים של שיטה הם גם מתאגרפים אוטומטיים ויוצאים מהתיבה. לדוגמה, אם מתודה לוקחת שני אובייקטים שלמים כקלט, נוכל להעביר בקלות int s רגילים במקום זאת!
public class Main {
   public static void main(String[] args) {

       printNumber(7);// A standard int, not even an int variable
   }

   public static void printNumber(Integer i) {
       System.out.println("You entered the number " + i);
   }
}
תְפוּקָה:
You entered the number 7
זה עובד גם בכיוון השני:
public class Main {
   public static void main(String[] args) {

       printNumber(new Integer(632));
   }

   public static void printNumber(int i) {
       System.out.println("You entered the number " + i);
   }
}
נקודה חשובה שאתה צריך לזכור היא זו: אוטובוקסינג ו-unboxing לא עובדים עבור מערכים!
public class Main {
   public static void main(String[] args) {

       int[] i = {1,2,3,4,5};

       printArray(i);// Error, this won't compile!
   }

   public static void printArray(Integer[] arr) {
       System.out.println(Arrays.toString(arr));
   }
}
ניסיון להעביר מערך פרימיטיבים לשיטה שלוקחת מערך אובייקטים יגרום לשגיאת קומפילציה. לסיכום, בואו נשווה בקצרה פעם נוספת בין פרימיטיביים ועטיפות.

פרימיטיבים:

  • בעלי יתרונות ביצועים
עטיפות:
  • הרשו לנו לא להפר את עקרון "הכל אובייקט", כלומר מספרים, תווים וערכים בוליאניים אינם מפרים את המושג הזה
  • הרחב את האפשרויות לעבודה עם ערכים אלו על ידי מתן שיטות ושדות נוחים
  • נחוצים כאשר שיטה עובדת רק עם אובייקטים
כדי לחזק את מה שלמדת, אנו מציעים לך לצפות בשיעור וידאו מקורס Java שלנו
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION