ความเข้าใจในการถ่ายโอนคุณค่าของ Java:
รหัส 1:
การทดสอบคลาสสาธารณะ { /** * @param args */ public static void main (String[] args) { StringBuffer buffer= new StringBuffer("colin"); SChange(buffer); โมฆะคงที่สาธารณะ SChange (StringBuffer str) { str= new StringBuffer ("หวง");รหัส 2:
การทดสอบคลาสสาธารณะ { /** * @param args */ public static void main (String[] args) { StringBuffer buffer= new StringBuffer("colin"); SChange(buffer); โมฆะสาธารณะ SChange (StringBuffer str) { //str= new StringBuffer("หวง"); str.append(" หวง");ลองใช้รูปภาพสองรูปเพื่ออธิบายโค้ดด้านบน 1 และโค้ด 2 ตามลำดับ:
สถานะดั้งเดิม
แผนภาพรหัส 1:
ความเข้าใจรหัส 2:
ในรหัส 1 การอ้างอิงการคัดลอกชี้ไปที่วัตถุใหม่ แต่วัตถุดั้งเดิมยังคงไม่เปลี่ยนแปลง
ในรหัส 2 การอ้างอิงการคัดลอกจะเปลี่ยนวัตถุต้นฉบับ
นี่คือการส่งผ่านค่าของ Java
ความแตกต่างระหว่างการถ่ายโอนสองประเภทใน C ++:
สำหรับการส่งผ่านค่า C++ การส่งผ่านการอ้างอิง และวิธีการชี้ ให้ใช้โค้ดต่อไปนี้เพื่อทำความเข้าใจและรันการทดสอบด้วยตนเอง
#include <stdio.h> #include <iostream> #include <typeinfo> void ByValue(int a) { a = a + 1; } void ByRef(int& a) { a = a + 1; } โมฆะ ByPointer(int* ก) { *a = *a + 1; } int main(int argv, char** args) { int v = 1; ByRef(v); // ผ่านตามค่าอ้างอิง ByPointer(&v); // ผ่านตามค่า int* vp = &v; ศาล << typeid(vp).name() << std::endl; // std::cout << typeid(&vp).name() << std::endl; std::cout << "สิ้นสุด" << std::endl; }ฟังก์ชันแรกถูกส่งผ่านโดยค่า และฟังก์ชันที่สองถูกส่งผ่านโดยการอ้างอิง แต่สำหรับสองฟังก์ชันหลัง ฟังก์ชันเดียวกันจะถูกเรียกหนึ่งครั้งโดยการโทรโดยการอ้างอิง และหนึ่งครั้งโดยการโทรตามค่า
เพราะ:
ByPointer(vp); หาก vp ไม่เปลี่ยนแปลง จะไม่สามารถเปลี่ยนแปลงได้ ผ่านไปค่า
ByPointer(&v); การเปลี่ยนแปลง ส่งผ่านโดยการอ้างอิง (คุณอาจบอกว่าสิ่งที่ส่งผ่านนั้นเป็นที่อยู่ของ v จริงๆ และ ByPointer ไม่สามารถเปลี่ยนที่อยู่ของ v ได้ ดังนั้นนี่คือ Call by value ฟังดูเหมือนอธิบายได้ในตัว แต่ที่อยู่ของ v เป็นเพียงข้อมูลล้วนๆ เมื่อ การเรียกไม่มีอยู่ในรหัสสี่เหลี่ยม สำหรับผู้เรียกจะมีเพียง v และ v จะถูกเปลี่ยนโดยฟังก์ชัน ByPointer อย่างแน่นอน พฤติกรรมการอ้างอิง การพิจารณาพฤติกรรมเป็นจุดประสงค์ดั้งเดิมของกลยุทธ์การประเมิน หากทุกสิ่งถูกสรุปเป็นค่านิยมและพิจารณาปัญหาจากมุมมองของข้อมูล ก็ไม่จำเป็นต้องนำเสนอแนวคิดของกลยุทธ์การประเมินผลเพื่อทำให้ผู้ฟังสับสน )
nob: ความเข้าใจข้างต้นได้รับการยอมรับแล้ว วิธีการใช้ตัวชี้เสริมสามารถใช้ได้สองวิธี การส่งผ่านค่าอ้างอิง: การส่งผ่านที่อยู่หรือการอ้างอิงของตัวแปร หากคุณใช้ typeid(x).name() ดู &v และ vp คุณจะพบว่าทั้งคู่เป็นแบบพอยต์ ดังนั้นการแสดงสองครั้งจึงให้ผลลัพธ์เดียวกัน คุณอาจจะคิดกับฉันแบบนี้
ByValue(&v); //ข้อผิดพลาด
ในขณะที่การส่งพารามิเตอร์ประเภทต่างๆ ใน C++ จะไม่ผ่านการคอมไพล์โดยตรง
สรุป:
ดังนั้นผมคิดว่าถ้าคุณส่งผ่านค่าหรือโดยการอ้างอิง คุณเพียงแค่ต้องดูว่ามันไปในหน่วยความจำอย่างไร
หน่วยความจำที่ใช้ร่วมกันหมายถึงการส่งผ่านข้อมูลอ้างอิง และหน่วยความจำการคัดลอกหมายถึงการส่งผ่านค่า (โดยทิ้งบางกรณีพิเศษไว้ก่อน)
ในกรณีนี้:
C/C++: ส่งผ่านตามค่าตามค่าเริ่มต้น ส่งผ่านโดยการอ้างอิง และเข้าใจพอยน์เตอร์แยกกัน (สามารถเข้าใจพอยน์เตอร์ได้ว่าส่งผ่านค่าหรือโดยการอ้างอิง และผลลัพธ์จะเหมือนกัน)
JAVA: ประเภทข้อมูลพื้นฐานถูกส่งผ่านตามค่า และวัตถุก็ถูกส่งผ่านด้วยค่าเช่นกัน (คัดลอกการอ้างอิงของวัตถุนี้)
C#: ส่งค่าตามประเภทค่า ส่งผ่านการอ้างอิงตามประเภทอ้างอิง ความเข้าใจพิเศษเกี่ยวกับการอ้างอิง/ออก
สตริงใน JAVA และ C# จำเป็นต้องมีความเข้าใจเป็นพิเศษ ลักษณะที่ปรากฏคือการส่งผ่านค่า แต่การใช้งานจริงขึ้นอยู่กับเครื่องเสมือน