Javaلة بسيطة و مترابطة تعلمك أساسيات التجريد
في المثال التالي قمنا بتعريف كلاس إسمه A
, نوعه abstract
, يملك متغير إسمه x
, و دالة إسمها print()
.
بعدها سنقوم ببناء الكلاس Main
لتجربة الكود.
المثال الأول
public abstract class A { // إذاً لا يمكن إنشاء كائنات منه ,abstract نوعه A الكلاس int x; public void print() { System.out.println("This is just an example."); } }
public class Main { public static void main(String[] args) { A a = new A(); // Incompatible Type: abstraction.A is abstract; cannot be instantiated <-- [ سيظهر لك تحذير ] } }
سنحصل على النتيجة التالية عند التشغيل.
Uncompilable source code - abstraction.A is abstract; cannot be instantiated
سبب الخطأ هنا أننا حاولنا إنشاء كائن من كلاس نوعه abstract
.
الآن سنقوم بإنشاء كلاس جديد إسمه B
, يرث من الكلاس A
.
بداخل الكلاس Main
سننشئ كائن من الكلاس B
لنحصل على الأشياء الموجودة في الكلاس A
.
المثال الثاني
public abstract class A { int x; public void print() { System.out.println("This is just an example."); } }
public class B extends A { // إذاً سيرث كل شيء موجود فيه .A يرث من الكلاس B هنا قلنا أن الكلاس }
public class Main { public static void main(String[] args) { B b = new B(); // B هنا قمنا بإنشاء كائن من الكلاس b.print(); // A من الكلاس B التي ورثها الكلاس print() هنا قمنا باستدعاء الدالة b.x = 10; // A من الكلاس B الذي ورثه الكلاس x هنا قمنا بتغيير قيمة المتغير System.out.println("b.x contain: " + b.x); // x هنا قمنا بعرض قيمة المتغير } }
سنحصل على النتيجة التالية عند التشغيل.
This is just an example.
b.x contain: 10
إذاً بما أننا لا نستطيع إنشاء كائن مباشرةً من الكلاس A
, قمنا بإنشاء الكلاس B
بهدف وراثة الأشياء الموجودة في الكلاس A
, و بعدها أنشأنا كائن من الكلاس B
و تأكدنا أنه يحتوي على جميع الأشياء الموجودة في الكلاس A
.
الآن سنقوم بإضافة دالتين نوعهما abstract
في الكلاس A
, ثم سنفعل لهما Override في الكلاس B
.
بداخل الكلاس Main
سننشئ كائن من الكلاس B
و سنقوم باستدعاء الدوال الجديدة التي قمنا بإضفاتها.
المثال الثالث
public abstract class A { int x; public void print() { System.out.println("This is just an example."); } public abstract void setX(int x); // كل كلاس يرثها Override إذاً يجب أن يفعل لها <-- abstract هنا قمنا بتعريف دالة نوعها public abstract int getX(); // كل كلاس يرثها Override إذاً يجب أن يفعل لها <-- abstract هنا قمنا بتعريف دالة نوعها }
public class B extends A { // abstract لأي دالة سيرثها من النوع Override يجب أن يفعل A يرث من الكلاس B بما أن الكلاس // setX() للدالة Override هنا فعلنا public void setX(int x) { super.x = x; } // getX() للدالة Override هنا فعلنا public int getX() { return super.x; } }
public class Main { public static void main(String[] args) { B b = new B(); // B هنا قمنا بإنشاء كائن من الكلاس b.print(); // A من الكلاس B التي ورثها الكلاس print() هنا قمنا باستدعاء الدالة b.setX(55); // setX() عن طريق الدالة A من الكلاس B الذي ورثه الكلاس x هنا قمنا بتغيير قيمة المتغير System.out.println("b.x contain: " + b.getX()); // getX() عن طريق الدالة x هنا قمنا بعرض قيمة المتغير } }
سنحصل على النتيجة التالية عند التشغيل.
This is just an example.
b.x contain: 55