Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

كلاس 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 وسبب توفر أساليب معينة في كل كائن تقوم بإنشائه.

challenge icon

التحدي

سهل

دعونا نستكشف كيف تعمل فئة Object كأب عام لجميع فئات Java من خلال بناء نظام جرد بسيط للأجهزة يوضح الأساليب الموروثة من Object.

ستقوم بإنشاء ثلاثة ملفات لتنظيم الكود الخاص بك:

  • Gadget.java: قم بإنشاء فئة تمثل جهازاً إلكترونياً. يجب أن تحتوي فئتك على:
    • حقول خاصة (Private fields) لـ name (String) و year (int)
    • منشئ (Constructor) يقوم بتهيئة كلا الحقلين
    • أساليب جلب (Getter methods) وهي getName() و getYear()
    لا تقم بإعادة تعريف (override) أي أساليب من Object - نريد رؤية السلوك الافتراضي أولاً.
  • 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() التي تم تجاوزها)
        
    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming