مفهوم الوراثة Inheritance :

في جافا, الكلاس يمكنه أن يرث من كلاس آخر, و بالتالي يحصل على الدوال و المتغيرات الموجودة في هذا الكلاس.

فكرة الوراثة بسيطة, لكن فائدتها قوية جداً. فمثلاً إذا كنت تريد إنشاء كلاس جديد و لاحظت أنه يوجد كلاس جاهز يحتوي على كودات قد تفيدك يمكنك استغلالها بدل كتابتها من الصفر, أي يمكنك جعل الكلاس الذي قمت بتعريفه يرث هذا الكلاس, و بعدها يمكنك إستخدام جميع المتغيرات و الدوال التي ورثها الكلاس الجديد من الكلاس الجاهز.

مفهوم Superclass و Subclass

  • الكلاس الذي يرث من كلاس آخر يسمى Subclass و يسمى أيضاً derived classextended class أو child class ).
  • الكلاس الذي يورث محتوياته لكلاس آخر يسمى Superclass و يسمى أيضاً base class أو parent class ).

مثال

الآن لنفترض أننا قمنا بتعريف كلاس إسمه A يحتوي على متغير إسمه x و دالة إسمها ()printA.
بعدها قمنا بإنشاء كلاس جديد فارغ إسمه B و قلنا أنه يرث من الكلاس A. إذاً هذا يعني أن الكلاس B أصبح يملك نسخة من جميع المتغيرات و الدوال الموجودة في الكلاس A.

الكلمة extends :

الكلمة extends تستخدم لجعل الكلاس يرث من كلاس آخر.

مكان وضع الكلمة extends : 

نضع الكلمة extends بعد إسم الكلاس, ثم نضع بعدها إسم الكلاس الذي نريد الوراثة منه.
الكود التالي يعني أن الكلاس B يرث من الكلاس A.

} class A

{

} class B extends A

{

*في حال كنت تحاول الوراثة من كلاس غير موجود سيظهر لك الخطأ التالي: java.lang.ExceptionInInitializerError

مثال 2 :

الآن لنفترض أننا قمنا بتعريف كلاس إسمه A يحتوي على متغير إسمه x و دالة إسمها printA(). بعدها قمنا بإنشاء كلاس جديد فارغ إسمه B و قلنا أنه يرث من الكلاس A. إذاً هذا يعني أن الكلاس B أصبح يملك نسخة من جميع المتغيرات و الدوال الموجودة في الكلاس A.

بعد إنشاء هذا الكلاس, سنقوم بإنشاء الكلاس Main لتجربته.

} public class A
;public int x
} ()public void printA
;(“System.out.println(“I am from class A
{
{

} public class B extends A
//هنا قلنا أن الكلاس A يرث المتغيرات و الدوال الموجودة في الكلاس B
// إذاً أي كائن من الكلاس A سيحتوي المتغيرات و الدوال الموجودة في الكلاس B
{

} public class Main
} (public static void main(String[] args

;()B b = new B
// هنا قمنا بإنشاء كائن من الكلاس A لنتأكد إذا كان يحتوي على العناصر الموجودة في الكلاس B ام لأ

;()b.printA
// هنا قمنا باستدعاء الدالة ()printA التي ورثها الكلاس B من A

//و بما أن الكائن b يمتك متغير إسمه x أيضاً , يمكننا إعطائه قيمة و عرض قيمته.
;b.x = 123
;(System.out.println(“x: ” +b.x
{
{

سنحصل على النتيجة التالية عند التشغيل.

I am from class A
x: 123

*جافا لا تدعم تعدد الوراثة كما يوجد في بعض لغات البرمجة الأخرى, أي لا يمكن للكلاس الواحد الوراثة في نفس الوقت من أكثر من كلاس.
إذاً الكلاس الوحد لا يمكنه أن يفعل extends لأكثر من كلاس , بمعنى أن كل كلاس يمكنه وراثة كلاس واحد.