ค่าคงที่
"Amigo คุณรู้หรือไม่ว่าใน Java ไม่สามารถเปลี่ยนตัวแปรทั้งหมดได้"
"ว่าไงคิม อันที่จริงคำว่า 'ตัวแปร' นั้นพูดถึงการเปลี่ยนแปลง"
"ไม่ต้องสงสัยเลยในเรื่องนั้น เช่นเดียวกับภาษาโปรแกรมอื่น ๆ อีกมากมาย Java มีค่าคงที่ นั่นคือตัวแปรที่ไม่สามารถเปลี่ยนค่าได้และคำว่า 'ค่าคงที่' นั้นหมายถึงค่าคงที่"
"และพวกเขามีไว้เพื่ออะไร"
"โดยปกติจะใช้กับสิ่งพื้นฐานบางอย่าง เช่น จำนวนPi
หรือจำนวนวันในเดือนต่างๆ ของปี ซึ่งตามหลักการแล้ว โปรแกรมเมอร์สามารถทำให้ตัวแปรใดๆ เป็นค่าคงที่ได้ ถ้าเขาหรือเธอตัดสินใจว่าจะทำ จึงมีความจำเป็น"
"คุณหมายถึงชื่อ สีรถ หรือชื่อวันในสัปดาห์?"
"คุณมีความคิดที่ถูกต้อง สิ่งใดที่ไม่ควรเปลี่ยนแปลง"
"และค่าคงที่เหล่านี้มีลักษณะอย่างไรใน Java"
"Java มีคีย์เวิร์ดพิเศษสำหรับพวกเขา: final
การสร้างตัวแปรที่ไม่เปลี่ยนรูปมีลักษณะเหมือนกับการสร้างตัวแปรธรรมดา ข้อแตกต่างเพียงอย่างเดียวคือก่อนประเภทของตัวแปร คุณต้องเขียนคำ แบบfinal
นี้:
final Type name = value;
"จะเกิดอะไรขึ้นถ้าคุณสร้างค่าคงที่แล้วลองกำหนดค่าอื่นให้กับค่านั้น"
"นั่นเป็นคำถามที่ถูกต้อง! และคำตอบที่ถูกต้องคือ: หากคุณพยายามกำหนดค่าอื่นให้กับตัวแปรfinal
โปรแกรมของคุณก็จะคอมไพล์ไม่ได้"
"จะเป็นอย่างไรถ้าคุณประกาศfinal
ตัวแปรแต่ไม่ได้กำหนดค่าให้"
"ไม่มีประโยชน์ที่จะทำเช่นนี้ ดังนั้นจึงไม่ได้รับอนุญาตใน Java เช่นกัน ตัวแปรfinal
ต้องได้รับการเตรียมใช้งานเมื่อมีการประกาศ นั่นคือ คุณต้องกำหนดค่าให้กับตัวแปร มีข้อยกเว้นประการหนึ่งสำหรับกฎนี้: คุณสามารถย้ายการเริ่มต้นของ ตัวแปรคลาสคงที่ในคอนสตรัคเตอร์ แต่ คุณจะได้เรียนรู้เกี่ยวกับสิ่งนั้นในภายหลัง
"ที่กล่าวว่า ไม่ใช่ทุกอย่างที่เป็นfinal
ค่าคงที่ เพื่อลดจำนวนของคีย์เวิร์ด นักพัฒนา Java ใช้คำนี้final
มากกว่าการประกาศค่าคงที่ นอกจากfinal
นี้ยังใช้กับเมธอดและแม้แต่คลาส เมธอดที่ประกาศเป็นfinal
ไม่สามารถแทนที่ได้ และคลาส แจ้งว่าfinal
รับมรดกไม่ได้”
"เอ่อ... ถูกครอบงำ? สืบทอดมา? ตอนนี้ท่านกำลังพูดภาษาอะไรอยู่?"
"ภาษาของการเขียนโปรแกรมเชิงวัตถุ คุณจะเข้าถึงได้ในไม่ช้า จนกว่าจะถึงเวลานั้น ขอให้สนุกกับคำศัพท์ที่สวยงาม"
"เอาล่ะfinal
สามารถวางไว้หน้าตัวแปร คลาส และเมธอดได้ และคีย์เวิร์ดนี้ทำให้มันเปลี่ยนรูปไม่ได้ในความหมายบางอย่าง"
"ใช่ นอกจากนี้final
โมดิฟายเออร์อาจถูกเพิ่มก่อนตัวแปรใดๆ: ตัวแปรโลคัล พารามิเตอร์เมธอด ฟิลด์คลาส และตัวแปรคลาสสแตติก
"นี่คือสิ่งสำคัญที่ต้องจำ: final
ก่อนที่ชื่อตัวแปรจะเป็นเพียงการป้องกันการเปลี่ยนแปลงใดๆ กับตัวแปร นั้น หากตัวแปรเก็บข้อมูลอ้างอิงไปยังอ็อบเจกต์ ก็ยังสามารถเปลี่ยนแปลงออบเจ็กต์ได้"
"ฉันไม่ค่อยเข้าใจ"
"คุณจะเข้าใจในไม่ช้า นี่คือตัวอย่าง:
|
เราสร้างอาร์เรย์ ไม่อนุญาต:ตัวแปร data ถูกประกาศเป็นfinal . แต่คุณสามารถทำได้ และสิ่งนี้ด้วย |
"เข้าใจแล้ว มันยุ่งยาก"
ค่าคงที่ทั่วโลก
"คุณคิดว่าค่าคงที่ทั่วโลกคืออะไร"
"ฉันเดาว่าค่าคงที่ทั่วโลกอาจเหมือนกับตัวแปรส่วนกลาง แต่มีค่าคงที่เท่านั้น"
"แน่นอน ถ้าคุณต้องการประกาศค่าคงที่ส่วนกลางในโปรแกรมของคุณ ให้สร้างตัวแปรคลาสแบบสแตติกและทำให้เป็นpublic
และfinal
มีลักษณะพิเศษสำหรับชื่อของตัวแปรดังกล่าว: พวกมันเขียนด้วยอักษรตัวใหญ่ทั้งหมด โดยมีเครื่องหมายขีดล่างใช้เพื่อ แยกคำ
ตัวอย่าง:
class Solution
{
public static final String SOURCE_ROOT = "c:\\projects\\my\\";
public static final int DISPLAY_WIDTH = 1024;
public static final int DISPLAY_HEIGHT = 768;
}
เงาตัวแปร
"อย่างที่ฉันพูดไปก่อนหน้านี้ คุณไม่สามารถสร้างตัวแปรโลคัลหลายตัวด้วยชื่อเดียวกันในเมธอดเดียวได้ ในเมธอดต่างๆ คุณทำได้"
"ฉันรู้แล้ว!"
"แต่สิ่งที่คุณอาจไม่ทราบก็คือตัวแปรในคลาสและตัวแปรโลคัลในเมธอดอาจมีชื่อเหมือนกัน
ตัวอย่าง:
รหัส | การมองเห็นที่เปลี่ยนแปลงได้ |
---|---|
|
|
"ในadd
เมธอด เราประกาศตัวแปรโลคัลชื่อsum
จนกว่าจะสิ้นสุดเมธอด มันเงา (หรือมาสก์ ) sum
ตัวแปรอินสแตนซ์"
"อืม... ฉันจะบอกว่าในแง่หนึ่งนี่คือพฤติกรรมที่คาดหวัง"
"แต่นั่นไม่ใช่จุดสิ้นสุดของเรื่องราว ปรากฎว่าหากตัวแปรอินสแตนซ์ถูกเงาโดยตัวแปรโลคัล ก็ยังมีวิธีอ้างอิงถึงตัวแปรอินสแตนซ์ภายในเมธอด เราทำสิ่งนี้โดยเขียนคีย์เวิร์ดก่อนthis
ชื่อ :
this.name
"นี่คือตัวอย่างที่แก้ไขข้อขัดแย้งของชื่อได้สำเร็จ:
รหัส | การมองเห็นที่เปลี่ยนแปลงได้ |
---|---|
|
|
ตัวแปรcount
และsum
มีอยู่ทุกที่โดยมีหรือไม่มีthis
คำสำคัญ ในบรรทัดที่sum
ตัวแปรโลคัลแสดงsum
ตัวแปรอินสแตนซ์sum
ตัวแปรอินสแตนซ์สามารถเข้าถึงได้โดยใช้this
คำหลัก เท่านั้น
“แน่นอน ฉันจะต้องฝึกฝนสิ่งนี้”
“คุณจะจัดการ”
"จะเกิดอะไรขึ้นถ้าตัวแปรคลาสสแตติกถูกแชโดว์แทนที่จะเป็นเพียงตัวแปรอินสแตนซ์ (ไม่คงที่) คุณไม่สามารถเข้าถึงผ่านthis
?"
"ใช่แล้ว คีย์เวิร์ดนี้ใช้ไม่ได้ คุณต้องอ้างถึงคีย์เวิร์ดนี้ผ่านชื่อคลาส:
ClassName.name
ตัวอย่าง:
รหัส | การมองเห็นที่เปลี่ยนแปลงได้ |
---|---|
|
|
"ให้ความสนใจ: คุณสามารถเข้าถึง ตัวแปร count
และsum
สแตติกได้ทุกที่โดยมีหรือไม่ใช้ชื่อคลาสSolution
เป็นคำนำหน้า ในบรรทัดที่sum
ตัวแปรโลคัลเงาsum
ตัวแปรอินสแตนซ์ การเข้าถึงsum
ตัวแปรคลาสจะทำได้เมื่อใช้Solution
เป็นคำนำหน้า เท่านั้น
ตัวแปรภายในfor
ลูป
"และอีกหนึ่งข้อเท็จจริงเล็กๆ น้อยๆ แต่น่าสนใจ นอกจากนี้ยังมีสถานที่ที่มีการประกาศตัวแปรด้วยวิธีพิเศษ — ฉันกำลังพูดถึงภายในลูfor
ป " โดยปกติแล้วfor
การวนซ้ำจะมีcounter
ตัวแปรอยู่ในวงเล็บ และการมองเห็นของตัวแปรนี้จะเป็นอย่างไร? ท้ายที่สุดมันไม่ได้อยู่ในเนื้อหาของลูป มันเป็นวิธีการทั้งหมดหรือไม่? หรือไม่?"
"ฉันเคยได้ยินเรื่องนี้มาบ้างแล้ว ตามที่ฉันเข้าใจ ตัวแปรที่ประกาศในส่วนหัวของลูfor
ปจะมองเห็นได้เฉพาะในเนื้อหาของลูปและในส่วนหัวของfor
ลูป "
"ทำได้ดีมาก Amigo แต่ถึงกระนั้น ลองดูตัวอย่างเพื่อเสริมเนื้อหานี้:
รหัส | การมองเห็นที่เปลี่ยนแปลงได้ |
---|---|
|
|
"คุณกำลังบอกว่าในโค้ดของฉัน ฉันสามารถเขียนลูปหลายๆ ลูปซ้ำแล้วซ้ำเล่าด้วยตัวแปรตัวนับที่มีชื่อเดียวกันได้ และจะไม่มีปัญหาอะไรใช่ไหม"
"คงไม่มีปัญหา ดูนี่:
รหัส | การมองเห็นที่เปลี่ยนแปลงได้ |
---|---|
|
|
GO TO FULL VERSION