English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
سأنسخ سؤال مقابلة/امتحان:
إذا تم نقل نموذج إلى عملية، وكان يمكن لتلك العملية تغيير خصائص هذا النموذج وإرجاع النتيجة المعدلة، فهل هذا هو نقل القيمة أم نقل المرجع؟
الإجابة:
هذا هو نقل القيمة. يسمح لغة Java بتنقل القيمة فقط للمتغيرات في دعواتها. عندما يتم نقل نموذج من المثيل إلى عملية، تكون القيمة هي المرجع إلى هذا المثال. يمكن تغيير خصائص النموذج أثناء الدعوة، ولكن تغيير مرجع النموذج لن يؤثر على المطلوب. يمكن في C++ وC# نقل المرجع أو نقل المعرفات لتغيير القيمة. يمكن كتابة ما يلي في C#، ولكن لا يمكن القيام بذلك في Java.
في Java، هناك نقل القيمة ونقل الإشارة (نقل بالمرجع)، لفهم هذه المفاهيم، يجب فهم نقل القيمة ونقل الإشارة.
دعونا نأخذ مثالاً بسيطاً لنوضح ذلك:
مثلاً إذا ذهبت في رحلة إلى الخارج وتلتقطت صورة مميزة، وأردت مشاركتها بأصدقائك، فإن هناك طريقتين، الأولى هي إرسال هذه الصورة مباشرة لأصدقائك، أي أنك تعطي لصديقك نسخة من هذه الصورة؛ والثانية هي إذا قمت بتحميل هذه الصورة الرائعة إلى QQ (Weibo) وما إلى ذلك، فستحصل على عنوان (Url) للوصول إلى هذه الصورة، حيث تقوم بمشاركة هذا العنوان لأصدقائك.
كما هو موضح في المثال أعلاه، يمكن اعتبار النوع الأول نقل بالقيمة، والنوع الثاني يمكن اعتباره نقل بالمرجع (نقل بالاستدعاء). بعد فهم هذه المفاهيم، يمكننا القيام بتحليل بسيط.
نقل بالقيمة:يتم استخدام استراتيجية هذا النوع فقط عندما يكون المعامل نوع أساسي.
إذا كانت الصورة التي حصل عليها صديقك هي نسخة من الصورة الخاصة بك، فإن تعديل الصديق لن يؤثر على صورتك، وتعديلك لن يؤثر على الصورة التي قدمتها للصديق.
نقل بالعنوان:يتم استخدام استراتيجية هذا النوع فقط عندما يكون المعامل نوع مرجع.
إذا تم تقديم عنوان الUrl للصديق، فإن إذا كان لديه صلاحية التغيير، فإن عملية التعامل مع الصورة من قبل الصديق ستؤدي إلى أن تكون الصورة التي يزورها هو نتيجة التعامل بالصديق.
سنشرح هذا المثال من خلال الكود:
package com.dufy.reforvalue; import java.util.Arrays; /** * نقل بالقيمة والمرجع في جافا * نقل بالقيمة: متغيرات الأساسية-نقل بالقيمة، يتم نقل نقل بالقيمة من خلال نسخ الحصة * نقل بالعنوان: متغيرات المرجع-نقل بالعنوان، يتم نقل نقل بالعنوان من خلال نقل عنوان العنصر * * @author dufy * @creation 9 فبراير 2017 */ public class ReferenceOrValue { /** * أنواع الأساسية، نقل بالقيمة * مثال: مشاركة صورتك مع صديقك، يتلقى الطرف الآخر نسخة حقيقية من صورتك، * يمكنك وصديقك التعامل مع صورك الخاصة دون التأثير على صورة الآخر! */ public static void testVal(int photo){ photo++;//صديقك يعدل الصورة System.out.println("صديقي يرى الصورة = " + photo); } /** * أنواع المرجع: نقل بالعنوان * مثال: مشاركة صورتك مع صديقك، المشاركة هي عنوان الصورة التي قمت بتحميلها على الإنترنت، * يمكنك وصديقك الوصول إلى هذه العنوان واستخدام الصورة! */ public static void testRef(Photo photo){ photo.setPhoto("صورة جافا، رائعة!");//صديقك يعدل صورتك System.out.println("صديقي يرى الصورة = " + photo.getPhoto()); } /** * أنواع المرجع: نقل بالعنوان * لأن المجموعة نوع مرجع. لذا يتم نقل استدعاءاتها، لذا فإن تبادلها في الدالة يؤثر على قيمها الأصلية أيضًا. */ public static void testArrayRef(int[] array){ for (int i = 0; i < array.length; i++) { array[i] = 0; } System.out.println("مجموعة testArrayRef هي = "+Arrays.toString(array)); } public static void main(String[] args) { //أولاً: الإرسال عبر القيم int photo = 10;//تعريف الصورة التي سيتم إرسالها testVal(photo);//إرسال الصورة إلى صديقك، سيحصل صديقك على نسخة System.out.println("أنا رأيت الصورة = " + photo); //ثانياً: الإرسال عبر العناوين Photo p = new Photo();//تعريف كائن صورة، صورة جافا التي صورتها بنفسي p.setPhoto("صورة جافا"); testRef(p);//إرسال كائن الصورة (أي عنوان URL) إلى صديقك، سيحصل صديقك على عنوان URL (عنوان)، وعند فتح URL تكون الصورة System.out.println("صديقي رأى الصورة = " + p.getPhoto()); //ثالثاً: المجموعات هي كذلك كائنات، المجموعات في ذاكرة ال堆. المراجع في الذاكرة السطحية. int array[] = {1,2,3,4,5}; testArrayRef(array); System.out.println("العدد هو = "+Arrays.toString(array)); } /** * فئة الصورة */ class Photo{ String photo; public String getPhoto() { return photo; } public void setPhoto(String photo) { this.photo = photo; } } }
النتيجة الم输出的 كالتالي:
صديقي رأى الصورة = 11
أنا رأيت الصورة = 10
صديقي رأى الصورة = صورة جافا، عظيم!
صديقي رأى الصورة = صورة جافا، عظيم!
مجموعة testArrayRef هي = [0, 0, 0, 0, 0]
العدد هو = [0, 0, 0, 0, 0]
مقطع خفيف: هناك هذا السؤال: كيف يجب كتابة هذا method؟
public static void main(String[] args) { int a = 10; int b = 20; method(a,b);//كتابة method(a,b) بحيث يتم طباعة a=100,b=200 بعد استدعاء method فقط! System.out.println("a = " + a); System.out.println("b = " + b); }
بالطبع، هناك الكثير من الناس مثلي، الذين يكتبون الكود دون التفكير فيه مسبقًا:
private static void method(int a, int b) { a*=10; b*=10; }
لكن بعد تشغيل النتيجة، ستجد أن النتيجة ليست كما تتوقع!
إذا نظرت بعناية إلى الشرح أعلاه، فإنه لن يكون من الصعب فهم لماذا يحدث هذا النوع من النتائج!
اعطني النتائج المحتملة لهذا السؤال:
private static void method(int a, int b) { System.out.println("a=100,b=200"); System.exit(0); }
ما ذكرته أعلاه هو ما قدمته لك محررنا حول تحويل Java من خلال القيمة وتحويل العنوان (مادة اختبار شائعة)، آمل أن يكون هذا مفيدًا لك، إذا كان لديك أي أسئلة، يرجى ترك تعليق، وسأقوم بالرد على أسئلتك في أقرب وقت ممكن. وأنا أيضًا أتقدم بالشكر إلى جميع المستخدمين على دعم موقع呐喊 التعليمي!
البيان: محتوى هذا المقال تم جمعه من الإنترنت، ملكية المحتوى تعود إلى صاحب الحقوق، المحتوى تم إضافته من قبل مستخدمي الإنترنت بطرق مستقلة، هذا الموقع لا يملك حقوق الملكية، لم يتم تعديل المحتوى بشكل يدوي، ولا يتحمل هذا الموقع أي مسؤولية قانونية متعلقة بذلك. إذا كنت قد وجدت محتوى يشتبه في انتهاك حقوق النسخ، فالرجاء إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (الرجاء استبدال # ب @ عند إرسال البريد الإلكتروني) لإبلاغنا، يرجى تقديم الدليل المتعلق بالانتهاك، وستقوم الموقع بإزالة المحتوى المشبوه فورًا.