คำหลักคงที่เป็นคำหลักที่เพื่อนหลายคนพบเมื่อเขียนและอ่านรหัส นอกจากนี้ยังเป็นหนึ่งในคะแนนความรู้ที่ผู้สัมภาษณ์จาก บริษัท ยักษ์ใหญ่ต้องการถามในระหว่างการสัมภาษณ์ ก่อนอื่นมาพูดถึงการใช้คำหลักคงที่และความเข้าใจผิดทั่วไป ในที่สุดเราแสดงคำถามทดสอบทั่วไปเกี่ยวกับการสัมภาษณ์ที่เป็นลายลักษณ์อักษร นี่คือโครงร่างไดเรกทอรีของบทความนี้:
1. จุดประสงค์ของคำหลักคงที่
2. ความเข้าใจผิดของคำหลักคงที่
3. คำถามสัมภาษณ์เขียนทั่วไป
หากมีความไม่ถูกต้องฉันหวังว่าจะเข้าใจและยินดีต้อนรับการวิจารณ์และการแก้ไข
โปรดเคารพความสำเร็จของแรงงานของผู้เขียน โปรดระบุลิงค์ต้นฉบับเมื่อพิมพ์ซ้ำ:
http://www.cnblogs.com/dolphin0520/p/3799052.html
1. จุดประสงค์ของคำหลักคงที่
"วิธีการคงที่เป็นวิธีที่ไม่มีสิ่งนี้วิธีที่ไม่คงที่ไม่สามารถเรียกได้ภายในวิธีการคงที่ซึ่งเป็นไปได้และวิธีการคงที่สามารถเรียกได้ผ่านคลาสเองโดยไม่ต้องสร้างวัตถุใด ๆ นี่เป็นวัตถุประสงค์หลักของวิธีการคงที่"
แม้ว่าข้อความนี้จะแสดงเฉพาะคุณสมบัติพิเศษของวิธีการคงที่ แต่จะเห็นได้ว่าฟังก์ชั่นพื้นฐานของคำหลักคงที่ ในระยะสั้นมีการอธิบายไว้ในประโยคเดียว:
สะดวกในการโทร (วิธี/ตัวแปร) โดยไม่ต้องสร้างวัตถุ
เห็นได้ชัดว่าวิธีการหรือตัวแปรที่แก้ไขโดยคำหลักคงที่ไม่จำเป็นต้องพึ่งพาวัตถุสำหรับการเข้าถึง ตราบใดที่คลาสถูกโหลดพวกเขาสามารถเข้าถึงได้ผ่านชื่อคลาส
แบบคงที่สามารถใช้ในการปรับเปลี่ยนวิธีการสมาชิกในชั้นเรียนและตัวแปรสมาชิกในชั้นเรียน นอกจากนี้บล็อกรหัสสแตติกสามารถเขียนเพื่อปรับประสิทธิภาพของโปรแกรมให้เหมาะสม
1) วิธีการคงที่
วิธีการคงที่โดยทั่วไปเรียกว่าวิธีการคงที่ เนื่องจากวิธีการคงที่สามารถเข้าถึงได้โดยไม่ต้องพึ่งพาวัตถุใด ๆ จึงไม่มีวิธีนี้สำหรับวิธีการคงที่เพราะมันไม่ได้ขึ้นอยู่กับวัตถุใด ๆ เนื่องจากไม่มีวัตถุจึงไม่มีสิ่งเช่นนี้ และเนื่องจากคุณลักษณะนี้ตัวแปรสมาชิกที่ไม่คงที่และวิธีการสมาชิกที่ไม่คงที่ของคลาสไม่สามารถเข้าถึงได้ในวิธีการคงที่เนื่องจากวิธีการ/ตัวแปรสมาชิกที่ไม่คงที่จะต้องพึ่งพาวัตถุเฉพาะที่จะเรียก
แต่ควรสังเกตว่าแม้ว่าวิธีการสมาชิกที่ไม่คงที่และตัวแปรสมาชิกที่ไม่คงที่ไม่สามารถเข้าถึงได้ในวิธีการคงที่ แต่วิธีการสมาชิก/ตัวแปรแบบคงที่สามารถเข้าถึงได้ในวิธีการสมาชิกที่ไม่คงที่ ยกตัวอย่างง่ายๆ:
ในรหัสข้างต้นเนื่องจากเมธอด Print2 มีอยู่อย่างอิสระจากวัตถุจึงสามารถเรียกได้โดยตรงตามชื่อคลาส หากวิธีการ/ตัวแปรที่ไม่คงที่สามารถเข้าถึงได้ในวิธีการคงที่ถ้ามีคำสั่งต่อไปนี้ในวิธีหลัก:
myobject.print2 ();
ในเวลานี้ไม่มีวัตถุและ StR2 ไม่มีอยู่เลยดังนั้นจะมีความขัดแย้ง เช่นเดียวกับวิธีการ เนื่องจากคุณไม่สามารถคาดการณ์ได้ว่าตัวแปรสมาชิกที่ไม่คงที่นั้นเข้าถึงได้ในวิธี PRINT1 หรือไม่การเข้าถึงวิธีการสมาชิกที่ไม่คงที่ในวิธีการสมาชิกแบบคงที่
และสำหรับวิธีการสมาชิกที่ไม่คงที่เห็นได้ชัดว่าไม่ จำกัด ในการเข้าถึงวิธีการ/ตัวแปรสมาชิกแบบคงที่
ดังนั้นหากคุณต้องการเรียกวิธีการโดยไม่ต้องสร้างวัตถุคุณสามารถตั้งค่าวิธีนี้ให้เป็นแบบคงที่ วิธีการคงที่ที่พบบ่อยที่สุดของเราคือวิธีหลัก สำหรับสาเหตุที่วิธีหลักต้องคงที่จึงชัดเจนมากในตอนนี้ เนื่องจากโปรแกรมไม่ได้สร้างวัตถุใด ๆ เมื่อดำเนินการวิธีหลักจึงสามารถเข้าถึงได้ผ่านชื่อคลาสเท่านั้น
โปรดจำไว้ว่าแม้ว่ามันจะไม่แสดงเป็นแบบคงที่ตัวสร้างของคลาสนั้นเป็นวิธีการคงที่
2) ตัวแปรคง
ตัวแปรคงที่เรียกว่าตัวแปรคงที่ ความแตกต่างระหว่างตัวแปรคงที่และตัวแปรที่ไม่คงที่คือตัวแปรสแตติกถูกแชร์โดยวัตถุทั้งหมดโดยมีเพียงหนึ่งสำเนาในหน่วยความจำซึ่งจะเริ่มต้นหากและเมื่อคลาสถูกโหลดเป็นครั้งแรก ตัวแปรที่ไม่คงที่เป็นของวัตถุและเริ่มต้นเมื่อสร้างวัตถุ มีหลายสำเนาและสำเนาที่เป็นเจ้าของโดยวัตถุแต่ละชิ้นจะไม่ส่งผลกระทบต่อกันและกัน
ลำดับการเริ่มต้นของตัวแปรสมาชิกคงที่จะเริ่มต้นในลำดับที่กำหนด
3) บล็อกรหัสสแตติก
ฟังก์ชั่นสำคัญอีกประการหนึ่งของคำหลักคงที่คือการสร้างบล็อกรหัสแบบคงที่เพื่อเพิ่มประสิทธิภาพประสิทธิภาพของโปรแกรม บล็อกคงที่สามารถวางได้ทุกที่ในชั้นเรียนและสามารถมีบล็อกคงที่หลายบล็อกในชั้นเรียน เมื่อคลาสถูกโหลดครั้งแรกแต่ละบล็อกคงที่จะถูกดำเนินการตามลำดับของบล็อกสแตติกและจะถูกดำเนินการเพียงครั้งเดียว
เหตุผลที่บล็อกคงที่สามารถใช้เพื่อเพิ่มประสิทธิภาพประสิทธิภาพของโปรแกรมเป็นเพราะลักษณะของมัน: พวกเขาจะถูกดำเนินการเพียงครั้งเดียวเมื่อคลาสถูกโหลด นี่คือตัวอย่าง:
บุคคลชั้นเรียน {วันเกิดวันเกิดบุคคลสาธารณะ (วันเกิดวันที่) {this.birthdate = วันเกิด;} boolean isbornboomer () {วันที่เริ่มต้น = วันที่. valueof ("1946"); วันที่ enddate = วันที่ 0;}} Isbornboomer คุ้นเคยกับการที่บุคคลนี้เกิดในปี 1946-1964 หรือไม่ ทุกครั้งที่มีการเรียกว่าเด็กชาย หากเปลี่ยนเป็นสิ่งนี้จะดีกว่า:
บุคคลในชั้นเรียน {วันเกิดส่วนตัววันเกิดวันที่ startdate, enddate; คงที่ {startdate = date.valueof ("1946"); enddate = date.valueof ("1964");} บุคคลสาธารณะ && birthday.compareto (enddate) <0;}} ดังนั้นหลายครั้งการดำเนินการเริ่มต้นบางอย่างที่จำเป็นต้องดำเนินการเพียงครั้งเดียวจะถูกวางไว้ในบล็อกรหัสคงที่
2. ความเข้าใจผิดของคำหลักคงที่
1. คำหลักคงที่จะเปลี่ยนสิทธิ์การเข้าถึงของสมาชิกในชั้นเรียนหรือไม่?
ผู้เริ่มต้นบางคนจะสับสนใน Java ด้วยฟังก์ชั่นคำหลักคงที่ใน C/C ++ เพียงจำสิ่งหนึ่งที่นี่: ซึ่งแตกต่างจาก Static ใน C/C ++ คำหลักคงที่ใน Java จะไม่ส่งผลกระทบต่อขอบเขตของตัวแปรหรือวิธีการ ใน Java คำหลักเดียวที่สามารถส่งผลกระทบต่อการอนุญาตการเข้าถึงคือส่วนตัวสาธารณะและได้รับการคุ้มครอง (รวมถึงสิทธิ์การเข้าถึงแพ็คเกจ) ดูตัวอย่างต่อไปนี้เพื่อทำความเข้าใจ:
ข้อผิดพลาดพร้อมท์ "บุคคลไม่สามารถมองเห็นได้" ซึ่งหมายความว่าคำหลักคงที่ไม่เปลี่ยนการอนุญาตการเข้าถึงของตัวแปรและวิธีการ
2. สามารถเข้าถึงตัวแปรสมาชิกแบบคงที่ผ่านสิ่งนี้ได้หรือไม่?
แม้ว่าจะไม่มีวิธีการแบบคงที่ แต่สามารถเข้าถึงตัวแปรสมาชิกแบบคงที่ผ่านสิ่งนี้ในวิธีที่ไม่คงที่หรือไม่? ก่อนอื่นให้ดูตัวอย่างต่อไปนี้ ผลลัพธ์ของเอาต์พุตรหัสนี้คืออะไร?
คลาสสาธารณะหลัก {ค่าคงที่คงที่ = 33; โมฆะคงที่สาธารณะหลัก (String [] args) พ่นข้อยกเว้น {new main (). printValue ();} โมฆะส่วนตัว printValue () {ค่า int = 3; system.out.println (this.value);}}} 33
นี่คือทีมสังเกตการณ์หลักที่เข้าใจสิ่งนี้และคงที่ สิ่งนี้หมายถึงอะไร? สิ่งนี้แสดงถึงวัตถุปัจจุบัน หาก PrintValue ถูกเรียกผ่าน Main () ใหม่วัตถุปัจจุบันคือวัตถุที่สร้างโดย New Main () ตัวแปรสแตติกนั้นได้รับความนิยมจากวัตถุดังนั้นค่าของสิ่งนี้ค่าในการพิมพ์ค่าใช้จ่ายไม่ต้องสงสัยเลยว่า 33 ค่าภายในวิธีการพิมพ์เป็นตัวแปรท้องถิ่นและไม่สามารถเชื่อมโยงกับสิ่งนี้ได้เลยดังนั้นเอาต์พุตคือ 33 วิธีการคงที่ทั้งหมดและตัวแปรคงที่สามารถเข้าถึงได้ผ่านวัตถุ (ตราบใดที่การอนุญาตการเข้าถึงนั้นเพียงพอ)
3. สามารถทำหน้าที่คงที่กับตัวแปรท้องถิ่นได้หรือไม่?
ใน C/C ++ สแตติกสามารถกำหนดขอบเขตตัวแปรท้องถิ่นได้ แต่จำไว้ใน Java: ไม่อนุญาตให้ใช้ในการปรับเปลี่ยนตัวแปรท้องถิ่น อย่าถามว่าทำไมนี่คือบทบัญญัติของไวยากรณ์ Java
3. คำถามสัมภาษณ์เขียนทั่วไป
รายการต่อไปนี้แสดงคำถามเกี่ยวกับคำหลักคงที่ที่มักพบในการสัมภาษณ์เป็นลายลักษณ์อักษร พวกเขามีไว้สำหรับการอ้างอิงเท่านั้น หากคุณมีอาหารเสริมโปรดส่งข้อความด้านล่าง
1. ผลลัพธ์ผลลัพธ์ของรหัสต่อไปนี้คืออะไร?
การทดสอบระดับสาธารณะขยายฐาน {คงที่ {system.out.println ("ทดสอบคงที่");} การทดสอบสาธารณะ () {system.out.println ("ทดสอบ constructor");} โมฆะสาธารณะคง base () {system.out.println ("base constructor");}} ฐานคง
ทดสอบแบบคงที่
ตัวสร้างฐาน
ทดสอบตัวสร้าง
สำหรับสาเหตุที่ผลลัพธ์นี้คืออย่าพูดคุยกันก่อน ลองคิดเกี่ยวกับกระบวนการดำเนินการเฉพาะของรหัสนี้ ในตอนต้นของการดำเนินการก่อนอื่นเราต้องหาวิธีหลักเนื่องจากวิธีการหลักคือทางเข้าโปรแกรม แต่ก่อนที่จะดำเนินการวิธีหลักคลาสทดสอบจะต้องโหลดก่อน เมื่อโหลดคลาสทดสอบพบว่าคลาสทดสอบที่สืบทอดมาจากคลาสฐานดังนั้นมันจะหันไปโหลดคลาสฐานก่อน เมื่อโหลดคลาสฐานพบว่ามีบล็อกคงที่จากนั้นเรียกใช้งานบล็อกคงที่ หลังจากโหลดคลาสฐานแล้วคลาสทดสอบจะยังคงโหลดและจากนั้นพบว่ามีบล็อกคงที่ในคลาสทดสอบดังนั้นบล็อกคงที่จะถูกดำเนินการ หลังจากโหลดคลาสที่ต้องการวิธีหลักจะเริ่มดำเนินการ เมื่อดำเนินการทดสอบใหม่ () ในวิธีการหลักตัวสร้างของคลาสแม่จะถูกเรียกว่าก่อนจากนั้นตัวสร้างของตัวเอง ดังนั้นผลลัพธ์เอาต์พุตข้างต้นจึงปรากฏขึ้น
2. ผลลัพธ์ผลลัพธ์ของรหัสนี้คืออะไร?
การทดสอบระดับสาธารณะ {person person = บุคคลใหม่ ("test"); Static {system.out.println ("ทดสอบคงที่");} การทดสอบสาธารณะ () {system.out.println ("ทดสอบ constructor");} public Static Main (String [] args) บุคคล (String str) {system.out.println ("person"+str);}} คลาส myclass ขยายการทดสอบ {person person = บุคคลใหม่ ("myclass"); คงที่ {system.out.println ("myclass Static"); ทดสอบแบบคงที่ 1
ทดสอบแบบคงที่ 2
แม้ว่าจะไม่มีข้อความในวิธีการหลัก แต่ก็ยังคงส่งออกเนื่องจากเหตุผลได้รับการอธิบายข้างต้น นอกจากนี้บล็อกแบบคงที่สามารถปรากฏขึ้นได้ทุกที่ในชั้นเรียน (ตราบใดที่มันไม่ได้อยู่ในวิธีการจำไว้ว่าไม่มีวิธีใดสามารถทำได้) และการดำเนินการจะถูกดำเนินการตามลำดับของบล็อกคงที่
ข้างต้นเป็นการวิเคราะห์ที่ครอบคลุมของคำหลักคงที่ใน Java ที่แนะนำโดยบรรณาธิการ ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!