บทความนี้วิเคราะห์การโทรตามมูลค่าใน Java พร้อมตัวอย่าง แบ่งปันกับทุกคนสำหรับการอ้างอิงของคุณ การวิเคราะห์เฉพาะมีดังนี้:
Java ดำเนินการอินสแตนซ์ของวัตถุโดยการอ้างอิง
สิ่งที่สามารถยืนยันได้ก็คือวิธีการใช้งานอ็อบเจ็กต์ใน Java คือการใช้งานอ็อบเจ็กต์โดยการอ้างอิง เพื่อให้เข้าใจสิ่งนี้อย่างลึกซึ้งยิ่งขึ้น ฉันจึงเขียนโค้ดต่อไปนี้:
ขั้นแรกให้กำหนดประเภทที่กำหนดเอง คัดลอกโค้ดดังนี้: คลาสสาธารณะ {
ชื่อสตริง;
บุคคล(ชื่อสตริง){
this.name = ชื่อ;
-
-
ชื่อที่นี่มีค่าเริ่มต้นเป็นสาธารณะ (ซึ่งแตกต่างจากแอตทริบิวต์เริ่มต้นของคลาสใน C ++)
จากนั้นการโทรในฟังก์ชัน Main จะเป็นดังนี้:
คัดลอกโค้ดดังต่อไปนี้: คลาสสาธารณะ Main {
-
* @param args
-
โมฆะคงที่สาธารณะ main (String [] args) {
// TODO ต้นขั้ววิธีการสร้างอัตโนมัติ
บุคคล p1 = บุคคลใหม่ ("พอล");
บุคคล p2 = บุคคลใหม่ ("Griefen");
System.out.println("p1.name = " + p1.name + " p2.name = " + p2.name);
บุคคล tmp;
ทีเอ็มพี = p1;
พี1 = พี2;
System.out.println("tmp.name = " + tmp.name + " p1.name = " + p1.name + " p2.name = " + p2.name);
-
-
ผลลัพธ์ ณ เวลานี้จะเป็นดังนี้:
คัดลอกโค้ดดังนี้: p1.name = Paul p2.name = Griefen
tmp.name = พอล p1.name = กรีเฟน p2.name = กรีเฟน
ฮะ? เหตุใดจึงเป็นผลลัพธ์นี้ ในฐานะ CPPer ฉันสับสน! เป็นข้อมูลอ้างอิง ดังนั้นหลังจากดำเนินการคำสั่งต่อไปนี้ ให้คัดลอกโค้ดดังต่อไปนี้: Person tmp;
ทีเอ็มพี = p1;
พี1 = พี2;
เนื่องจากฉันเข้าใจการดำเนินการนี้ตามแนวคิดของการอ้างอิงใน C++ ดังนั้น tmp p1 p2 ทั้งหมดควรเป็นอ็อบเจ็กต์เดียวกันในเวลานี้ กล่าวคือ ทั้งหมดควรชี้ไปที่อ็อบเจ็กต์ p2 แต่ผลลัพธ์พิสูจน์ให้เห็นชัดเจนว่าความเข้าใจนี้ผิด! ดังนั้นเนื่องจากการอ้างอิงใน Java จึงไม่เหมือนกับการอ้างอิงใน C++? - - - มันเหมือนกับตัวชี้ใน C ++ หรือไม่?
ดี! มาทำความเข้าใจกระบวนการดำเนินการนี้ตามคำแนะนำในภาษา C++ กัน
ก่อนอื่น Person tmp ประกาศตัวชี้ซึ่งคล้ายกับการประกาศตัวชี้ใน C ++ ในภาษา C++ มีการกำหนดไว้อย่างชัดเจนว่าการประกาศอ้างอิงไม่สามารถเขียนแยกกันได้ในลักษณะนี้ เมื่อมีการประกาศการอ้างอิง ควรชี้ไปที่วัตถุ แน่นอนว่าเหตุผลในขั้นตอนแรกนั้นถูกต้อง นี่เป็นการเริ่มต้นที่ดี! จากนั้น tmp = p1; p1 = p2; tmp ชี้ไปที่ p1 และ p1 ชี้ไปที่ p2 อย่างชัดเจน พบว่าสม่ำเสมอ!
นั่นหมายความว่าหากการเปรียบเทียบการอ้างอิงใน Java กับการดำเนินการข้อมูลใน C++ ก็ควรจะคล้ายกับแนวคิดของพอยน์เตอร์ใน C++ มากกว่า!
พอยน์เตอร์ใน C++ ใช้ฟังก์ชันข้างต้น
เนื่องจากวิธีการข้างต้นในการดำเนินการกับวัตถุใน Java นั้นคล้ายคลึงกับตัวชี้ใน C++ เรามาดูวิธีการปรับใช้วิธีการข้างต้นใน C++ กัน: #include "stdafx.h"
#รวม <string>
#รวม <iostream>
บุคคลในชั้นเรียน
-
สาธารณะ:
มาตรฐาน::ชื่อสตริง;
สาธารณะ:
บุคคล (มาตรฐาน::ชื่อสตริง)
-
นี้ -> ชื่อ = ชื่อ;
-
-
int _tmain (int argc, _TCHAR * argv [])
-
บุคคล* p1 = บุคคลใหม่ ("พอล");
บุคคล* p2 = บุคคลใหม่ ("Griefen");
std::cout<< "p1.name" << p1->ชื่อ << " p2.name = " << p2->ชื่อ << std::endl;
บุคคล* tmp;
ทีเอ็มพี = p1;
พี1 = พี2;
std::cout<<"tmp.name" << tmp->ชื่อ << " p1.name " << p1->ชื่อ << " p2.name = " << p2->ชื่อ << std::endl ;
ลบทีเอ็มพี;
ลบ p1;
กลับ 0;
-
หลังจากการดีบัก ฉันพบว่าผลลัพธ์เอาต์พุตเหมือนกับผลลัพธ์การรัน Java ข้างต้น
การใช้งานพื้นฐานของภาษาใด ๆ ก็เหมือนกัน
เนื่องจากเอฟเฟกต์การอ้างอิงใน Java ดูเหมือนจะเหมือนกับตัวชี้ใน C ++ เหตุใดจึงไม่เรียกว่าตัวชี้โดยตรงใน Java แน่นอนว่ามีความแตกต่างกัน ตัวอย่างเช่น การอ้างอิงใน Java ไม่สามารถดำเนินการ ++ ได้ แต่ตัวชี้ใน C++ สามารถและสามารถย้ายได้ตามต้องการ เห็นได้ชัดว่า ณ จุดนี้ Java ได้ทำงานหลายอย่างกับพอยน์เตอร์เพื่อจำกัดและทำให้พวกเขาทำงานปลอดภัยยิ่งขึ้น แต่ไม่ว่าชั้นบนจะดูใหญ่แค่ไหนเมื่อไปถึงชั้นล่างสุดก็ต้องสมัครหน่วยความจำและหน่วยความจำจะต้องถูกปล่อยออกมาหลังจากใช้งานหมดแล้ว นี่คืองานในภาษาใดก็ได้!
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับการเขียนโปรแกรม Java ของทุกคน