إمكانية بناء كلاس جديد على أساس كلاس موجود. الابن يرث كل خصائص الأب ودواله (المسموح بها)، ثم نضيف إليه ما يحتاجه.
الكلاس المورِّث
الكلاس الوارث
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 داخل الحزمة فقط).
دالة البناء لا تُورث، بل تُستدعى: الجد ثم الأب ثم الابن.