"เนื่องจากนักพัฒนาสามารถสร้างชั้นเรียนที่อธิบายเกี่ยวกับตัวเลขได้ พวกเขาจึงตัดสินใจที่จะสร้างสรรค์เช่นเดียวกับนักพัฒนาจริงๆ"
"ขั้นแรก พวกเขาสร้างคลาส Number แบบนามธรรม ซึ่งมาจาก Byte, Short, Integer, Long, Float และ Double ซึ่งมีเมธอดที่ช่วยแปลงตัวเลขเป็นประเภทตัวเลขอื่นๆ"
เมธอดของคลาส Number | |
---|---|
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
"ถูกต้อง ท้ายที่สุดคุณไม่สามารถเขียนสิ่งนี้:"
Long x = 100000;
Integer y = (Integer) x;
"ใช่ ประเภทเหล่านี้ไม่ใช่ประเภทดั้งเดิม นั่นเป็นเหตุผลที่เราใช้เมธอดของคลาส Number:"
Long x = 100000;
Integer y = x.intValue();
"แต่ยังมีอีกสองสามสิ่งที่ต้องพิจารณา เนื่องจากจำนวนเต็มไม่ใช่ int จึงไม่สามารถเปรียบเทียบวัตถุจำนวนเต็มกับตัวดำเนินการ «==» แบบคลาสสิกได้"
int x = 500;
int y = 500;
x == y; //true
Integer x = 500;
Integer y = 500;
x == y; //false
x.equals(y); //true
"ถูกต้อง ยังไงก็ตาม ฉันไม่ได้คิดถึงเรื่องนั้นในทันที"
"แต่ยังมีอีก"
"คุณกำลังทำให้วงจรของฉันลัดวงจร! มีอะไรอีก"
"เมื่อเรากำหนดค่า int ให้กับตัวแปร Integer เมธอด Integer.valueOf จะเรียกว่า:"
รหัส | เกิดอะไรขึ้นจริงๆ |
---|---|
|
|
"ใช่ ฉันเข้าใจแล้วจากตัวอย่างด้านบน"
"แต่ ฟังก์ชัน valueOf ไม่ได้สร้างวัตถุจำนวนเต็มใหม่เสมอไป"
"เอ่อ คุณหมายความว่าอย่างไร «ไม่เสมอไป»"
"มันแคชค่าตั้งแต่ -128 ถึง 127"
รหัส | เกิดอะไรขึ้นจริงๆ | คำอธิบาย |
---|---|---|
|
|
ตัวแปร x, y และ z มีการอ้างอิงถึงวัตถุต่างๆ |
|
|
ตัวแปร x, y และ z มีการอ้างอิงไปยังวัตถุเดียวกัน |
|
|
ตัวแปร z และ t มีการอ้างอิงไปยังวัตถุเดียวกัน |
"อีกนัยหนึ่ง สถานการณ์คือ:"
1) หากเราเขียน «จำนวนเต็มใหม่()» รับประกันว่าเราจะได้วัตถุใหม่
2) หากเราเรียก Integer.valueOf() อย่างชัดเจนหรือผ่าน autoboxing เมธอดอาจส่งคืนวัตถุใหม่หรือวัตถุที่แคชหากอาร์กิวเมนต์ number อยู่ในช่วงตั้งแต่ -128 ถึง 127
"อะไรที่แย่มากเกี่ยวกับวิธีการส่งคืนวัตถุจากแคช"
"ไม่เป็นไร คุณแค่ต้องรู้ว่าบางครั้งเมื่อคุณไม่คาดคิด วัตถุอาจเท่ากัน ทุกสิ่งที่มีความเท่าเทียมกันนั้นซับซ้อน หากเราเปรียบเทียบสิ่งดั้งเดิมกับสิ่งไม่ดั้งเดิม พวกมันจะถูกเปรียบเทียบเป็นสิ่งดั้งเดิม:"
int x = 300;
Integer y = 300;
Integer z = 300;
x == y; //true (comparison based on primitive value)
x == z; //true (comparison based on primitive value)
y == z; //false (comparison based on references)
int x = 100;
Integer y = 100;
Integer z = 100;
x == y; //true (comparison based on primitive value)
x == z; //true (comparison based on primitive value)
y == z; //true (comparison based on references; they point to the same object)
int x = 100;
Integer y = new Integer(100);
Integer z = 100;
x == y; //true (comparison based on primitive value)
x == z; //true (comparison based on primitive value)
y == z; //false (comparison based on references; they point to different objects)
"เยี่ยมมาก... แล้วฉันจะจำทั้งหมดนี้ได้อย่างไร"
"คุณไม่จำเป็นต้องท่องจำสิ่งนี้ คุณเพียงแค่ต้องเข้าใจว่าทั้งหมดนี้ถูกจัดระเบียบอย่างไร และเกิดอะไรขึ้นจริงเมื่อสิ่งดั้งเดิมและไม่ใช่สิ่งดั้งเดิมเข้ามามีบทบาท"
"ฉันยังแนะนำให้คุณดูที่วิธีการของคลาส Integer มันมีวิธีการที่ดีและมีประโยชน์ค่อนข้างน้อย คุณเคยใช้หนึ่งในนั้นค่อนข้างบ่อยด้วยซ้ำ"
"ใช่ ฉันจำได้ Integer.parseInt();"
GO TO FULL VERSION