1: สิ่งที่ผ่านไปตามมูลค่า
หมายความว่าเมื่อมีการเรียกวิธีการพารามิเตอร์ที่ผ่านจะถูกส่งผ่านโดยสำเนาของค่า ตัวอย่างมีดังนี้:
คลาสสาธารณะ temptest {private void test1 (int a) {// do something} โมฆะคงที่สาธารณะหลัก (สตริง [] args) {temptest t = new Temptest (); int a = 3; t.test1 (a); // พารามิเตอร์ที่ผ่านที่นี่คือการผ่านค่า}}}ลักษณะสำคัญของการส่งผ่านตามมูลค่า: สิ่งที่ผ่านไปคือสำเนาของค่าซึ่งหมายความว่ามันไม่เกี่ยวข้องกันหลังจากผ่านไป
ตัวอย่างมีดังนี้:
คลาสสาธารณะ temptest {โมฆะส่วนตัว test1 (int a) {a = 5; System.out.println ("วิธีการทดสอบ 1 A ="+A); } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {temptest t = new Temptest (); int a = 3; t.test1 (a); // หลังจากผ่านไปการเปลี่ยนแปลงของค่าตัวแปรของวิธี test1 ไม่ส่งผลกระทบต่อ A System.out.println ("วิธีหลัก A ="+A); -ผลลัพธ์ของการดำเนินการคือ:
A = 5 ในวิธีการทดสอบ 1 วิธี A = 3 ในวิธีการหลัก
2: สิ่งที่ผ่านโดยการอ้างอิง
มันหมายถึงพารามิเตอร์ที่ผ่านเมื่อวิธีการเรียกและพารามิเตอร์ที่ผ่านจะถูกส่งผ่านโดยการอ้างอิง ในความเป็นจริงที่อยู่อ้างอิงที่ผ่านเป็นที่อยู่ของพื้นที่หน่วยความจำที่สอดคล้องกับตัวแปร
ตัวอย่างมีดังนี้:
คลาสสาธารณะ temptest {โมฆะส่วนตัว test1 (a) {} โมฆะคงที่สาธารณะหลัก (สตริง [] args) {temptest t = new Temptest (); a = ใหม่ a (); T.Test1 (a); // พารามิเตอร์ A ที่ผ่านมาที่นี่คือการผ่านการอ้างอิง}} คลาส A {Public Int อายุ = 0; -3: ลักษณะสำคัญของการผ่านโดยอ้างอิง
สิ่งที่ผ่านไปคือการอ้างอิงถึงค่าซึ่งหมายความว่าทั้งก่อนและหลังผ่านจุดผ่านไปยังการอ้างอิงเดียวกัน (นั่นคือพื้นที่หน่วยความจำเดียวกัน)
ตัวอย่างมีดังนี้:
คลาสสาธารณะ temptest {โมฆะส่วนตัว test1 (a) {a.age = 20; Age = "+A.age ใน System.out.println (" test1 method = "+a.age);} โมฆะคงที่สาธารณะหลัก (สตริง [] args) {temptest t = ใหม่ temptest (); a = ใหม่ a (); a.age = 10; t.test1 (a); อายุ =" }} คลาส A {Public Int อายุ = 0; -ผลการดำเนินการมีดังนี้:
อายุ = 20 ในวิธีการทดสอบ 1, อายุ = 20 ในวิธีหลัก
4: ทำความเข้าใจกับกระบวนการผ่านโดยอ้างอิง - ไดอะแกรมการจัดสรรหน่วยความจำ
ในการทำความเข้าใจกระบวนการผ่านการอ้างอิงอย่างถูกต้องคุณต้องเรียนรู้ที่จะเข้าใจกระบวนการจัดสรรหน่วยความจำและแผนภาพการจัดสรรหน่วยความจำสามารถช่วยให้เราเข้าใจกระบวนการนี้
ใช้ตัวอย่างด้านบนเพื่อวิเคราะห์:
(1): เริ่มทำงานเรียกใช้บรรทัดที่ 8 สร้างอินสแตนซ์ของ A และแผนภาพการจัดสรรหน่วยความจำมีดังนี้:
(2): เรียกใช้บรรทัด 9, แก้ไขค่าของอายุในอินสแตนซ์ A. แผนภาพการจัดสรรหน่วยความจำหลังจากการทำงานมีดังนี้:
(3): เรียกใช้บรรทัดที่ 10 ซึ่งคือการผ่านที่อยู่พื้นที่หน่วยความจำที่อ้างอิงโดยตัวแปร A ในวิธีหลักไปยังตัวแปร A ในวิธีการทดสอบ 1 ตามการอ้างอิง โปรดทราบ: ตัวแปรทั้งสองนี้แตกต่างอย่างสิ้นเชิงอย่าหลงกลด้วยชื่อเดียวกัน
การจัดสรรหน่วยความจำมีดังนี้:
เนื่องจากมันถูกส่งผ่านโดยการอ้างอิงนั่นคือที่อยู่ของพื้นที่หน่วยความจำจะถูกส่งผ่านแผนภาพหน่วยความจำใหม่ที่เกิดขึ้นหลังจากการถ่ายโอนเสร็จสมบูรณ์มีดังนี้:
กล่าวอีกนัยหนึ่ง: ตัวแปรทั้งสองชี้ไปที่พื้นที่เดียวกัน
(4): เรียกใช้บรรทัดที่ 3 และกำหนดค่าให้กับอายุของอินสแตนซ์ที่ชี้ไปที่ตัวแปร A ในวิธีการทดสอบ 1 แผนภาพหน่วยความจำใหม่ที่เกิดขึ้นหลังจากเสร็จสิ้นมีดังนี้:
ในเวลานี้การเปลี่ยนแปลงค่าอายุของอินสแตนซ์ A เกิดจากวิธีการทดสอบ 1
(5): เรียกใช้บรรทัด 4 และตามแผนภาพหน่วยความจำในเวลานี้อายุเอาท์พุท = 20 ในวิธีการทดสอบ 1
(6): เรียกใช้บรรทัดที่ 11 และตามแผนภาพหน่วยความจำในเวลานี้อายุเอาท์พุท = 20 ในวิธีหลัก
5: การเปลี่ยนแปลงตัวอย่างข้างต้น
หลังจากทำความเข้าใจตัวอย่างข้างต้นบางคนอาจถามค่าที่ส่งผ่านโดยการอ้างอิงจะไม่ส่งผลกระทบต่อกันและกันหรือไม่? การปรับเปลี่ยนในวิธีการทดสอบ 1 ที่ไม่ส่งผลกระทบต่อวิธีการหลักคืออะไร?
วิธีการเพียงแค่ใช้อินสแตนซ์ใหม่ในวิธีการทดสอบ 1 เปลี่ยนเป็นตัวอย่างต่อไปนี้ซึ่งมีการเพิ่มพฤติกรรมที่สามใหม่:
คลาสสาธารณะ temptest {private void test1 (a) {a = new a (); // บรรทัดใหม่ a.age = 20; System.out.println ("Test1 Method Age ="+A.age); } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {temptest t = new Temptest (); a = ใหม่ a (); A.AGE = 10; T.Test1 (a); System.out.println ("วิธีหลักอายุ ="+a.age); }} คลาส A {Public Int อายุ = 0; -ผลการทำงานคือ:
อายุ = 20 ใน test1 วิธีการอายุ = 10 ในวิธีหลัก
เหตุใดผลลัพธ์ของการรันนี้จึงแตกต่างจากตัวอย่างก่อนหน้านี้? จะดีกว่าที่จะใช้ไดอะแกรมหน่วยความจำเพื่อทำความเข้าใจ
6: เข้าใจโดยอ้างอิงอีกครั้ง
(1): เริ่มทำงานเรียกใช้บรรทัด 9 สร้างอินสแตนซ์ของ A และแผนภาพการจัดสรรหน่วยความจำมีดังนี้:
(2): Run Line 10 คือการปรับเปลี่ยนค่าของอายุในอินสแตนซ์ A. แผนภาพการจัดสรรหน่วยความจำหลังจากการทำงานมีดังนี้:
(3): Running Line 11 คือการผ่านที่อยู่พื้นที่หน่วยความจำที่อ้างอิงโดยตัวแปร A ในวิธีหลักไปยังตัวแปร A ในวิธีการทดสอบ 1 ตามการอ้างอิง โปรดทราบ: ตัวแปรทั้งสองนี้แตกต่างอย่างสิ้นเชิงอย่าหลงกลด้วยชื่อเดียวกัน
การจัดสรรหน่วยความจำมีดังนี้:
เนื่องจากมันถูกส่งผ่านโดยการอ้างอิงนั่นคือที่อยู่ของพื้นที่หน่วยความจำจะถูกส่งผ่านแผนภาพหน่วยความจำใหม่ที่เกิดขึ้นหลังจากการถ่ายโอนเสร็จสมบูรณ์มีดังนี้:
กล่าวอีกนัยหนึ่ง: ตัวแปรทั้งสองชี้ไปที่พื้นที่เดียวกัน
(4): เรียกใช้บรรทัดที่ 3 และสร้างอินสแตนซ์ใหม่ของ A สำหรับตัวแปร A ในวิธีการทดสอบ 1 แผนภาพหน่วยความจำใหม่ที่เกิดขึ้นหลังจากเสร็จสิ้นมีดังนี้:
(5): เรียกใช้บรรทัด 4 เพื่อกำหนดค่าให้กับอายุของอินสแตนซ์ใหม่ที่ชี้ไปที่ตัวแปร A ในวิธีการทดสอบ 1 แผนภาพหน่วยความจำใหม่ที่เกิดขึ้นหลังจากเสร็จสิ้นมีดังนี้:
หมายเหตุ: ในเวลานี้อายุของตัวแปร A ในวิธีการทดสอบ 1 จะเปลี่ยนไปในขณะที่วิธีหลักไม่เปลี่ยนแปลง
(6): เรียกใช้บรรทัด 5 และตามแผนภาพหน่วยความจำในเวลานี้อายุเอาท์พุท = 20 ในวิธีการทดสอบ 1
(7): เรียกใช้บรรทัดที่ 12 และตามแผนภาพหน่วยความจำในเวลานี้อายุเอาท์พุท = 10 ในวิธีหลักตามแผนภาพหน่วยความจำเอาท์พุท = 10
7: คำอธิบาย
(1): "ใน Java การส่งพารามิเตอร์จะถูกส่งผ่านด้วยค่า" หมายถึง: การส่งผ่านโดยค่าเป็นสำเนาของค่าที่ผ่าน ผ่านการอ้างอิงผ่านจริงผ่านค่าที่อยู่อ้างอิงดังนั้นจึงเรียกว่าการส่งผ่านตามมูลค่า
(2): ใน Java เฉพาะประเภทพื้นฐานและสตริงตามวิธีการนิยามต่อไปนี้จะถูกส่งผ่านตามมูลค่าและอื่น ๆ จะถูกส่งผ่านโดยการอ้างอิง มันคือการกำหนดสตริงโดยตรงโดยใช้คำพูดสองครั้ง: String str = "โรงเรียนเอกชน Java";
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น