แก้ไข: ไม่สามารถอ้างอิงวิธีการที่ไม่คงที่จากบริบทแบบคงที่

โปรแกรมเมอร์หลายคนต้องเผชิญกับข้อความแสดงข้อผิดพลาด 'วิธีที่ไม่ใช่แบบคงที่ไม่สามารถอ้างอิงได้จากบริบทแบบคงที่’ เมื่อพวกเขากำลังเข้ารหัส ข้อความแสดงข้อผิดพลาดนี้ไม่เฉพาะเจาะจงและสามารถเกิดขึ้นใน IDE ใด ๆ หากเงื่อนไขสำหรับข้อผิดพลาดเป็นจริง

นี่เป็นข้อผิดพลาดที่พบบ่อยมากสำหรับผู้เริ่มต้นที่โปรแกรมเมอร์พยายามใช้คลาส "คงที่" โดยไม่ต้องสร้างอินสแตนซ์ของคลาส มีเงื่อนไขหลายประการที่ต้องปฏิบัติตามเมื่อคุณใช้คลาสที่เป็นแบบคงที่ ในบทความนี้ เราจะพูดถึงกรณีต่างๆ มากมายและแนะนำวิธีใช้คลาสสแตติก

วิธีการแบบคงที่คืออะไร?

การเพิ่มคำหลัก 'คงที่' ให้กับวิธีการใด ๆ ทำให้วิธีการนั้นเรียกว่าวิธีการแบบคงที่ วิธีสแตติกเป็นของคลาสแทนที่จะเป็นของอ็อบเจ็กต์ (ซึ่งเป็นบรรทัดฐาน) วิธีการคงที่สามารถเรียกใช้ได้อย่างง่ายดายโดยไม่มีเงื่อนไขในการสร้างอินสแตนซ์ของคลาส

มีการใช้เมธอด Static ที่แตกต่างกันหลายวิธี ตัวอย่างเช่น คุณสามารถเปลี่ยนสมาชิกข้อมูลสแตติกและค่าของมันได้ อย่างไรก็ตาม ยังมีข้อจำกัดบางประการเมื่อใช้วิธีคงที่ ตัวอย่างเช่น หากคุณต้องการเข้าถึงฟิลด์ที่ไม่คงที่ของคลาสของคุณ คุณต้องใช้เมธอดที่ไม่คงที่ สรุปได้ว่า Static method ถูกใช้อย่างไม่มีประโยชน์ แต่ก็มีประโยชน์

ต่อไปนี้คือตัวอย่างสั้นๆ เกี่ยวกับวิธีการสร้างเมธอดแบบคงที่เพื่อเปลี่ยนคุณสมบัติของอ็อบเจ็กต์ทั้งหมด

