บทบาทของการใช้ขั้นสุดท้ายเพื่อแก้ไขพารามิเตอร์ใน Java
การเพิ่มคำหลักสุดท้ายก่อนที่พารามิเตอร์เมธอดคือการป้องกันไม่ให้ข้อมูลถูกแก้ไขในน้ำหนักวิธีการ
มีสองสถานการณ์หลัก: ก่อนอื่นใช้ขั้นสุดท้ายเพื่อแก้ไขประเภทข้อมูลพื้นฐาน ประการที่สองใช้สุดท้ายเพื่อแก้ไขประเภทข้อมูลอ้างอิง
ในกรณีแรกให้แก้ไขประเภทข้อมูลพื้นฐานซึ่งเวลาของพารามิเตอร์ไม่สามารถแก้ไขได้ในตัววิธีการนั่นคือไม่สามารถกำหนดใหม่ได้ มิฉะนั้นการรวบรวมจะไม่ถูกส่งผ่าน
กรณีที่สองคือการแก้ไขประเภทการอ้างอิง ในเวลานี้วัตถุที่อ้างอิงโดยตัวแปรพารามิเตอร์ไม่สามารถเปลี่ยนแปลงได้ อย่างไรก็ตามสำหรับชนิดข้อมูลอ้างอิงมันก็โอเคอย่างสมบูรณ์แบบที่จะปรับเปลี่ยนคุณสมบัติของพวกเขา
ดังนั้นหากคุณต้องการใช้คำหลักสุดท้ายให้ใช้ประเภทข้อมูลพื้นฐานซึ่งมีประโยชน์มาก
ตัวแปรสุดท้าย:
ใช้ขั้นสุดท้ายสำหรับประเภทพื้นฐาน: เป็นค่าคงที่ค่าคงที่และค่ายังคงไม่เปลี่ยนแปลง
ใช้ขั้นสุดท้ายสำหรับการอ้างอิงวัตถุ: สร้างค่าคงที่การอ้างอิงและเมื่อการอ้างอิงเริ่มต้นเพื่อชี้ไปที่วัตถุมันจะไม่สามารถเปลี่ยนเป็นชี้ไปที่วัตถุอื่นได้ อย่างไรก็ตามวัตถุนั้นสามารถแก้ไขได้และ Java ไม่ได้ให้วิธีการสร้างค่าคงที่ของวัตถุใด ๆ ข้อ จำกัด นี้ยังใช้อาร์เรย์ซึ่งเป็นวัตถุ
ตัวอย่าง:
ค่าคลาส {int i; ค่าสาธารณะ (int i) {this.i = i; }} คลาสสาธารณะ FinalData {สุ่มแบบคงที่ส่วนตัว = สุ่มใหม่ (47); รหัสสตริงส่วนตัว; Public FinalData (String ID) {this.id = id; } ค่า int สุดท้ายส่วนตัว = 9; ค่าคงที่ int สุดท้ายของส่วนตัว Value_two = 99; สาธารณะคงที่สาธารณะสุดท้ายค่า _three = 39; INT สุดท้ายส่วนตัว I4 = สุ่ม NEXTINT (20); int int int_5 สุดท้ายคงที่ NEXTINT (20); ค่าส่วนตัว v1 = ค่าใหม่ (11); ค่าสุดท้ายส่วนตัว v2 = ค่าใหม่ (22); ค่าคงที่ส่วนตัวสุดท้าย val_3 = ค่าใหม่ (33); INT สุดท้ายส่วนตัว [] a = {1, 2, 3, 4, 5, 6}; สตริงสาธารณะ toString () {return id + ":" + "i4 =" + i4 + ", int_5 =" + int_5; } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {finalData fd1 = ใหม่ finalData ("fd1"); - fd1.valueone ++; // เนื่องจาก valueOne เป็นค่าคงที่ประเภทพื้นฐานค่าของมันคือค่าคงที่ fd1.v2.i ++; // เนื้อหาของวัตถุที่แก้ไขโดยสุดท้ายสามารถเปลี่ยน fd1.v1 = ค่าใหม่ (9); สำหรับ (int i = 0; i <fd1.a.length; i ++) fd1.a [i] ++; - fd1.v2 = ค่าใหม่ (0); // เนื่องจาก V2 เป็นประเภทอ้างอิงที่แก้ไขโดยสุดท้ายการอ้างอิงจึงไม่สามารถแก้ไขได้เพื่อชี้ไปที่วัตถุอื่น //! fd1.val_3 = ค่าใหม่ (1); // มันใช้พื้นที่หน่วยความจำที่ไม่สามารถเปลี่ยนแปลงได้ //! fd1.a = ใหม่ int [3]; // สุดท้ายที่แก้ไขอาร์เรย์ System.out.println (FD1); System.out.println ("การสร้าง FinalData ใหม่"); FinalData FD2 = New FinalData ("FD2"); System.out.println (FD1); System.out.println (FD2); }}/*เอาท์พุท: fd1: i4 = 15, int_5 = 18creating ใหม่ finalDatafd1: i4 = 15, int_5 = 18fd2: i4 = 13, int_5 = 18*/วิเคราะห์:
สำหรับ FD1, FD2 สองวัตถุ, i4 นั้นไม่เหมือนใครนั่นคือแต่ละวัตถุมี I4 แต่ int_5 ถูกประกาศแบบคงที่นั่นคือมันถูกแชร์โดยคลาส FD1 และ FD2 แบ่งปัน INT_5 ซึ่งเริ่มต้นในช่วงเวลาของการโหลดแทนที่จะเริ่มต้นทุกครั้ง แต่มันถูกตั้งค่าเป็นขั้นสุดท้ายในเวลาเดียวกันดังนั้นการอ้างอิงจึงไม่สามารถเปลี่ยนแปลงได้นั่นคือมันไม่สามารถแก้ไขได้เพื่อชี้ไปที่วัตถุอื่น
ว่างเปล่าสุดท้าย:
ถูกประกาศว่าเป็นครั้งสุดท้าย แต่ไม่มีค่าเริ่มต้นที่กำหนด ขั้นสุดท้ายจะต้องได้รับมอบหมายโดยใช้นิพจน์ในคำจำกัดความของโดเมนหรือในแต่ละตัวสร้างซึ่งเป็นสาเหตุที่โดเมนสุดท้ายจะเริ่มต้นก่อนการใช้งานเสมอ
พารามิเตอร์สุดท้าย:
ซึ่งหมายความว่าคุณไม่สามารถเปลี่ยนการอ้างอิงพารามิเตอร์ในวิธีการชี้ไปที่พารามิเตอร์อื่นได้ แต่คุณสามารถแก้ไขสิ่งที่วัตถุสุดท้ายชี้ไปที่
ตัวอย่าง:
คลาส gizmo {int i = 0; โมฆะสาธารณะสปิน () {}} ระดับสาธารณะ FinalArguments {โมฆะด้วย (สุดท้าย gizmo g) {//! g = ใหม่ gizmo (); // การอ้างอิงที่แก้ไขโดยสุดท้ายไม่ได้ถูกแก้ไขเพื่อชี้ไปที่วัตถุอื่น G.I ++; // แต่เนื้อหาชี้ไปที่วัตถุสุดท้ายสามารถแก้ไขได้} โมฆะโดยไม่ต้อง (gizmo g) {g = new gizmo (); G.Spin (); } // int g (สุดท้าย int i) {// //! i ++; // เพราะพารามิเตอร์ฉันเป็นค่าคงที่ //} int g (int สุดท้าย i) {return i + 1; } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {finalarguments bf = ใหม่ finalarguments (); bf.with (null); bf.with (null); -วิเคราะห์:
พารามิเตอร์ถูกประกาศว่าเป็นที่สุด หากเป็นพารามิเตอร์พื้นฐานมันเป็นค่าคงที่และไม่สามารถแก้ไขได้ หากเป็นตัวแปรอ้างอิงก็ไม่สามารถแก้ไขได้เพื่อชี้ไปที่วัตถุอื่น แต่เนื้อหาของวัตถุที่อ้างถึงโดยการอ้างอิงสามารถแก้ไขได้
วิธีการ fianl:
เหตุผลในการใช้งาน:
วิธีการส่วนตัวทั้งหมดในชั้นเรียนได้รับการระบุโดยปริยายว่าเป็นขั้นสุดท้ายและเนื่องจากวิธีการส่วนตัวไม่สามารถใช้งานได้จึงไม่สามารถเขียนทับได้ ตัวดัดแปลงสุดท้ายสามารถเพิ่มลงในวิธีส่วนตัวได้ แต่สิ่งนี้ไม่ได้ให้ความหมายเพิ่มเติมใด ๆ กับวิธีการ
ตัวอย่าง:
ชั้นเรียน withfinals {private final void f () {system.out.println ("withfinals.f ()"); } โมฆะส่วนตัว g () {system.out.println ("overridingPrivate.f ()"); }} คลาส OverridingPrivate ขยายด้วย Finals {void สุดท้าย private f () {system.out.println ("overridingPrivate.f ()"); }} คลาส OverridingPrivate2 ขยาย OverridingPrivate { /** เมื่อใช้คำอธิบายประกอบการแทนที่เพื่อบังคับวิธี F () เพื่อเขียนทับวิธี F () ของคลาสแม่จะมีการรายงานข้อผิดพลาด* เพราะไม่ทราบว่าคลาสแม่มีวิธีการหรือไม่ สำหรับวิธี g () มันเพิ่งสร้างวิธีการใหม่และ * ไม่ได้เขียนทับวิธี g () ในคลาสพาเรนต์ *///@Override Public Final Void f () {System.out.println ("OverridingPrivate2.f ()"); } โมฆะสาธารณะ g () {system.out.println ("overridingPrivate2.g ()"); }} คลาสสาธารณะ FinalOverRidingillusion {โมฆะคงที่สาธารณะหลัก (String [] args) {overridingPrivate2 op2 = new OverridingPrivate2 (); op2.f (); op2.g (); // คุณสามารถแปลง OverridingPrivate OP = OP2; - op.f (); // วิธีสุดท้ายในคลาสหลักจะมองไม่เห็น subclass //! op.g (); withfinals wf = op2; // wf.f (); // wf.g (); }}/*เอาต์พุต: overridingPrivate2.f () overridingPrivate2.g ()*/วิเคราะห์:
ความครอบคลุมเกิดขึ้นเมื่อใด:
1. วิธีการที่ปรากฏในคลาสย่อยที่เหมือนกับคลาสแม่
2. คลาสย่อยสามารถแปลงเป็นคลาสแม่ขึ้นไปด้านบนและเรียกวิธีการในคลาสพาเรนต์
หากวิธีการในคลาสหลักถูกประกาศว่าเป็นขั้นสุดท้ายหรือส่วนตัววิธีนี้จะมองไม่เห็นคลาสย่อย แม้ว่าวิธีการที่เหมือนกับคลาสแม่จะถูกสร้างขึ้นในคลาสย่อยนี่เป็นวิธีใหม่แทนที่จะเป็นวิธีที่ถูกแทนที่จากคลาสพาเรนต์
ชั้นสุดท้าย:
นั่นคือคลาสนี้ไม่สามารถสืบทอดได้ไม่ว่าจะเป็นคุณหรือคนอื่น ๆ นั่นคือคลาสนี้ไม่จำเป็นต้องมีการเปลี่ยนแปลงใด ๆ และไม่ต้องการคลาสย่อยใด ๆ เช่นคลาสสตริง
ตัวอย่าง:
คลาส Smallbrain {} ไดโนเสาร์คลาสสุดท้าย {int i = 7; int j = 1; smallbrain x = ใหม่ smallbrain (); เป็นโมฆะ f () {}} // ข้อผิดพลาด: ประเภทเพิ่มเติมไม่สามารถย่อยคลาสไดโนเสาร์คลาสสุดท้าย // ไดโนเสาร์ไม่สามารถมีคลาสย่อย // คลาสเพิ่มเติมขยายไดโนเสาร์ {} คลาสสาธารณะจูราสสิค nf (); Ni = 40; N.J ++; -สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com