در حال بارگذاری...

کلاس‌های abstract در Java

وقتی والد باید حداقل یک متد را بدون بدنه برای فرزندها بگذارد، کلاس والد را abstract علامت بزنید. بنویسید abstract class Machine با abstract void horn(); و متد عادی park که park چاپ می‌کند. بنویسید class Truck extends Machine و به horn بدنه‌ای بدهید که honk چاپ کند. در Yard.java یک Truck بسازید، t.horn() را صدا بزنید، بعد t.park() را صدا بزنید. با javac Yard.java ترجمه کنید و java Yard را اجرا کنید. صفحه باید اول honk بعد park را نشان دهد. دموی دوم Car را اضافه می‌کند تا دو فرزند هر کدام horn را جور دیگری پر کنند. polymorphism را برای صفحهٔ بعد بگذارید — این درس متد ناتمام والد و فرزندی است که آن را تمام می‌کند.

متد abstract را روی فرزند پر کنید

صفحهٔ enum نام‌های ثابت فهرست کرد. این صفحه عمداً یک متد را ناتمام می‌گذارد. فایل Yard.java را باز کنید. نام کلاس عمومی را Yard نگه دارید. دموهای باقی‌ماندهٔ enum Level اگر داستان abstract را دفن می‌کنند، فایل‌های Signal / implements، دموهای مسیر، و هر Scanner صفحه‌کلید را پاک کنید. برنامه نباید منتظر تایپ بماند. به سطر import نیاز ندارید.
والد abstract را بالای نوع‌های دیگر اعلام کنید:
abstract class Machine {
abstract void horn();
void park() {
System.out.println("park");
}
}
متد abstract با نقطه‌ویرگول تمام می‌شود و بدنهٔ { } ندارد. متد عادی park بدنهٔ کامل نگه می‌دارد تا هر فرزند بتواند بازاستفاده‌اش کند.
فرزند را با extends Machine اعلام کنید. horn را پر کنید:
void horn() {
System.out.println("honk");
}
باید هر متد abstract فهرست‌شده روی والد را پر کنید. در این صفحه فقط horn است. در main ننویسید new Machine() — کلاس abstract به‌تنهایی به‌عنوان شیء ساخته نمی‌شود.
داخل Yard.main:
Truck t = new Truck();
t.horn();
t.park();
فراخوانی اول بدنهٔ روی Truck را اجرا می‌کند. فراخوانی دوم بدنهٔ مشترک روی Machine را اجرا می‌کند.

Yard Truck fills abstract horn then park

java
abstract class Machine {
    abstract void horn();
    void park() {
        System.out.println("park");
    }
}

class Truck extends Machine {
    void horn() {
        System.out.println("honk");
    }
}

public class Yard {
    public static void main(String[] args) {
        Truck t = new Truck();
        t.horn();
        t.park();
    }
}

از پوشه‌ای که Yard.java را نگه می‌دارد javac Yard.java را اجرا کنید. وقتی پرانتز، آکولاد و نقطه‌ویرگول درست باشند، javac سطر خروجی خودش نمی‌نویسد. بعد java Yard را اجرا کنید — نه java Yard.java. پسوند .java را از دستور اجرا بردارید. یک کلاس عمومی در فایل بگذارید تا نام با Yard یکی باشد. نوع‌های کمکی Machine و Truck در این شکل مبتدی بدون public می‌مانند.
صفحه اول honk بعد park را نشان می‌دهد. یک‌بار اجرا را قدم‌به‌قدم ببینید. Java از Yard.main شروع می‌کند. new Truck() یک truck می‌سازد که horn abstract را تمام کرده. t.horn() مقدار honk چاپ می‌کند. t.park() مقدار park را از بدنهٔ والدی چاپ می‌کند که از قبل بود. متد ناتمام فقط به‌عنوان الزام ماند تا فرزند بدنه را نوشت.
اگر javac رد کرد، سه چیز را چک کنید. اول، سطر کلاس والد باید بگوید abstract class Machine. دوم، متد ناتمام باید abstract بگوید و با ; تمام شود. سوم، Truck واقعاً باید horn را با بدنه بنویسد. اگر هنوز از فایل enum مقدار MEDIUM می‌بینید، به فایل تدریس abstract برگردید و دوباره java Yard را اجرا کنید. اگر new Machine() را امتحان کنید، javac رد می‌کند — در این صفحه همان انتظار می‌رود.
قانون را بلند بگویید وقتی صفحه را می‌بینید: والد abstract متد گم‌شده را نام می‌برد، فرزند آن را پر می‌کند، متدهای مشترک هنوز اجرا می‌شوند. هنوز رژهٔ طولانی polymorphism با متغیرهای typed والد اختراع نکنید. آن داستان برای درس بعدی است.

دو فرزند horn را جور دیگری پر می‌کنند

برنامهٔ دوم همان Machine abstract را نگه می‌دارد. Truck هنوز honk چاپ می‌کند. یک Car تازه beep چاپ می‌کند. main هر دو را می‌سازد، هر horn را صدا می‌زند، بعد park را روی truck صدا می‌زند.

Yard Truck and Car fill horn then park

java
abstract class Machine {
    abstract void horn();
    void park() {
        System.out.println("park");
    }
}

class Truck extends Machine {
    void horn() {
        System.out.println("honk");
    }
}

class Car extends Machine {
    void horn() {
        System.out.println("beep");
    }
}