นักเรียนชั้น{ int roll_no; ชื่อสตริง; วิทยาลัยสตริงแบบคงที่ = "InformationTech"; การเปลี่ยนแปลงโมฆะคงที่ (){ วิทยาลัย = “การจัดการ"; } นักเรียน (หมายเลข int, ชื่อสตริง) { roll_no = หมายเลข; ชื่อ = name_self; } แสดงเป็นโมฆะ () {System.out.println (rollno+" "+name+" "+ วิทยาลัย);} public static void main(String args[]){ Students.change(); Students stu_1 = new Students (100,"Mexican"); Students stu_2 = new Students (202,"American"); Students stu_3 = นักเรียนใหม่ (309,"อังกฤษ"); stu_1.display(); stu_2.display(); stu_3.display(); } }

ผลลัพธ์ของโปรแกรมจะเป็น:

100 Mexican Management 202 American Management 309 British Management

อะไรคือความแตกต่างระหว่างคลาสและอินสแตนซ์ของคลาส?

คิดว่าคุณกำลังเดินอยู่บนถนนและเห็นรถ ตอนนี้คุณรู้ทันทีว่านี่คือรถ แม้ว่าคุณจะไม่รู้ว่ามันคืออะไรรุ่นหรือประเภทไหน นี่เป็นเพราะคุณรู้ว่าสิ่งนี้เป็นของคลาส "รถยนต์" ที่คุณรู้จักอยู่แล้ว คิดว่าชั้นเรียนที่นี่เป็นเทมเพลตหรือแนวคิด

เมื่อคุณเข้าใกล้มากขึ้น คุณจะเห็นรุ่นและยี่ห้อของรถ ที่นี่คุณรู้จัก 'ตัวอย่าง' ของคลาส 'รถยนต์' คุณสมบัติทั้งหมดจะแสดงรายละเอียดที่นี่ ล้อ,แรงม้า,ขอบล้อ ฯลฯ

ตัวอย่างของคุณสมบัติได้แก่ คลาส 'car' ระบุว่ารถทุกคันควรมีล้อ รถที่คุณเห็น (ตัวอย่างในรถระดับเดียวกัน) มีขอบล้ออัลลอย

ในการเขียนโปรแกรมเชิงวัตถุคุณกำหนดคลาสด้วยตัวเองและภายในคลาสคุณกำหนดฟิลด์ประเภท "สี" เมื่อใดก็ตามที่คลาสสร้างอินสแตนซ์ หน่วยความจำจะถูกสงวนไว้โดยอัตโนมัติสำหรับสีที่แบ็กเอนด์และในภายหลัง คุณสามารถกำหนดค่านี้โดยเฉพาะ (เช่น สีแดง) เนื่องจากแอตทริบิวต์เช่นนี้มีความเฉพาะเจาะจง จึงไม่คงที่

ในทางตรงกันข้าม เมธอดและฟิลด์สแตติกจะถูกแชร์กับอินสแตนซ์ทั้งหมด สิ่งเหล่านี้สร้างขึ้นสำหรับค่าหรือไอเท็มเฉพาะสำหรับคลาสและไม่ใช่ตัวอินสแตนซ์เอง สำหรับเมธอด อาจมีเมธอดสากล (เช่น ตัวแปลง stringtoInt) และสำหรับฟิลด์ มักจะเป็นค่าคงที่ตามรหัสของคุณ (เช่น ประเภทของรถอาจเป็นแบบคงที่หากคุณผลิตเฉพาะรถยนต์ทั่วไปเท่านั้น)

ตอนนี้ เราจะดูกรณีต่างๆ ทั้งหมดที่การเข้ารหัสของคุณอาจผิดพลาด และดูวิธีแก้ไขปัญหาชั่วคราวเพื่อแก้ไข

ปัญหาที่ 1: คุณกำลังเรียกสิ่งที่ไม่มีอยู่

เราพบบางกรณีที่ผู้ใช้ใช้วิธีการทั้งแบบคงที่และแบบไม่คงที่ร่วมกัน เมื่อเราทำเช่นนี้ คุณควรระวังว่าวิธีการใดที่เรียกว่าอะไร (ในแง่ของสแตติกหรือไม่) ดูรหัสต่อไปนี้:

java.util.List . ส่วนตัว someMethod(){ /* โค้ดบางส่วน */ คืนค่า someList; } public void main(String[] strArgs){ // คำสั่งต่อไปนี้ทำให้เกิดข้อผิดพลาด คุณรู้ว่าทำไม.. java.util.List someList = someMethod(); }

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

สรุปแล้ว คุณไม่สามารถเรียกสิ่งที่ไม่มีได้ เนื่องจากคุณอาจยังไม่ได้สร้างอ็อบเจ็กต์ ดังนั้นเมธอดที่ไม่คงที่จึงยังไม่มีอยู่ อย่างไรก็ตาม ในทางกลับกัน วิธีการแบบคงที่จะมีอยู่เสมอ (เนื่องจากคำจำกัดความ)

ปัญหา 2: วิธีการไม่ได้ทำให้คงที่ made

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

BookStoreApp2 คลาสสาธารณะ {// ค่าคงที่สำหรับตัวเลือก อินพุตสแกนเนอร์ = สแกนเนอร์ใหม่ (System.in); โมฆะคงที่สาธารณะหลัก (สตริง [] args) { BookStoreItem [] รายการ; // ประกาศรายการอาร์เรย์ = ใหม่ BookStoreItem [10]; // กำลังเริ่มต้นอาร์เรย์ int itemType = -1; printMenu(); getUserChoice(); for (int i = 0; i < item.length; i++){ }//end of switch statement }// end of for loop for (int i = 0; i < item.length; i++) { }//end ของ }// สิ้นสุดเมธอดหลัก main

ในโค้ดนี้ คุณต้องแปลงทั้งสองวิธี พิมพ์เมนู() และ getUserChoice () เป็นวิธีการคงที่

ดังนั้น หากคุณต้องการหลีกเลี่ยงสถานการณ์เช่นนี้ คุณสามารถใช้ a ตัวสร้าง แทน. ตัวอย่างเช่น คุณสามารถนำเนื้อหาของเมธอด main() มาวางไว้ในคอนสตรัคเตอร์

bookStoreApp2() สาธารณะ { // ใส่เนื้อหาของวิธีการหลักที่นี่} หลังจากทำสิ่งนี้ ให้ทำสิ่งต่อไปนี้ภายในวิธีการหลักของคุณ: public void main( String[] args ) { new BookStoreApp2(); }

หากคำแนะนำเหล่านี้ใช้ไม่ได้กับโค้ดของคุณหรือแตกต่างออกไป คุณควรคำนึงถึงหลักการพื้นฐานของคลาส Static และเมธอด และตรวจสอบโค้ดของคุณอีกครั้งเพื่อให้แน่ใจว่าหลักการพื้นฐานไม่ได้ถูกละเมิด

Facebook Twitter Google Plus Pinterest