คงที่ หมายถึง "ทั่วโลก" หรือ "คงที่" และใช้ในการแก้ไขตัวแปรสมาชิกและวิธีการสมาชิก นอกจากนี้ยังสามารถสร้างบล็อกโค้ดแบบคงที่ แต่ไม่มีแนวคิดเกี่ยวกับตัวแปรส่วนกลางในภาษา Java
ตัวแปรสมาชิกและวิธีการสมาชิกที่ถูกแก้ไขโดยสแตติกจะไม่ขึ้นอยู่กับอ็อบเจ็กต์ใดๆ ของคลาส นั่นคือมันไม่ได้ขึ้นอยู่กับอินสแตนซ์เฉพาะของคลาสและแชร์โดยอินสแตนซ์ทั้งหมดของคลาส
ตราบใดที่คลาสนี้ถูกโหลด เครื่องเสมือน Java สามารถค้นหาได้ตามค่าเริ่มต้นในพื้นที่วิธีการของพื้นที่ข้อมูลรันไทม์ตามชื่อคลาส ดังนั้น คุณจึงสามารถเข้าถึงออบเจ็กต์แบบคงที่ได้ก่อนที่จะสร้างออบเจ็กต์ใดๆ โดยไม่ต้องอ้างอิงถึงออบเจ็กต์ใดๆ
ตัวแปรสมาชิกแบบคงที่และวิธีการสมาชิกที่แก้ไขด้วยสาธารณะนั้นเป็นตัวแปรส่วนกลางและวิธีการทั่วโลก เมื่อมีการประกาศอ็อบเจ็กต์ของคลาสนั้น สำเนาของตัวแปรคงที่จะไม่ถูกสร้างขึ้น แต่อินสแตนซ์ทั้งหมดของคลาสจะใช้ตัวแปรสแตติกเดียวกัน
ตัวแปรแบบคงที่สามารถนำหน้าด้วยการแก้ไขส่วนตัว ซึ่งหมายความว่าตัวแปรนี้สามารถใช้ในบล็อกโค้ดแบบคงที่ของคลาส หรือในวิธีการสมาชิกแบบคงที่อื่นๆ ของคลาส (แน่นอนว่า สามารถใช้ในแบบที่ไม่คงที่ได้เช่นกัน วิธีการสมาชิก) แต่ไม่สามารถใช้ในคลาสอื่นได้ สิ่งสำคัญคือต้องอ้างอิงถึงชื่อคลาสโดยตรง ในความเป็นจริง คุณต้องเข้าใจว่า private หมายถึงการจำกัดสิทธิ์การเข้าถึง และแบบคงที่หมายความว่าสามารถใช้งานได้โดยไม่ต้องสร้างอินสแตนซ์ ซึ่งเข้าใจได้ง่ายกว่ามาก ผลกระทบของการเพิ่มคีย์เวิร์ดสิทธิ์การเข้าถึงอื่นๆ ก่อนสแตติกก็เหมือนกันเช่นกัน
ตัวแปรสมาชิกและเมธอดสมาชิกที่แก้ไขโดยสแตติกมักเรียกว่าตัวแปรสแตติกและวิธีการสแตติก ซึ่งสามารถเข้าถึงได้โดยตรงผ่านชื่อคลาส
ชื่อคลาส ชื่อวิธีการแบบคงที่ (รายการพารามิเตอร์...)
ชื่อคลาส ชื่อตัวแปรแบบคงที่
บล็อกโค้ดที่ถูกแก้ไขด้วย static แสดงถึงบล็อกโค้ดแบบคงที่ เมื่อ Java Virtual Machine (JVM) โหลดคลาส บล็อกโค้ดจะถูกดำเนินการ (มีประโยชน์มาก 555)
1. ตัวแปรคงที่
ตัวแปรสมาชิกของคลาสสามารถแบ่งได้เป็นสองประเภทตามว่าเป็นแบบคงที่หรือไม่: แบบหนึ่งคือตัวแปรที่ถูกแก้ไขโดยแบบคงที่เรียกว่าตัวแปรแบบคงที่หรือตัวแปรคลาส; อีกแบบหนึ่งคือตัวแปรที่ไม่ได้รับการแก้ไขโดยแบบคงที่เรียกว่าตัวแปรอินสแตนซ์
ความแตกต่างระหว่างทั้งสองคือ:
สำหรับตัวแปรคงที่ จะมีเพียงสำเนาเดียวในหน่วยความจำ (เพื่อบันทึกหน่วยความจำ) JVM จะจัดสรรหน่วยความจำเพียงครั้งเดียวสำหรับตัวแปรคงที่ การจัดสรรหน่วยความจำของตัวแปรคงที่จะเสร็จสมบูรณ์ในระหว่างกระบวนการโหลดคลาส ชื่อคลาส (สะดวก) แน่นอนว่าสามารถเข้าถึงได้ผ่านอ็อบเจ็กต์ด้วย (แต่ไม่แนะนำ)
สำหรับตัวแปรอินสแตนซ์ ก่อนที่จะสร้างอินสแตนซ์ หน่วยความจำจะถูกจัดสรรหนึ่งครั้งสำหรับตัวแปรอินสแตนซ์สามารถมีสำเนาได้หลายชุดในหน่วยความจำโดยไม่กระทบต่อกัน (ยืดหยุ่น)
ดังนั้น โดยทั่วไปจะใช้ตัวแปรคงที่เมื่อจำเป็นต้องใช้งานสองฟังก์ชันต่อไปนี้:
1).เมื่อแบ่งปันค่าระหว่างวัตถุ
2).เมื่อเข้าถึงตัวแปรได้สะดวก
2. วิธีการแบบคงที่
วิธีการแบบคงที่สามารถเรียกได้โดยตรงผ่านชื่อคลาส และสามารถเรียกอินสแตนซ์ใดๆ ก็ได้
ดังนั้น คำสำคัญนี้และซุปเปอร์ไม่สามารถใช้ในวิธีการแบบคงที่ และไม่สามารถเข้าถึงตัวแปรอินสแตนซ์และวิธีการอินสแตนซ์ของคลาสที่พวกมันอยู่ได้โดยตรง (นั่นคือ ตัวแปรสมาชิกและวิธีการของสมาชิกที่ไม่มีตัวแปรแบบคงที่เท่านั้นและ) วิธีการสมาชิกของคลาสที่พวกเขาอยู่สามารถเข้าถึงได้
เพราะสมาชิกของอินสแตนซ์เชื่อมโยงกับวัตถุเฉพาะ! สิ่งนี้ต้องเข้าใจและคิดออก ไม่ใช่ท่องจำ! - -
เนื่องจากวิธีการแบบสแตติกไม่ขึ้นอยู่กับอินสแตนซ์ใดๆ จึงต้องใช้วิธีการแบบคงที่และไม่สามารถเป็นแบบนามธรรมได้
ตัวอย่างเช่น เพื่ออำนวยความสะดวกในการเรียกเมธอด เมธอดทั้งหมดในคลาส Math ใน Java API จะเป็นแบบคงที่ และวิธีการแบบสแตติกภายในคลาสทั่วไปยังช่วยให้คลาสอื่นสามารถเรียกเมธอดได้อีกด้วย
วิธีการแบบคงที่เป็นวิธีการพิเศษภายในชั้นเรียน วิธีการที่สอดคล้องกันจะถูกประกาศเมื่อจำเป็นเท่านั้น วิธีการภายในชั้นเรียนโดยทั่วไปจะไม่คงที่
3. บล็อกรหัสคงที่
บล็อกโค้ดแบบคงที่เรียกอีกอย่างว่าบล็อกโค้ดแบบคงที่ ซึ่งเป็นบล็อกคำสั่งแบบคงที่ในคลาสที่ไม่ขึ้นกับสมาชิกของคลาส สามารถมีได้หลายรายการและสามารถวางไว้ที่ใดก็ได้ จะถูกดำเนินการเมื่อ JVM โหลดคลาส หากมีบล็อกโค้ดแบบคงที่หลายบล็อก JVM จะดำเนินการตามลำดับที่ปรากฏในคลาส และแต่ละบล็อกโค้ดจะถูกดำเนินการเพียงครั้งเดียวเท่านั้น ตัวอย่างเช่น:
Test5 คลาสสาธารณะ { ส่วนตัว int b; tb = 3; System.out.print; println (tb); } คงที่ { Test5.a = 4; System.out.println (a); } สาธารณะคงเป็นโมฆะหลัก (สตริง [] args) { // TODO สร้างเมธอด stubs} โดยอัตโนมัติ { Test5.a=5; System.out.println(a); } public void f(){ System.out.println("hhahhahah" } }
ผลการวิ่ง:
3
ฮ่าๆๆๆ
1,000
4
5
คุณสามารถใช้บล็อกโค้ดแบบคงที่เพื่อกำหนดค่าให้กับตัวแปรคงที่บางตัวได้ สุดท้ายนี้ ลองดูตัวอย่างเหล่านี้ทั้งหมดมีเมธอดหลักแบบสแตติก เพื่อให้ JVM สามารถเรียกมันได้โดยตรงโดยไม่ต้องสร้างอินสแตนซ์เมื่อรันเมธอดหลัก .
4. คงที่และสุดท้ายหมายถึงอะไรเมื่อใช้ร่วมกัน?
ขั้นสุดท้ายแบบคงที่ใช้เพื่อแก้ไขตัวแปรสมาชิกและวิธีการของสมาชิก ซึ่งสามารถเข้าใจได้ง่ายว่าเป็น "ค่าคงที่ทั่วโลก"!
สำหรับตัวแปร หมายความว่าเมื่อกำหนดค่าแล้ว จะไม่สามารถแก้ไขได้และสามารถเข้าถึงได้ผ่านชื่อคลาส
สำหรับเมธอด หมายความว่าไม่สามารถแทนที่ได้และสามารถเข้าถึงได้โดยตรงผ่านชื่อคลาส
บางครั้งคุณต้องการกำหนดสมาชิกของคลาสเพื่อให้การใช้งานไม่ขึ้นอยู่กับอ็อบเจ็กต์ใดๆ ของคลาสนั้นโดยสมบูรณ์ โดยปกติแล้ว สมาชิกคลาสจะต้องเข้าถึงได้ผ่านอ็อบเจ็กต์ของคลาส แต่คุณสามารถสร้างสมาชิกที่สามารถใช้งานได้ด้วยตัวเองโดยไม่ต้องอ้างอิงถึงอินสแตนซ์เฉพาะ สมาชิกดังกล่าวสามารถสร้างขึ้นได้โดยการเพิ่มคำหลัก static (static) ก่อนการประกาศของสมาชิก หากสมาชิกถูกประกาศแบบคงที่ คุณจะสามารถเข้าถึงได้ก่อนที่จะสร้างอ็อบเจ็กต์ใดๆ ของคลาสนั้นโดยไม่ต้องอ้างอิงอ็อบเจ็กต์ใดๆ คุณสามารถประกาศทั้งวิธีการและตัวแปรเป็นแบบคงที่ได้ ตัวอย่างที่พบบ่อยที่สุดของสมาชิกแบบคงที่คือ main() เนื่องจากจะต้องเรียก main() เมื่อโปรแกรมเริ่มดำเนินการ จึงถูกประกาศเป็นค่าคงที่
ตัวแปรที่ประกาศแบบคงที่ถือเป็นตัวแปรส่วนกลางเป็นหลัก เมื่อมีการประกาศวัตถุ สำเนาของตัวแปรคงที่จะไม่ถูกสร้างขึ้น แต่ตัวแปรอินสแตนซ์ทั้งหมดของคลาสใช้ตัวแปรคงที่เดียวกัน วิธีการประกาศแบบคงที่มีข้อจำกัดดังต่อไปนี้:
1) พวกเขาสามารถเรียกเฉพาะวิธีคงที่อื่น ๆ เท่านั้น
2).พวกเขาสามารถเข้าถึงเฉพาะข้อมูลคงที่เท่านั้น
3).พวกเขาไม่สามารถอ้างถึงสิ่งนี้หรือ super ในทางใดทางหนึ่งได้ (คำหลัก super เกี่ยวข้องกับการสืบทอดและจะอธิบายไว้ในบทถัดไป)
หากคุณต้องการเริ่มต้นตัวแปรคงที่ผ่านการคำนวณ คุณสามารถประกาศบล็อกแบบคงที่ได้ บล็อกแบบคงที่จะถูกดำเนินการเพียงครั้งเดียวเมื่อมีการโหลดคลาส ตัวอย่างต่อไปนี้แสดงคลาสที่มีเมธอดแบบสแตติก ตัวแปรสแตติกบางตัว และบล็อกตัวเริ่มต้นแบบสแตติก:
// สาธิตตัวแปรคงที่ วิธีการ และบล็อก UseStatic { static int a = 3; static int b; static meth(int x) { System.out.println("x = " + x); println("a = " + a); System.out.println("b = " + b); } คงที่ { System.out.println("บล็อกแบบคงที่เตรียมใช้งาน"); } โมฆะสาธารณะหลัก (String args []) { ปรุงยา (42);
เมื่อโหลดคลาส UseStatic แล้ว คำสั่งคงที่ทั้งหมดจะถูกรัน ขั้นแรก a ถูกตั้งค่าเป็น 3 จากนั้นสแตติกบล็อกจะถูกดำเนินการ (พิมพ์ข้อความ) และสุดท้าย b ถูกเตรียมใช้งานเป็น a*4 หรือ 12 จากนั้นจึงเรียก main() ส่วน main() เรียก meth() โดยส่งค่า 42 ไปยัง x คำสั่ง println () สามคำสั่งอ้างถึงตัวแปรคงที่สองตัว a และ b และตัวแปรท้องถิ่น x
หมายเหตุ: การอ้างอิงตัวแปรอินสแตนซ์ใดๆ ในรูปแบบคงที่ถือเป็นสิ่งผิดกฎหมาย
นี่คือผลลัพธ์ของโปรแกรมนี้:
คัดลอกรหัสรหัสดังต่อไปนี้:
เริ่มต้นบล็อกแบบคงที่
x = 42
ก=3
ข = 12
วิธีการและตัวแปรแบบสแตติกสามารถนำไปใช้ได้อย่างอิสระจากอ็อบเจ็กต์ภายนอกคลาสที่ถูกกำหนดไว้ ด้วยวิธีนี้ คุณเพียงแค่เพิ่มตัวดำเนินการจุดหลังชื่อคลาส ตัวอย่างเช่น หากคุณต้องการเรียกใช้เมธอดแบบสแตติกจากภายนอกคลาส คุณสามารถใช้รูปแบบทั่วไปต่อไปนี้:
คัดลอกรหัสรหัสดังต่อไปนี้:
ชื่อคลาส.method()
ที่นี่ classname คือชื่อของคลาสที่กำหนดวิธีการแบบคงที่ อย่างที่คุณเห็น รูปแบบนี้คล้ายกับรูปแบบของการเรียกเมธอดที่ไม่คงที่ผ่านตัวแปรการอ้างอิงอ็อบเจ็กต์ ตัวแปรคงที่สามารถเข้าถึงได้ในรูปแบบเดียวกัน - ชื่อคลาสที่ตามด้วยตัวดำเนินการจุด นี่คือวิธีที่ Java ใช้เวอร์ชันควบคุมของฟังก์ชันโกลบอลและตัวแปรโกลบอล
ด้านล่างนี้เป็นตัวอย่าง ใน main() เมธอดคงที่ callme() และตัวแปรคงที่ b มีการเข้าถึงภายนอกคลาส
คลาส StaticDemo { คงที่ int a = 42; static int b = 99; static void main (args สตริง []) { StaticDemo.callme(); System.out.println("b = " + StaticDemo.b);
นี่คือผลลัพธ์ของโปรแกรมนี้:
คัดลอกรหัสรหัสดังต่อไปนี้:
ก=42
ข = 99
สมาชิกแบบคงที่ไม่สามารถเข้าถึงได้โดยอินสแตนซ์ที่สร้างโดยคลาสของพวกเขา
หากสมาชิกที่ไม่มีการแก้ไขแบบคงที่เป็นสมาชิกของอ็อบเจ็กต์ สมาชิกเหล่านั้นจะเป็นเจ้าของโดยแต่ละอ็อบเจ็กต์
สมาชิกที่ถูกแก้ไขด้วย static คือสมาชิกของคลาส ซึ่งหมายความว่าสามารถเรียกพวกมันได้โดยตรงจากคลาส และเป็นสิ่งที่เหมือนกันกับอ็อบเจ็กต์ทั้งหมด