CodeGym /จาวาบล็อก /สุ่ม /การทำกล่องอัตโนมัติและการแกะกล่องใน Java
John Squirrels
ระดับ
San Francisco

การทำกล่องอัตโนมัติและการแกะกล่องใน Java

เผยแพร่ในกลุ่ม
ใน Java คุณลักษณะดั้งเดิมและ wrapper ของมันคือ autoboxing / unboxing มาเจาะลึกแนวคิดนี้กัน ตามที่เราได้เรียนรู้ไปแล้ว Java เป็นภาษาเชิงวัตถุ นั่นหมายความว่าโปรแกรมทั้งหมดที่เขียนด้วย Java ถูกสร้างขึ้นจากวัตถุ ดั้งเดิมไม่ใช่วัตถุ แต่ถึงกระนั้น ตัวแปร wrapper ก็สามารถกำหนดค่าดั้งเดิมได้ กระบวนการนี้เรียกว่าออโต้บ็อกซ์ ในทำนองเดียวกัน ตัวแปรดั้งเดิมสามารถกำหนดออบเจ็กต์ wrapper ได้ กระบวนการนี้เรียกว่าการแกะกล่อง ตัวอย่างเช่น:
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เป็นสิ่งเดียวกัน นั่นคือการแกะกล่อง สิ่งที่คล้ายกันเกิดขึ้นกับ autoboxing ในบรรทัดที่ 6: ค่าดั้งเดิม (x * 123) ถูกกำหนดให้กับวัตถุyได้ อย่างง่ายดาย นี่คือตัวอย่างของการออโต้บ็อกซ์ นั่นเป็นสาเหตุที่คำนี้รวมคำว่า "อัตโนมัติ" ไว้ด้วย เพราะคุณไม่จำเป็นต้องทำอะไรเป็นพิเศษเพื่อกำหนดค่าพื้นฐานให้กับออบเจ็กต์ wrapper ที่เกี่ยวข้อง (และในทางกลับกัน) ทุกอย่างเกิดขึ้นโดยอัตโนมัติ สะดวกใช่มั้ย? :) เราเห็นอีกตัวอย่างหนึ่งของความสะดวกสบายของ autoboxing / unboxing เมื่อทำงานกับวิธีการต่างๆ นี่เป็นเพราะว่าอาร์กิวเมนต์ของเมธอดนั้นมีทั้งแบบออโต้บ็อกซ์และแบบไม่มีกล่องด้วย ตัวอย่างเช่น หากเมธอดรับออบ เจ็กต์ Integer สอง ตัวเป็นอินพุต เราสามารถส่ง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);
   }
}
จุดสำคัญที่คุณต้องจำไว้คือ: การทำกล่องอัตโนมัติและการแกะกล่องใช้ไม่ได้กับอาร์เรย์!
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));
   }
}
ความพยายามที่จะส่งอาร์เรย์ของวัตถุดั้งเดิมไปยังวิธีการที่รับอาร์เรย์ของวัตถุจะส่งผลให้เกิดข้อผิดพลาดในการคอมไพล์ โดยสรุป เรามาเปรียบเทียบ primitive และ wrappers กันสั้นๆ อีกครั้งหนึ่ง

ดั้งเดิม:

  • มีข้อดีด้านประสิทธิภาพ
กระดาษห่อ:
  • ปล่อยให้เราไม่ละเมิดหลักการ "ทุกสิ่งเป็นวัตถุ" ซึ่งหมายความว่าตัวเลข อักขระ และค่าบูลีนจะไม่ละเมิดแนวคิดนี้
  • ขยายความเป็นไปได้ในการทำงานกับค่าเหล่านี้โดยจัดเตรียมวิธีการและฟิลด์ที่สะดวก
  • จำเป็นเมื่อวิธีการทำงานกับวัตถุเท่านั้น
เพื่อเสริมสิ่งที่คุณเรียนรู้ เราขอแนะนำให้คุณชมบทเรียนวิดีโอจากหลักสูตร Java ของเรา
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION