Programming Basics SQL HTML CSS JavaScript React Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Linux Learn Typing

Javaلة بسيطة و مترابطة تعلمك أساسيات التجريد

في المثال التالي قمنا بتعريف كلاس إسمه A, نوعه abstract, يملك متغير إسمه x, و دالة إسمها print().
بعدها سنقوم ببناء الكلاس Main لتجربة الكود.


المثال الأول

A.java
public abstract class A {     // إذاً لا يمكن إنشاء كائنات منه ,abstract نوعه A الكلاس
 
    int x;
 
    public void print() {
        System.out.println("This is just an example.");
    }
 
}

Main.java
public class Main {
 
    public static void main(String[] args) {
 
        A a = new A();     // Incompatible Type: abstraction.A is abstract; cannot be instantiated <-- [ سيظهر لك تحذير ]
 
    }
 
}

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

Exception in thread "main" java.lang.RuntimeException:
Uncompilable source code - abstraction.A is abstract; cannot be instantiated

سبب الخطأ هنا أننا حاولنا إنشاء كائن من كلاس نوعه abstract.

الآن سنقوم بإنشاء كلاس جديد إسمه B, يرث من الكلاس A.
بداخل الكلاس Main سننشئ كائن من الكلاس B لنحصل على الأشياء الموجودة في الكلاس A.


المثال الثاني

A.java
public abstract class A {
 
    int x;
 
    public void print() {
        System.out.println("This is just an example.");
    }
 
}

B.java
public class B extends A {     // إذاً سيرث كل شيء موجود فيه .A يرث من الكلاس B هنا قلنا أن الكلاس
 
}

Main.java
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 و سنقوم باستدعاء الدوال الجديدة التي قمنا بإضفاتها.


المثال الثالث

A.java
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 هنا قمنا بتعريف دالة نوعها
 
}

B.java
public class B extends A {     // abstract لأي دالة سيرثها من النوع Override يجب أن يفعل A يرث من الكلاس B بما أن الكلاس
 
    // setX() للدالة Override هنا فعلنا
    @Override
    public void setX(int x) {
        super.x = x;
    }
 
    // getX() للدالة Override هنا فعلنا
    @Override
    public int getX() {
        return super.x;
    }
 
}

Main.java
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