public class Yard {
    public static void main(String[] args) {
        Truck t = new Truck();
        Car c = new Car();
        t.horn();
        c.horn();
        t.park();
    }
}

با javac Yard.java ترجمه کنید، بعد java Yard را اجرا کنید. صفحه اول honk، بعد beep، بعد park را نشان می‌دهد. هر فرزند همان نام abstract را با چاپ خودش پر کرد. بدنهٔ مشترک park هنوز از Machine می‌آید. هنوز هرگز new Machine() نمی‌نویسید.
والد را یک‌بار دیگر بخوانید: یک متد abstract، یک متد عادی. فرزندها را بخوانید: هر کدام horn می‌نویسند، هیچ‌کدام در این صفحه park را بازنویسی نمی‌کنند. همان شکاف نکتهٔ تدریس است. اگر روی Car متد horn را ننویسید در حالی که Car extends Machine است، javac رد می‌کند چون هر متد abstract باید پر شود.
اگر دموهای enum هنوز نزدیک‌اند، به‌عنوان تاریخ نگه دارید. برای این درس فایل تدریس abstract را اجرا کنید تا صفحه پر کردن متد نشان دهد، نه MEDIUM. اگر javac از کلاس عمومی تکراری شکایت کرد، فقط Yard را public نگه دارید.

مقایسه با enum و interface

در صفحهٔ enum، Level نام‌های ثابت فهرست کرد. در صفحهٔ interface، implements متدهای خالی interface را پر کرد. در این صفحه abstract class به‌همراه extends یک متد کلاس را ناتمام می‌گذارد تا فرزند بدنه را بنویسد. هنوز Yard.java را ترجمه می‌کنید و java Yard را اجرا می‌کنید. توکن‌های تازه abstract class، abstract void horn();، و فرزندی است که بدنه را می‌دهد و هم‌زمان park را بازاستفاده می‌کند.
اگر هنوز فایل enum Level باز است، ثابت‌ها و شاید switch می‌بینید. به فایل abstract بروید تا بالا abstract class Machine نشان دهد و main یک Truck بسازد. دموهای polymorphism که فقط متغیرهای typed والد را جابه‌جا می‌کنند از این صفحه بیرون بگذارید. ورودی صفحه‌کلید را از این صفحه بیرون بگذارید.

این صفحه برای polymorphism چه می‌گذارد

این صفحه متدهای abstract را روی فرزندهای عینی تمام می‌کند. صفحهٔ بعد polymorphism را نشان می‌دهد، جایی که یک متغیر typed والد می‌تواند اشیای فرزند متفاوت نگه دارد و بدنهٔ جور را صدا بزند. اینجا با والدهای abstract و فرزندهای پرشده بمانید. هنوز لازم نیست فهرستی از متغیرهای Machine که به چند فرزند اشاره می‌کنند الزامی کنید.
وقتی بعداً دموهای polymorphism می‌نویسید، اغلب هنوز از نام متد والد abstract یا عادی شروع می‌کنید. این صفحه را نیمهٔ متد ناتمام آن داستان همسایه بدانید. هر دو دموی Yard را تا وقتی honk بعد park — و بعد honk، beep، park — خودکار به نظر برسد تمام کنید، بعد درس polymorphism را باز کنید.

قبل از polymorphism

می‌توانید abstract class Machine اعلام کنید، horn را روی Truck پر کنید، و honk بعد park را ببینید. می‌توانید Car را با horn خودش اضافه کنید و honk، بعد beep، بعد park را ببینید. برای هر دموی نگهداشته Yard.java را ترجمه کنید و java Yard را اجرا کنید. فرزند متد abstract را تمام کرد. صفحهٔ بعد polymorphism است، جایی که فراخوانی از طریق ارجاع typed والد بدنهٔ فرزند را برمی‌گزیند.
دموی تک‌truck را برای پر کردن روشن abstract به‌علاوهٔ park مشترک نگه دارید. دموی دو فرزند را برای جفت روشن پر کردن نگه دارید. فایل‌های رژهٔ polymorphism را از این صفحه بیرون بگذارید. این سه عادت ایست بازرسی قبل از جلو رفتن‌اند. وقتی بعد از new Truck() مقدار honk قبل از park می‌آید، کلاس‌های abstract کار این درس را کرده و برای موضوع بعدی دربارهٔ polymorphism آماده‌اید.
یک‌بار آخر پوشه را ببینید: یک Yard عمومی، یک Machine abstract، فرزندهای عینی که horn را پر می‌کنند، بدون new Machine()، بدون انتظار صفحه‌کلید. یک‌بار دیگر روی دموی باز javac Yard.java و java Yard را اجرا کنید. اگر صفحه هنوز پر کردن‌هایی را که نوشتید چاپ می‌کند، قرارداد abstract محکم است و دوره می‌تواند در صفحهٔ بعد به polymorphism برود.

🧠 دانش خود را بیازمایید

آماده شروع

دانش خود را بیازمایید

خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کرده‌اید

❓
6
سوالات
🎯
70%
برای قبولی
♾️
∞
زمان
🔄
∞
تلاش‌ها

📝 دستورالعمل‌ها

  • هر سوال را با دقت بخوانید
  • بهترین پاسخ را برای هر سوال انتخاب کنید
  • می‌توانید آزمون را هر چند بار که می‌خواهید تکرار کنید
  • پیشرفت شما در بالا نمایش داده می‌شود