البرمجة

تأثير النوعيات البيانية في جافا: فهم الفرق بين المتغيرات والكائنات

في بداية الأمر، يجدر بنا فهم أن لغة البرمجة جافا تعتمد على مفهوم “pass by value”، وهو مصطلح يشير إلى أن القيمة الفعلية للمتغير تُمرر إلى الدالة أو الطريقة عند استدعائها. ومع ذلك، يظهر الكود الذي قدمته في code.runnable.com استثناءًا يثير التساؤل حول كيف يمكن تغيير قيمة المتغير number في هذه الحالة.

إذا كنت تعتقد أن Java تعامل بشكل صارم مع مفهوم “pass by value”، فيجب علينا تفسير هذا السلوك غير المتوقع. يمكن أن يكون هذا مرتبطًا بطريقة تعامل Java مع المتغيرات البسيطة والمراجع (references).

في الواقع، عند تعريف المتغير number كنوع بيانات أساسي (primitive type) في جافا، يتم تخزين القيمة بشكل مباشر في المتغير نفسه. وهذا يعني أنه عندما قمت بتعيين قيمة جديدة لـ number باستخدام number = 2، تم تحديث قيمة المتغير مباشرة.

بمعنى آخر، عندما تتعامل مع المتغيرات البسيطة في جافا (مثل الأنواع الأساسية: int، double، char، وغيرها)، يتم تمرير القيمة بشكل فعلي، وليس المرجع. وهذا يجعل من الممكن تغيير قيمة المتغير داخل الدالة أو الكود الخاص بك، كما حدث في الكود الذي قدمته.

لكن يجب أن نكون حذرين عند التعامل مع أنواع البيانات الأكثر تعقيدًا مثل الكائنات (objects)، حيث يتم تمرير المراجع (references) بقيمتها، وليس المحتوى الفعلي للكائن. يتطلب التعامل مع هذه الحالات فهمًا أعمق لكيفية عمل جافا في هذا السياق.

باختصار، السبب في أن الكود الذي قدمته يعمل كما هو متوقع في code.runnable.com يعود إلى الطريقة التي تتعامل بها جافا مع المتغيرات البسيطة، حيث يتم تمرير القيمة بشكل فعلي.

المزيد من المعلومات

لفهم الأمور بشكل أعمق، يمكننا التحدث عن مفاهيم متقدمة في لغة البرمجة جافا، مثل الاختلاف بين المتغيرات البسيطة والكائنات (Objects) وكيفية تأثير هذا الفرق على تصرف البرنامج.

في جافا، يتم التعامل مع المتغيرات البسيطة (مثل int و double) على أنها نوعيات بيانات أساسية، وتتم معاملتها بشكل مختلف عند مقارنتها بكائنات الفئات (Class Objects). عند إنشاء متغير من النوع البسيط، يتم حجز مساحة في الذاكرة لتخزين القيمة المباشرة. ولذلك، عند تغيير قيمة هذا المتغير، يتم تحديث القيمة مباشرة.

لكن عند التعامل مع الكائنات، يتم التعامل مع المراجع (references) للكائن في الذاكرة بدلاً من المحتوى الفعلي. عند تمرير متغير كائن (Object) إلى دالة أو طريقة، يتم نقل المرجع إلى الكائن بدلاً من نسخة من المحتوى الكائن نفسه. وبذلك، يصبح بإمكان الدالة تغيير حالة الكائن الأصلي.

لنفهم ذلك بشكل أفضل، دعونا ننظر إلى مثال يستخدم كائنًا:

java
public class Person { String name; public Person(String name) { this.name = name; } public void changeName(Person person, String newName) { person.name = newName; } } public class Main { public static void main(String[] args) { Person person = new Person("John"); System.out.println("Before: " + person.name); Person anotherPerson = person; anotherPerson.changeName(anotherPerson, "Jane"); System.out.println("After: " + person.name); } }

في هذا المثال، يتم إنشاء كائن من الفئة Person ويتم تغيير اسمه باستخدام الدالة changeName التي تأخذ كائنًا Person كمعامل. ومع ذلك، نرى أن التغيير ينعكس على الكائن الأصلي بسبب استخدام المرجع.

هذه الفهم يساعدنا في توضيح الاختلاف في السلوك بين المتغيرات البسيطة والكائنات في جافا، وكيفية تأثير ذلك على مفهوم “pass by value” في سياق اللغة.

زر الذهاب إلى الأعلى