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

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

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

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

วิธีคงที่คืออะไร

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

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

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

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

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

 100 การจัดการเม็กซิกัน 202 การจัดการอเมริกัน 309 การจัดการของอังกฤษ 

ความแตกต่างระหว่างชั้นเรียนและตัวอย่างของชั้นเรียนคืออะไร?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ที่นี่ในรหัสนี้คุณจะต้องแปลงทั้งสองวิธี printMenu () และ getUserChoice () เป็นวิธีคงที่

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

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

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

บทความที่น่าสนใจ