تحلل هذه المقالة الاستدعاء حسب القيمة في Java مع الأمثلة. شاركها مع الجميع لتكون مرجعا لك. التحليل المحدد هو كما يلي:
تعمل Java على تشغيل مثيلات الكائن حسب المرجع
ما يمكن تأكيده هو أن طريقة تشغيل الكائنات في Java هي تشغيل الكائنات حسب المرجع. من أجل فهم هذا بشكل أعمق كتبت الكود التالي:
قم أولاً بتحديد نوع مخصص. انسخ الرمز كما يلي: public class Person {.
اسم السلسلة؛
الشخص (اسم السلسلة) {
this.name = name;
}
}
الاسم الافتراضي هنا هو public (والذي يختلف عن السمة الافتراضية للفئة في C++)
ثم يكون الاستدعاء في الوظيفة الرئيسية كما يلي:
انسخ الكود كما يلي: public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO طريقة تم إنشاؤها تلقائيًا stub
شخص p1 = شخص جديد("بول");
الشخص p2 = شخص جديد("Griefen");
System.out.println("p1.name = " + p1.name + " p2.name = " + p2.name);
شخص تمب؛
تمة = ص1;
ص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 = Paul p1.name = Griefen p2.name = Griefen
هاه؟ لماذا هذه النتيجة؟ باعتباري CPer فأنا في حيرة من أمري! وهو مرجع، لذا بعد تنفيذ العبارة التالية، انسخ الكود كما يلي: Person tmp;
تمة = ص1;
ص1 = ص2؛
لأنني أفهم هذه العملية وفقًا لمفهوم المرجع في C++، فيجب أن يكون tmp p1 p2 جميعًا نفس الكائن في هذا الوقت، أي أنه يجب أن يشيروا جميعًا إلى الكائن p2. لكن الناتج يثبت بوضوح أن هذا الفهم خاطئ! إذن بما أن المراجع في Java ليست هي نفس المراجع في C++؟ ! ! ! هل هو نفس المؤشر في C++؟
جيد! دعونا نفهم عملية التشغيل هذه وفقًا لمؤشرات C++.
أولاً، يقوم الشخص tmp بتعريف المؤشر، وهو مشابه لإعلان المؤشر في لغة C++. في لغة C++، يُنص بوضوح على أنه لا يمكن كتابة الإعلان المرجعي بشكل منفصل بهذه الطريقة، ويجب أن يشير إلى كائن ما. هذه بداية جيدة! ثم tmp = p1 = p2؛ من الواضح أن tmp يشير إلى p1 وp1 يشير إلى p2. وقد وجد أنها متسقة!
وهذا يعني أنه إذا تمت مقارنة المراجع في Java مع عمليات البيانات في C++، فيجب أن تكون أكثر شبهاً بمفهوم المؤشرات في C++!
تنفذ المؤشرات في C++ الوظائف المذكورة أعلاه
نظرًا لأن الطريقة المذكورة أعلاه لتشغيل الكائنات في Java تشبه المؤشر في C++، فلنلقي نظرة على كيفية تنفيذ الطريقة المذكورة أعلاه في C++، انسخ الكود كما يلي: #include "stdafx.h"
#تشمل <سلسلة>
#تشمل <iostream>
شخص الطبقة
{
عام:
الأمراض المنقولة جنسيا::اسم السلسلة؛
عام:
الشخص (std::اسم السلسلة)
{
هذا->الاسم = الاسم؛
};
};
int _tmain(int argc, _TCHAR* argv[])
{
Person* p1 = new Person("Paul");
Person* p2 = new Person("Griefen");
std::cout<< "p1.name " << p1->name << " p2.name = " << p2->name << std::endl;
شخص* تمب;
تمة = ص1;
ص1 = ص2؛
std::cout<<"tmp.name" << tmp->name << " p1.name " << p1->name << " p2.name = " << p2->name << std::endl ;
حذف تمب؛
حذف ص1؛
العودة 0؛
}
بعد التصحيح، وجدت أن نتيجة الإخراج هي نفس نتيجة تشغيل Java المذكورة أعلاه.
التنفيذ الأساسي لأي لغة هو نفسه
نظرًا لأن التأثير المرجعي في Java يبدو هو نفسه المؤشر في C++، فلماذا لا يسمى المؤشر مباشرة في Java؟ من الواضح أن هناك اختلافات، على سبيل المثال، لا يمكن للمراجع في Java إجراء عمليات ++، ولكن يمكن تحريك المؤشرات في C++ حسب الرغبة. من الواضح في هذه المرحلة أن Java قامت بالكثير من العمل على مؤشراتها لتقييدها وجعلها تعمل بشكل أكثر أمانًا. ولكن بغض النظر عن حجم الطبقة العليا، عندما تصل إلى الطبقة السفلية، تحتاج إلى التقدم بطلب للحصول على الذاكرة، ويجب تحرير الذاكرة بعد استنفادها. هذا هو العمل في أي لغة!
آمل أن تكون هذه المقالة مفيدة لبرمجة جافا للجميع.