إمكانية بناء كلاس جديد على أساس كلاس موجود. الابن يرث كل خصائص الأب ودواله (المسموح بها)، ثم نضيف إليه ما يحتاجه.
الكلاس المورِّث
الكلاس الوارث
Superclass · Parent · Base
Subclass · Child · Derived · Extended
الأب، الأساس، الفئة العلوية
الابن، المشتق، الفئة الفرعية
snippet×
SourceHistory⟲⟳🔍
class A {}class B extends A { // B يرث من A}
٢لماذا نحتاجها؟ مثال الموظفين
🧩 قبل الوراثة: name و address و phoneNumber و experience مكرّرة في الكلاسين.🧩 بعد الوراثة: المشترك في Employee مرة واحدة، وكل ابن يضيف ما يخصّه. السهم برأس مثلث فارغ يعني «يرث من» extends.
🧩 تقليل التكرار وسهولة التعديل: أربعة أنواع من الموظفين تشترك في Employee، وإضافة facebookId لهم جميعًا تكون في مكان واحد.
♻️ إعادة استخدام الكودالمشترك يُكتب مرة واحدة في الأب.
✂️ تكرار أقللا نعيد name و address في كل كلاس.
🔧 تعديل أسهلإضافة خاصية لكل الموظفين = تعديل الأب فقط.
٣ماذا يُورث؟
عضو الأب
في الحزمة نفسها
في حزمة أخرى
private
✗
✗
default
✓
✗
protected
✓
✓
public
✓
✓
٤الكلمة super
super(): تستدعي دالة بناء الأب بلا معاملات، وsuper(قيم) تستدعي دالة البناء ذات المعاملات. وتكون أول سطر في دالة بناء الابن.
super.اسم: تصل إلى خاصية أو دالة الأب عند تشابه الأسماء بين الأب والابن.
A.java×
SourceHistory⟲⟳🔍
class A{publicvoid printName() {System.out.println("A"); }}class B extends A{publicvoid printName() {System.out.println("B");super.printName(); }}publicclass Main{publicstaticvoid main(String[] args) { B obj = new B(); obj.printName(); }}
Output – JavaApplication (run)×
run:
B
A
BUILD SUCCESSFUL (total time: 0 seconds)
ترتيب دوال البناء: الجد ثم الأب ثم الابن
🔎 تتبّع: من يُنفَّذ أولًا عند new C()؟
A.java×
SourceHistory⟲⟳🔍
class A{public A() {System.out.println("Hello, I am the class A"); }}class B extends A{public B() {System.out.println("Hi, I am the class B"); }}class C extends B{public C() {System.out.println("I am the class C"); }}publicclass Main{publicstaticvoid main(String[] args) { C obj = new C(); }}
Variables · المتغيّرات في الذاكرة
Output×
٥أشكال الوراثة
الأشكال الثلاثة مدعومة في جافا: فردية، ومتتالية، وهرمية. أما الوراثة المتعددة Multiple (كلاس يرث كلاسين معًا) فلا تدعمها جافا.
✗ خطأ
snippet×
SourceHistory⟲⟳🔍
class C extends A, B {}
✓ صواب
snippet×
SourceHistory⟲⟳🔍
class B extends A { }class C extends B { }
جافا لا تسمح بالوراثة من كلاسين معًا. البديل الوراثة المتتالية، أو الواجهات interface في درس التجريد.
أجب قبل أن تنظر إلى الشرح. التصحيح فوري، وإجاباتك تُحفظ.
الكلمة التي تجعل كلاسًا يرث آخر:
تأمل الكود التالي،
snippet×
SourceHistory⟲⟳🔍
class A { A() { System.out.print("A "); }}class B extends A { B() { System.out.print("B "); }}class C extends B { C() { System.out.print("C "); }}// main داخل الدالةnew C();
ماذا سيكون الناتج عند تنفيذ السطر الأخير؟
عند إنشاء كائن من C تُستدعى دالة بناء الأب أولًا: A ثم B ثم C.
عضو private في الأب:
أين يُكتب super(name);؟
الخلاصة
الوراثة: كلاس ابن يبنى على كلاس أب بـ extends.
يرث الابن الأعضاء غير private (و default داخل الحزمة فقط).
دالة البناء لا تُورث، بل تُستدعى: الجد ثم الأب ثم الابن.