1. รายการประเภทกระดาษห่อ

คุณรู้ว่า Java มี 8 ประเภทดั้งเดิมซึ่งเป็นประเภทที่ไม่ใช่คลาส ในแง่หนึ่งนี่เป็นสิ่งที่ดี — มันเรียบง่ายและใช้พื้นที่น้อย ในทางกลับกัน บางครั้งชั้นเรียนก็เป็นเพียงสิ่งที่เราต้องการ คุณจะทราบสาเหตุที่แท้จริงในบทเรียนถัดไป

แล้วจะทำอะไรได้บ้าง?

เริ่มต้นด้วย Java เวอร์ชันที่ห้า แต่ละประเภทดั้งเดิมได้รับคลาสแฝด แต่ละคลาสดังกล่าวจะจัดเก็บฟิลด์เดียวที่มีค่าของประเภทเฉพาะ คลาสเหล่านี้เรียกว่าwrapper typesเนื่องจากคลาสเหล่านี้รวมค่าดั้งเดิมไว้ในคลาส

นี่คือรายการประเภทเหล่านี้ คุณรู้หรือไม่?

ประเภทดึกดำบรรพ์ ชั้นห่อ
byte
Byte
short
Short
int
Integer
long
Long
float
Float
double
Double
char
Character
boolean
Boolean

ชื่อของประเภทดั้งเดิมจะขึ้นต้นด้วยอักษรตัวพิมพ์เล็ก แต่ชื่อของคลาสตัวตัดคำจะขึ้นต้นด้วยอักษรตัวพิมพ์ใหญ่ ชื่อคลาสบางตัวยังยาวกว่าเล็กน้อย: Integerinstead of intи Characterinstead ofchar

วัตถุทั้งหมดของคลาส wrapper ไม่สามารถเปลี่ยนแปลงได้ ( ไม่เปลี่ยนรูป )

รหัสแบบง่ายสำหรับIntegerคลาสมีลักษณะดังนี้:

รหัส บันทึก
public class Integer
{
   private int value;

   Integer(int x)
   {
      this.value = x;
   }

   public int intValue()
   {
      return this.value;
   }

   public static Integer valueOf(int x)
   {
      return new Integer(x);
   }
}




ตัวสร้างตัวแปรเมธอด




ส่งคืนค่า




เมธอดสแตติกสร้างออบเจกต์ใหม่Integerสำหรับintตัวแปร

2. การแปลง an intเป็น anInteger

ประเภทของ Wrapper ถือเป็นสิ่งที่คู่กันกับพี่น้องดั้งเดิม: คุณสามารถสร้างวัตถุ Wrapper ที่สอดคล้องกับประเภทดั้งเดิมได้อย่างง่ายดาย

ลองใช้ประเภท int เป็นตัวอย่างเพื่อวิเคราะห์ว่าประเภทดั้งเดิมโต้ตอบกับประเภท wrapper ที่สอดคล้องกันอย่างไร รหัสสำหรับการแปลงจาก an intเป็น an Integerและในทางกลับกันจะมีลักษณะดังนี้:

ในการแปลง an intเป็น an Integerคุณต้องเขียนโค้ดนี้:

Integer name = new Integer(value);

nameชื่อของตัวแปรอยู่ที่ไหนIntegerและvalueเป็นintค่า ที่ห่อไว้

ตัวอย่าง:

รหัส บันทึก
Integer age = new Integer(18);
Integer hundred = new Integer(100);
Integer zero = new Integer(0);

และในการแปลง an Integerเป็น an intคุณต้องเขียนโค้ดนี้:

int name = variable.intValue();

nameชื่อของ ตัวแปร อยู่ที่ไหนintและvariableเป็นการอ้างอิงถึงIntegerวัตถุ

ตัวอย่าง:

รหัส บันทึก
Integer age = new Integer(18);
int x = age.intValue();

x == 18
Integer hundred = new Integer(100);
int y = hundred.intValue();

y == 100
Integer zero = new Integer(0);
int z = zero.intValue();


z == 0
int i = 110;
Integer zero = new Integer(i);
int z = zero.intValue();

z == 110

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

แต่การดำเนินการอย่างง่ายกับIntegerประเภทนั้นไม่ใช่เรื่องง่ายที่จะเขียน

ดังที่เราได้กล่าวไว้ก่อนหน้านี้Integerประเภทไม่สามารถเปลี่ยนแปลงได้ ( ไม่เปลี่ยนรูป ) หากต้องการสร้างIntegerวัตถุด้วยค่าใหม่intคุณต้องสร้างIntegerวัตถุ ใหม่อย่างชัดเจน ที่กล่าวว่าเป็นเรื่องง่ายที่จะรับค่าที่intเก็บไว้ภายในIntegerวัตถุ - เพียงแค่เรียกใช้intValue()เมธอด

ตัวอย่าง:

รหัส คำอธิบาย
Integer a = Integer.valueOf(5);
int b = a.intValue();
Integer c = new Integer(b + 5)
ล้อม5วัตถุ รับค่าจากIntegerวัตถุสร้าง วัตถุใหม่(เท่ากับ 10)
Integer
Integer

นี่เป็นโค้ดที่ค่อนข้างยุ่งยาก คุณว่าไหม?

ผู้สร้าง Java คิดเช่นนั้น ดังนั้นพวกเขาจึงสอนคอมไพเลอร์ถึงวิธีดำเนินการเหล่านี้โดยอัตโนมัติ การแปลง an โดยอัตโนมัติintเป็น an Integerเรียกว่าautoboxing (การใส่ค่าลงในช่องโดยอัตโนมัติ) และการดำเนินการย้อนกลับ (การแปลง an เป็นIntegeran int) เรียกว่าunboxing

รหัสของคุณ สิ่งที่คอมไพเลอร์เห็น
Integer a = 10;
Integer a = Integer.valueOf(10);
int b = a;
int b = a.intValue();
Integer c = a + b;
Integer c = Integer.valueOf(a.intValue() + b);

ต้องขอบคุณ autoboxing และ unboxing คุณสามารถกำหนด an intให้กับIntegerตัวแปรและในทางกลับกัน ได้อย่างปลอดภัย คุณสามารถเขียนนิพจน์ของความซับซ้อนใดๆ ได้โดยไม่ต้องแยกความแตกต่างระหว่างintและIntegerประเภท

ตัวอย่าง:

รหัส สิ่งที่คอมไพเลอร์จะสร้าง
Integer a = 5;
int b = a;
Integer c = a + b;
int d = a + b + c;
Integer a = Integer.valueOf(5);
int b = a.intValue();
Integer c = Integer.valueOf(a.intValue() + b);
int d = a.intValue() + b + c.intValue();
Integer a = 5;
int b = 5;

if (a == b)
{
   ...
}
Integer a = Integer.valueOf (5);
int b = 5;

if (a.intValue() == b)
{
   ...
}


4. การเปรียบเทียบตัวแปร wrapper

การแกะกล่องอัตโนมัติและการแกะกล่องเป็นกระบวนการที่ง่ายและโปร่งใส เราใช้new Integer()ข้อความสั่งตามต้องการ และเราเรียกintValue()เมธอดตามต้องการ

ทุกอย่างทำงานได้ดีและง่ายสำหรับคุณซึ่งเป็นโปรแกรมเมอร์ โปรดทราบว่าหากคุณเปรียบเทียบ an Integerและ an Integerการเปรียบเทียบจะขึ้นอยู่กับการอ้างอิงไม่ใช่ค่า

รหัส เอาต์พุตคอนโซล
Integer a = 1000;
Integer b = 1000;

System.out.println(a == b);



false
Integer a = 1000;
Integer b = 1000;

System.out.println(a.equals(b));



true

ตัวแปรaand bไม่เก็บintค่า พวกเขาเก็บการอ้างอิงถึงวัตถุ นั่นหมายความว่าสิ่งสำคัญคือต้องจำวิธีเปรียบเทียบอย่างถูกต้อง:

ผิด ขวา
Integer a = 1000;
Integer b = 1000;
if (a == b)
{
   ...
}
Integer a = 1000;
Integer b = 1000;
if (a.equals(b))
{
   ...
}