วิธีการโทรโดยเป็นคำศัพท์วิทยาศาสตร์คอมพิวเตอร์มาตรฐาน การเรียกใช้วิธีการแบ่งออกเป็นค่าโทร (โทรโดยอ้างอิง) และการโทรอ้างอิง (โทรตามค่า) ตามสถานการณ์ที่ผ่านพารามิเตอร์ มีคำจำกัดความมากมายของการโทรสองประเภทนี้ในโลก คำพูดที่พบบ่อยที่สุดคือค่าคือการเรียกค่าและที่อยู่คือการโทรอ้างอิง นี่เป็นสิ่งที่ไม่เหมาะสมมาก ข้อความเหล่านี้สามารถเตือนเราได้อย่างง่ายดายว่าพารามิเตอร์วัตถุของ Java ผ่านการโทรอ้างอิง ในความเป็นจริงพารามิเตอร์วัตถุของ Java ยังคงเป็นค่าโทร
ก่อนอื่นให้ใช้รหัสชิ้นหนึ่งเพื่อยืนยันว่าทำไมพารามิเตอร์วัตถุ Java คือการเรียกค่า
พนักงานชั้นเรียนสาธารณะ {ชื่อสตริงสาธารณะ = null; พนักงานสาธารณะ (สตริง n) {this.name = n; } // สลับวัตถุพนักงานสองคนการแลกเปลี่ยนแบบคงที่สาธารณะ (พนักงาน E1, พนักงาน E2) {พนักงานอุณหภูมิ = E1; e1 = e2; E2 = อุณหภูมิ; System.out.println (e1.name+""+e2.name); // ผลการพิมพ์: Li Si Zhang San} // ฟังก์ชั่นหลักโมฆะสาธารณะคงที่หลัก (สตริง [] args) {พนักงานพนักงาน = พนักงานใหม่ ("จางซาน"); ผู้จัดการพนักงาน = พนักงานใหม่ ("Li Si"); swap (คนงานผู้จัดการ); System.out.println (worker.name+""+manager.name); // ผลการพิมพ์ยังคง: จางซานหลี่ Si}}ผลลัพธ์ข้างต้นน่าผิดหวังมาก แม้ว่าเนื้อหาของวัตถุพารามิเตอร์ที่เป็นทางการ E1 และ E2 ถูกแลกเปลี่ยน แต่ผู้ปฏิบัติงานวัตถุพารามิเตอร์และผู้จัดการไม่ได้แลกเปลี่ยนเนื้อหา เหตุผลที่สำคัญที่สุดที่นี่คือพารามิเตอร์ที่เป็นทางการ E1 และ E2 เป็นสำเนาที่อยู่ของผู้ปฏิบัติงานและผู้จัดการพารามิเตอร์จริง
ดังที่เราทุกคนรู้ใน Java ชื่อตัวแปรวัตถุจริงแสดงถึงที่อยู่ของวัตถุในฮีป (คำศัพท์มืออาชีพเรียกว่าการอ้างอิงวัตถุ) เมื่อมีการเรียกวิธี Java พารามิเตอร์จะผ่านการอ้างอิงไปยังวัตถุ ที่สำคัญหน่วยความจำที่อยู่ที่ถูกครอบครองโดยพารามิเตอร์อย่างเป็นทางการและพารามิเตอร์จริงจะไม่เหมือนกัน เนื้อหาในพารามิเตอร์อย่างเป็นทางการเป็นเพียงสำเนาของการอ้างอิงวัตถุที่เก็บไว้ในพารามิเตอร์จริง
หากคุณมีความเข้าใจในพื้นที่ตัวแปรท้องถิ่นของ Java Stack ในการจัดการหน่วยความจำ JVM (ดู "สถาปัตยกรรมเครื่องเสมือน Java") คุณจะเข้าใจประโยคข้างต้นได้ดีมาก เมื่อ JVM รันโปรแกรมด้านบนการเรียกใช้วิธีหลักและวิธีการแลกเปลี่ยนจะผลักดันช่องว่างหน่วยความจำสองอันที่เรียกว่าเฟรมสแต็กในสแต็ก Java มีชิ้นส่วนของหน่วยความจำที่เรียกว่าพื้นที่ตัวแปรท้องถิ่นในเฟรมสแต็กหลักเพื่อจัดเก็บการอ้างอิงไปยังผู้ปฏิบัติงานและผู้จัดการวัตถุพารามิเตอร์จริง พื้นที่ตัวแปรท้องถิ่นในเฟรมสแต็กสลับเก็บอ้างอิงไปยังวัตถุพารามิเตอร์ที่เป็นทางการ E1 และ E2 แม้ว่าค่าอ้างอิงของ E1 และ E2 จะเหมือนกับของคนงานและผู้จัดการ แต่ก็มีพื้นที่หน่วยความจำที่แตกต่างกัน เมื่อมีการแลกเปลี่ยนการอ้างอิงระหว่าง E1 และ E2 รูปด้านล่างแสดงให้เห็นอย่างชัดเจนว่าจะไม่ส่งผลกระทบต่อค่าอ้างอิงของคนงานและผู้จัดการเลย
การส่งพารามิเตอร์วัตถุ Java ยังคงเป็นค่าโทรแม้ว่าที่อยู่ (อ้างอิง) จะถูกส่งผ่าน ถึงเวลาที่จะให้การโทรอ้างอิงและการเรียกค่าเป็นคำจำกัดความที่ถูกต้อง
โทรตามค่า: ในระหว่างกระบวนการผ่านพารามิเตอร์พารามิเตอร์ที่เป็นทางการและพารามิเตอร์จริงจะใช้ช่องว่างหน่วยความจำที่แตกต่างกันสองแบบโดยสิ้นเชิง เนื้อหาที่จัดเก็บโดยพารามิเตอร์อย่างเป็นทางการคือสำเนาของเนื้อหาที่จัดเก็บโดยพารามิเตอร์จริง ในความเป็นจริงการผ่านของวัตถุ Java เป็นไปตามคำจำกัดความนี้ยกเว้นว่าเนื้อหาที่เก็บไว้โดยพารามิเตอร์อย่างเป็นทางการและพารามิเตอร์จริงไม่ใช่ค่าตัวแปรในความหมายทั่วไป แต่ที่อยู่ของตัวแปร ลองคิดย้อนกลับไป: ที่อยู่ของตัวแปรยังเป็นค่าหรือไม่
การโทรโดยอ้างอิง: ในระหว่างกระบวนการของพารามิเตอร์ที่ผ่านพารามิเตอร์อย่างเป็นทางการและพารามิเตอร์จริงนั้นมีพื้นที่หน่วยความจำเดียวกันอย่างสมบูรณ์และทั้งสองไม่แตกต่างจากกัน ในความเป็นจริงชื่อพารามิเตอร์ที่เป็นทางการและชื่อพารามิเตอร์จริงเป็นเพียงสัญลักษณ์ที่แตกต่างกันในการเขียนโปรแกรม ในระหว่างการดำเนินการโปรแกรมพื้นที่ที่เก็บไว้ในหน่วยความจำเป็นสิ่งที่สำคัญที่สุด ชื่อตัวแปรที่แตกต่างกันไม่ได้ระบุพื้นที่จัดเก็บหน่วยความจำที่อยู่ต่างกัน
โดยทั่วไปแล้วพื้นฐานของการโทรทั้งสองไม่ได้ว่าค่าหรือที่อยู่จะถูกส่งผ่าน (หลังจากทั้งหมดที่อยู่ก็เป็นค่า) แต่ไม่ว่าจะเป็นพารามิเตอร์ที่เป็นทางการและพารามิเตอร์จริงครอบครองพื้นที่หน่วยความจำเดียวกัน ในความเป็นจริงพารามิเตอร์ตัวชี้ที่ส่งผ่านใน C/C ++ ก็เป็นค่าโทรด้วย หากคุณไม่เชื่อลองใช้รหัส C ต่อไปนี้!
#include <stdio.h> void swap (int *a1, int *b1) {int *t = a1; a1 = b1; b1 = t; } int main () {int x1 = 100; int x2 = 200; int *a = & x1; int *b = & x2; printf (" %d %d/n",*a,*b); swap (a, b); printf (" %d %d/n",*a,*b); กลับ 0; -แต่ C/C ++ มีการโทรอ้างอิงซึ่งเป็นวิธีการประกาศตัวแปรที่เรียกว่าการอ้างอิง int a; int & ra = a; โดยที่ RA เป็นนามแฝงของ ไม่มีความแตกต่างระหว่างทั้งสองในหน่วยความจำและครอบครองพื้นที่หน่วยความจำเดียวกัน พารามิเตอร์การผ่านผ่านการอ้างอิง (นามแฝง) สอดคล้องกับลักษณะของการโทรอ้างอิง คุณสามารถลองผลการทำงานของการแลกเปลี่ยนโมฆะ (Int & A1, Int & B1);
ผ่านบทความนี้คุณควรรู้ว่าพารามิเตอร์เมธอด Java เรียกว่าการอ้างอิงหรือค่าหรือไม่