Javaتحويل الأنواع في جافا
- مفهوم الـ Type Casting في جافا
- مفهوم Automatic Upcasting و Manual Upcasting في جافا
- نقطة مهمة حول الـ Downcasting في جافا
- أمثلة شاملة على تحويل أنواع الكائنات في جافا
- تحويل أنواع البيانات البدائية في جافا
- أخطاء محتملة قد تحدث عند تحويل الأنواع في جافا
مفهوم الـ Type Casting في جافا
Type Casting تعني تحويل نوع الكائن أو المتغير إلى نوع شبيه له.
هذا التحويل يمكن تحقيقه فقط بين Superclass و Subclass.
أساليب التحويل
بالنسبة لتحويل أنواع الكائنات يوجد أسلوبين للتحويل و هما:
- Upcasting: تعني تحويل كائن تم إنشاؤه من Subclass إلى نوع كائن من Superclass.
- Downcasting: تعني تحويل كائن تم إنشاؤه من Superclass إلى نوع كائن من Subclass.
معلومة تقنية
التحويل في كلا الحالتين لا يقصد منه تحويل نوع الكائن الأصلي، بل تخصيص الطريقة التي سيتعامل فيها المترجم مع الكائن.
طريقة تحويل أنواع الكائنات
في الصورة التالية سترى كيف نفعل عمليات الـ Upcasting و الـ Downcasting.
إذا قمت بإنشاء كلاس إسمه A، ثم قمت بإنشاء كلاس آخر إسمه B يرث منه. و بعدها فعلت DownCast لكائن من A على أنه B فهنا الكائن سيبقى كائن من A و لكن المترجم سيتعامل معه ككائن من B، و سيخفي خصائص الكلاس A فيه.
لا تقلق إن لم تفهم ما قصدناه الآن لأنك ستفهم هذا الأمر بدقة من خلال الأمثلة.
ملخص للتحويل
- Upcasting تعني التحويل من الأسفل إلى الأعلى، أي تحويل الكائن الإبن إلى كائن من الأب.
- Downcasting تعني التحويل من الأعلى إلى الأسفل أي تحويل الكائن الأب إلى كائن من الإبن.
مفهوم Automatic Upcasting و Manual Upcasting في جافا
بالنسبة للـ Upcasting، يمكنك عدم تحديد نوع الـ Superclass المستخدم في التحويل لأن المترجم يفعل ذلك بشكل تلقائي.
مثال
الطريقتين المذكورتين هنا مسموحتان في جافا و يعطيانك نفس النتيجة.
- الطريقة الأولى تسمى Manual Upcasting لأننا قمنا بذكر النوع الذي سيتم تحويل الكائن إليه.
- الطريقة الثانية تسمى Automatic Upcasting لأننا لم نقم بذكر النوع الذي سيتم تحويل الكائن إليه, و بالتالي سيقوم المترجم بذلك بشكل تلقائي.
في الأمثلة التالية سنستخدم أسلوب الـ Automatic Upcasting و ليس الـ Manual Upcasting.
نقطة مهمة حول الـ Downcasting في جافا
بالنسبة للـ Downcasting, يجب تحديد نوع الـ Subclass المستخدم في التحويل لأن المترجم لا يفعل ذلك بشكل تلقائي, و السبب في ذلك أن التحويل من الأعلى إلى الأسفل بشكل عام يعني أن الكائن الذي تم إنشائه من الـ Superclass سيخسر بعض بياناته عند تحويله إلى كائن من الـ Subclass.
إذاً لا يمكن أن تفعل DownCast لكائن إلا إذا كنت قد سبق و فعلت له UpCast.
المثال الأول
إذاً هنا كان يجب تحويل نوع الكائن a حتى تحل المشكلة.
المثال الثاني
إذاً هنا كان يجب تحويل نوع الكائن a حتى تحل المشكلة.
أمثلة شاملة على تحويل أنواع الكائنات في جافا
سنقوم بتعريف كلاس إسمه Person عبارة عن شخص, بعدها سنقوم بتعريف كلاس إسمه Male و كلاس إسمه Female, و الإثنان يرثان من الكلاس Person. أي يجب ربط الكلاسات كما في الصورة التالية:
الآن سنقوم ببناء جميع هذه الكلاسات, ثم سنقوم ببناء الكلاس Main لتجربة مفهوم الـ Type Casting.
إنتبه: سنستخدم الدالة getClass() لمعرفة الكلاس الأصلي للكائنات.
المثال الأول
سنحصل على النتيجة التالية عند التشغيل.
حسناً, لقد فهمت الآن طريقة التحويل لكنك حتماً مرتبك بشأن نتيجة التشغيل, و لعلك تتساءل إذا كانت الكائنات rola, و p و rana كلها تشير إلى نفس الكائن؟!".
سنعلمك حيلة تجعلك تتأكد إذا كان يوجد أكثر من إسم يشير إلى نفس الكائن.
كل ما عليك أن تفعله هو طباعة العناوين المرجعية ( Reference Addresses ) التي تم تخزين الكائنات فيها في الذاكرة.
سنعيد نفس المثال السابق مع عرض العناوين المرجعية التي تم تخزين الكائنات فيها في الذاكرة, و نلفت الإنتباه أن هذه النتيجة تتغير من حيث أسماء العناوين التي ستظهر كلما قمت بتشغيل البرنامج (ذاكرة الحاسوب تعمل هكذا), لكن الفكرة هنا أن المتغيرات التي تشير إلى نفس الكائن ستشير إليه نفسه في الذاكرة (أي ستشير إلى نفس العنوان في الذاكرة) و هذا ما يؤكد لنا أنهم يشيرون إليه.
المثال الثاني
سنحصل على نتيجة تشبه النتيجة التالية عند التشغيل لأن الأماكن المحجوزة في الذاكرة لتخزين بيانات البرامج تتبدل كما قلنا سابقاً.
قمنا بتعليم العناوين المشتركة باللون الأصفر.
إذاً الكائنات الثلاثة rola, p و rana يشيرون فعلاً إلى نفس الكائن. و الكائن هنا هو كائن من الكلاس Female.
الفكرة الأخيرة التي عليك التأكد منها هي أنه عندما نقول أن الكائن نوعه كذا و لكنه بالتحديد من النوع كذا, فإن النوع الذي حددته له هو النوع الذي سيمثل الكائن.
مثال
هنا سيعتبر المترجم أن الكائن ziad أصله كائن من الكلاس Person.
بما أننا وضعنا فيه كائن من الكلاس Male فإنه سيحتوي فقط على الأشياء المشتركة بينه و بين الكلاس Person.
ما عليك الإنتباه له هنا أنه في حال كان الكلاس Male يحتوي على أشياء إضافية عن الكلاس Person فإن الكائن لن يملكها.
سنعيد نفس المثال السابق لكننا سنضيف دالة إسمها print() في الكلاس Person و سنفعل لها Override في الكلاسَين Male و Female.
المثال الثالث
سنحصل على النتيجة التالية عند التشغيل.
تحويل أنواع البيانات البدائية في جافا
بالنسبة لأنواع البيانات البدائية (int, long, float, double, char) يمكنك أن تفعل لهم Cast عند الحاجة بكل سهولة.
مثال
سنحصل على النتيجة التالية عند التشغيل.
إنتبه جيداً أثناء التحويل لأنك كما شاهدت في المثال السابق أنك قد تخسر بعض البيانات عند التحويل.
أخطاء محتملة قد تحدث عند تحويل الأنواع في جافا
إذا لم تقم بتحويل الكائنات بطريقة صحيحة, سيؤدي ذلك إلى ظهور أخطاء في الكود, قمنا بتقسيمها إلى ثلاثة إحتمالات:
- خطأ من النوع RuntimeException و هذا الخطأ يظهر لك قبل تشغيل البرنامج.
- خطأ من النوع ClassCastException و هذا الخطأ يظهر لك أثناء تشغيل البرنامج.
وضعنا هنا أمثلة حول أنواع الأخطاء التي قد تحدث عند تحويل أنواع الكائنات.