كلاس Object
جزء من قسم Object Oriented Programming في رحلة Java على Coddy — الدرس 24 من 87.
في لغة Java، ترث كل فئة تقوم بإنشائها تلقائيًا من فئة خاصة تسمى Object. حتى لو لم تكتب extends في أي مكان، تظل الفئة الخاصة بك فئة فرعية من Object. وهذا يجعل Object هو جذر التسلسل الهرمي للفئات بالكامل.
public class Person {
// هذا يمتد ضمنياً من Object
}
// يعادل:
public class Person extends Object {
}بما أن كل فئة ترث من Object، فإن كل كائن في Java لديه وصول إلى عدة دوال مدمجة. وتشمل الأكثر استخداماً منها ما يلي:
| الدالة (Method) | الغرض |
|---|---|
toString() | تعيد تمثيلاً نصياً للكائن |
equals(Object obj) | تقارن بين كائنين للتحقق من التساوي |
hashCode() | تعيد قيمة رمز التجزئة (hash code) للكائن |
getClass() | تعيد فئة وقت التشغيل (runtime class) للكائن |
بشكل افتراضي، تمتلك هذه الطرق تطبيقات عامة. على سبيل المثال، تعيد toString() اسم الفئة متبوعاً بعنوان ذاكرة الكائن، وهو أمر ليس مفيداً جداً:
Person p = new Person();
System.out.println(p.toString()); // المخرج: Person@1a2b3c4dهذا هو السبب في أنك ستقوم غالباً بتجاوز هذه الأساليب في فئاتك الخاصة لتوفير سلوك ذي معنى. إن فهم أن Object هو الأب العام يساعد في تفسير سبب إمكانية تخزين أي كائن في متغير من نوع Object وسبب توفر أساليب معينة في كل كائن تقوم بإنشائه.
التحدي
سهلدعونا نستكشف كيف تعمل فئة Object كأب عام لجميع فئات Java من خلال بناء نظام جرد بسيط للأجهزة يوضح الأساليب الموروثة من Object.
ستقوم بإنشاء ثلاثة ملفات لتنظيم الكود الخاص بك:
Gadget.java: قم بإنشاء فئة تمثل جهازاً إلكترونياً. يجب أن تحتوي فئتك على:- حقول خاصة (Private fields) لـ
name(String) وyear(int) - منشئ (Constructor) يقوم بتهيئة كلا الحقلين
- أساليب جلب (Getter methods) وهي
getName()وgetYear()
- حقول خاصة (Private fields) لـ
Smartphone.java: قم بإنشاء فئة فرعية ترث من Gadget وتضيف ميزات خاصة بالهواتف الذكية:- حقل خاص لـ
brand(String) - منشئ يأخذ name و year و brand - استخدم
super(name, year)للجزء الخاص بالأب - أسلوب
getBrand()يعيد العلامة التجارية - قم بإعادة تعريف أسلوب
toString()ليعيد:Smartphone: [brand] [name] ([year])
- حقل خاص لـ
Main.java: وضح الفرق بين أساليبObjectالافتراضية والمعاد تعريفها. ستتلقى ثلاثة مدخلات: اسم الجهاز، السنة، والعلامة التجارية. قم بإنشاء كل منGadgetوSmartphoneباستخدام نفس الاسم والسنة (بالإضافة إلى العلامة التجارية للهاتف الذكي)، ثم:- اطبع اسم فئة الجهاز باستخدام
getClass().getSimpleName() - اطبع ما إذا كان أسلوب
toString()الافتراضي للجهاز يحتوي على رمز "@" (اطبعtrueأوfalse) - اطبع الهاتف الذكي باستخدام أسلوب
toString()المعاد تعريفه الخاص به
- اطبع اسم فئة الجهاز باستخدام
ستتلقى ثلاثة مدخلات: اسم الجهاز/الهاتف الذكي (String)، السنة (int)، والعلامة التجارية (String).
يوضح هذا التحدي سبب أهمية إعادة تعريف أساليب Object - حيث يمنحك أسلوب toString() الافتراضي شيئاً مثل Gadget@1a2b3c، بينما توفر نسختك المخصصة معلومات ذات معنى!
ورقة مرجعية
في لغة Java، ترث كل فئة تلقائياً من الفئة Object، مما يجعلها أصل التسلسل الهرمي للفئات بالكامل:
public class Person {
// هذا يمتد ضمنياً من Object
}
// يعادل:
public class Person extends Object {
}يمتلك كل كائن في Java إمكانية الوصول إلى عدة طرق مدمجة موروثة من Object:
| الطريقة (Method) | الغرض |
|---|---|
toString() | تعيد تمثيلاً نصياً للكائن |
equals(Object obj) | تقارن بين كائنين للتحقق من التساوي |
hashCode() | تعيد قيمة رمز التجزئة (hash code) للكائن |
getClass() | تعيد فئة وقت التشغيل (runtime class) للكائن |
بشكل افتراضي، تعيد toString() اسم الفئة متبوعاً بعنوان ذاكرة الكائن:
Person p = new Person();
System.out.println(p.toString()); // المخرج: Person@1a2b3c4dيمكنك تجاوز (override) هذه الطرق في فئاتك الخاصة لتوفير سلوك ذو معنى. يمكنك تخزين أي كائن في متغير من نوع Object لأن جميع الفئات ترث منه.
جرّب بنفسك
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// قراءة المدخلات
String name = scanner.nextLine();
int year = scanner.nextInt();
scanner.nextLine(); // استهلاك السطر الجديد
String brand = scanner.nextLine();
// TODO: إنشاء كائن Gadget باستخدام name و year
// TODO: إنشاء كائن Smartphone باستخدام name و year و brand
// TODO: طباعة اسم فئة الـ gadget باستخدام getClass().getSimpleName()
// TODO: طباعة ما إذا كان toString() الخاص بالـ gadget يحتوي على "@" (true أو false)
// TODO: طباعة الـ smartphone (يستخدم 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أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المكرر