دالة toString()
جزء من قسم Object Oriented Programming في رحلة Java على Coddy — الدرس 41 من 87.
كل فئة في Java ترث من فئة Object، والتي توفر عدة دوال مفيدة. واحدة من أكثر الدوال التي يتم تجاوزها شيوعاً هي toString()، والتي تعيد تمثيلاً نصياً للكائن.
بشكل افتراضي، يعيد toString() اسم الفئة متبوعاً برمز التجزئة (hash code) الخاص بالكائن، وهو أمر ليس مفيداً للغاية:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
Person p = new Person("Alice", 25);
System.out.println(p); // Person@15db9742من خلال تجاوز toString()، يمكنك تقديم مخرجات ذات معنى تصف حالة الكائن:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person[name=" + name + ", age=" + age + "]";
}
}
Person p = new Person("Alice", 25);
System.out.println(p); // Person[name=Alice, age=25]يتم استدعاء الأسلوب toString() تلقائياً عند طباعة كائن أو دمجه مع سلسلة نصية. هذا يجعل تصحيح الأخطاء أسهل بكثير حيث يمكنك رؤية محتويات الكائن بسرعة دون كتابة كود إضافي.
التحدي
سهللنقم ببناء نظام مخزون منتجات يعرض معلومات مفيدة حول العناصر باستخدام تطبيقات toString() مخصصة. ستقوم بإنشاء فئة Product تقوم بتجاوز طريقة toString() الافتراضية لتوفير تمثيل واضح وقابل للقراءة لكل منتج.
ستقوم بتنظيم الكود الخاص بك عبر ملفين:
Product.java: قم بإنشاء فئة تمثل عنصر مخزون. يحتوي كلProductعلى ثلاثة حقول خاصة:name(String)، وprice(double)، وquantity(int). قم بتضمين منشئ (constructor) يقوم بتهيئة جميع الحقول الثلاثة. قم بتجاوز طريقةtoString()لإرجاع سلسلة نصية منسقة بهذا التنسيق تماماً:Product[name=X, price=Y, quantity=Z]حيث X و Y و Z هي قيم الحقول الفعلية. يجب أن يظهر السعر كرقم عادي (لا يلزم تنسيق خاص).Main.java: ابدأ العمل بفئة Product الخاصة بك عن طريق إنشاء وعرض المنتجات. ستتلقى ثلاثة مدخلات: اسم المنتج (String)، والسعر (double)، والكمية (int). قم بإنشاء Product بهذه القيم، ثم قم ببساطة بطباعة كائن المنتج مباشرة باستخدامSystem.out.println(). بفضل طريقةtoString()التي تم تجاوزها، سيعرض هذا تلقائياً معلومات المنتج المنسقة بدلاً من المخرجات الافتراضية الغامضة!
ستتلقى ثلاثة مدخلات: اسم المنتج (String)، والسعر (double)، والكمية (int).
لاحظ كيف أن طباعة الكائن مباشرة تستدعي طريقة toString() الخاصة بك تلقائياً—وهذا ما يجعل تصحيح الأخطاء والتسجيل أسهل بكثير في التطبيقات الحقيقية!
ورقة مرجعية
كل فئة في Java ترث من الفئة Object. تُرجع الطريقة toString() تمثيلاً نصياً للكائن.
بشكل افتراضي، تُرجع toString() اسم الفئة متبوعاً برمز التجزئة (hash code) الخاص بالكائن:
Person p = new Person("Alice", 25);
System.out.println(p); // Person@15db9742قم بإعادة تعريف (Override) الطريقة toString() لتوفير مخرجات ذات معنى:
@Override
public String toString() {
return "Person[name=" + name + ", age=" + age + "]";
}
Person p = new Person("Alice", 25);
System.out.println(p); // Person[name=Alice, age=25]يتم استدعاء الطريقة toString() تلقائياً عند طباعة كائن أو دمجه مع سلسلة نصية.
جرّب بنفسك
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// قراءة المدخلات
String name = scanner.nextLine();
double price = scanner.nextDouble();
int quantity = scanner.nextInt();
// TODO: إنشاء كائن Product باستخدام قيم المدخلات
// TODO: طباعة كائن المنتج مباشرة
// (سيؤدي هذا تلقائياً إلى استدعاء تابع toString() الخاص بك!)
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
1أساسيات الـ OOP
الملفات الخارجيةمقدمة في الـ OOPالفئات (Classes) مقابل الكائنات (Objects)الكلمة المفتاحية thisالدوال (Methods)الحقول (Attributes)دالة البناء (Constructor)تعدد أشكال دالة البناء (Constructor Overloading)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسية (extends)الكلمة المفتاحية superإعادة تعريف الدوال (@Override)تسلسل المنشئات (Constructor Chaining)كلاس Objectالوراثة الأحادية ومتعددة المستوياتلماذا لا توجد وراثة متعددة للكلاساتمراجعة - هيكلية الموظفين7الدوال الخاصة وفئة Object
دالة toString()equals() و hashCode()دالة clone()compareTo() و Comparableواجهة Comparatorمراجعة - الترتيب المخصص2محددات الوصول والتغليف
نظرة عامة على مستويات الوصولدوال Getter و Setterإخفاء البياناتالكلمة المفتاحية finalمراجعة - مدير الحساب البنكي5تعدد الأشكال (Polymorphism)
أساسيات الـ Method Overloadingالـ Method Overriding (في وقت التشغيل)الـ Upcasting والـ Downcastingمعامل الـ instanceofالفئات والدوال المجردة (Abstract)مراجعة - حاسبة الأشكال8مفاهيم OOP المتقدمة
الـ Composition مقابل الـ Inheritanceالـ Aggregation مقابل الـ Compositionالفئات الداخلية والمتداخلة والمجهولة (Inner, Nested & Anonymous)الـ Enums ودوالهاالـ Records (Java 16+)الـ Sealed Classes (Java 17+)11أنماط التصميم - الجزء الأول
مقدمة في أنماط التصميمنمط Singletonنمط Factoryنمط Builderنمط Observerنمط Strategy3خصائص الفئة والعضو الساكن
المتغيرات الخاصة بالكائن مقابل المتغيرات الساكنةالدوال الساكنةالكتل البرمجية الساكنةالثوابت (static final)ملخص - العداد والأدوات المساعدة6الواجهات (Interfaces) والأصناف المجردة (Abstract Classes)
مقدمة في الواجهات (Interfaces)تنفيذ الواجهات (Interfaces)تنفيذ واجهات متعددةالـ Default و Static في الواجهاتالأصناف المجردة مقابل الواجهاتالواجهات الوظيفية (Functional Interfaces)مراجعة - نظام الدفع9الأنواع العامة (Generics)
مقدمة في الأنواع العامةالأصناف العامة (Generic Classes)الدوال العامة (Generic Methods)معاملات الأنواع المقيدةالرموز البديلة (?, extends, super)مراجعة - الحاويات العامة12أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المكرر