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

بازنویسی متد در Java

یک متد والد را روی فرزند بازنویسی کنید تا فراخوانی بدنهٔ فرزند را اجرا کند. Truck extends Car را نگه دارید. روی Car متد horn را نگه دارید تا beep چاپ کند. روی Truck دوباره horn را بنویسید تا honk چاپ کند. در Yard.java یک Truck بسازید و t.horn() را صدا بزنید. با javac Yard.java ترجمه کنید و java Yard را اجرا کنید. صفحه باید honk را نشان دهد. دموی دوم یک Car ساده هم می‌سازد تا beep از والد و honk از فرزند را بشنوید. interface را برای صفحهٔ بعد بگذارید — این درس یک نام متد با دو بدنه است.

horn را روی فرزند بازنویسی کنید

صفحهٔ وراثت Truck را خالی گذاشت تا t.horn() همان beep والد را نگه دارد. صفحهٔ super سازنده‌ها را با super اجرا کرد. این صفحه بدنهٔ متد را روی فرزند عوض می‌کند. فایل Yard.java را باز کنید. نام کلاس عمومی را Yard نگه دارید. چاپ‌های فقط‌سازندهٔ car و truck اگر داستان متد را دفن می‌کنند، دموهای مسیر باقی‌مانده، نویسنده‌های Store، و هر Scanner صفحه‌کلید را پاک کنید. برنامه نباید منتظر تایپ بماند. به سطر import نیاز ندارید.
والد را با یک متد نمونه اعلام کنید که beep چاپ کند:
class Car {
void horn() {
System.out.println("beep");
}
}
فرزند را با extends Car اعلام کنید. داخل Truck همان نام متد را دوباره بنویسید، اما honk چاپ کنید:
void horn() {
System.out.println("honk");
}
نام یکسان و فهرست پارامتر خالی یکسان یعنی نسخهٔ فرزند برای اشیای Truck جایگزین نسخهٔ والد می‌شود. شما یک متد بی‌ربط دوم اضافه نمی‌کنید. شما horn را override می‌کنید.
داخل Yard.main یک truck بسازید و متد را صدا بزنید:
Truck t = new Truck();
t.horn();
فراخوانی بدنه‌ای را اجرا می‌کند که روی Truck نوشته شده، پس صفحه honk چاپ می‌کند.

Yard Truck overrides horn to honk

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

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

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

از پوشه‌ای که Yard.java را نگه می‌دارد javac Yard.java را اجرا کنید. وقتی پرانتز، آکولاد و نقطه‌ویرگول درست باشند، javac سطر خروجی خودش نمی‌نویسد. بعد java Yard را اجرا کنید — نه java Yard.java. پسوند .java را از دستور اجرا بردارید. یک کلاس عمومی در فایل بگذارید تا نام با Yard یکی باشد. نوع‌های کمکی Car و Truck در این شکل مبتدی بدون public می‌مانند.
صفحه honk را نشان می‌دهد. یک‌بار اجرا را قدم‌به‌قدم ببینید. Java از Yard.main شروع می‌کند. new Truck() یک truck می‌سازد. t.horn() به نوع واقعی t نگاه می‌کند. چون Truck horn خودش را نوشته، همان بدنهٔ فرزند اجرا می‌شود و honk چاپ می‌کند. بدنهٔ beep والد روی Car می‌ماند و برای این فراخوانی truck استفاده نمی‌شود.
اگر هنوز beep می‌بینید، بررسی کنید آیا Truck واقعاً متد horn دارد. یک Truck خالی از صفحهٔ وراثت هنوز beep را ارث می‌برد. برای override باید متد فرزند با همان نام حاضر باشد. اگر هنوز از دموی سازنده car بعد truck می‌بینید، به فایل تدریس override برگردید و دوباره java Yard را اجرا کنید.
قانون را بلند بگویید وقتی صفحه را می‌بینید: همان نام متد روی فرزند، بدنهٔ فرزند برای آن شیء برنده است. extends Car را نگه دارید تا Truck نوعی از Car بماند. بدون extends، یک horn روی Truck داستان نوع جدا می‌شد، نه override متد والد.
در این صفحه فایل interface اختراع نکنید. interface برای درس بعدی است. امروز یک سلسله‌مراتب کلاس دو بدنهٔ horn دارد و بدنهٔ فرزند به فراخوانی روی truck جواب می‌دهد.

beep والد و honk فرزند کنار هم

برنامهٔ دوم override را نگه می‌دارد. main هم یک Car و هم یک Truck می‌سازد، بعد روی هر کدام horn را صدا می‌زند. والد هنوز beep چاپ می‌کند. فرزند هنوز honk چاپ می‌کند.

Yard Car beep and Truck honk

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

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

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

با javac Yard.java ترجمه کنید، بعد java Yard را اجرا کنید. صفحه اول beep بعد honk را نشان می‌دهد. سطر اول از شیء Car می‌آید. سطر دوم از شیء Truck می‌آید. بازنویسی روی فرزند متد والد را برای اشیای والد پاک نمی‌کند. هر شیء بدنه‌ای را به کار می‌برد که مال نوع خودش است.
دو متد horn را یک‌بار دیگر بخوانید. نام یکسان. فهرست پارامتر خالی یکسان. متن چاپ متفاوت. همان‌سانی امضا است که نسخهٔ فرزند را override می‌کند، نه یک متد بی‌ربط تازه. اگر نام متد فرزند را عوض کنید، وراثت دوباره beep را روی truck نگه می‌دارد و دیگر override تدریس نمی‌کنید.
اگر دموهای سازنده با super() هنوز در پوشه هستند، به‌عنوان تاریخ نگه دارید. برای این درس فایل تدریس override را اجرا کنید تا صفحه چاپ متد نشان دهد، نه واژه‌های ترتیب سازنده. اگر javac از کلاس عمومی تکراری شکایت کرد، هنوز بیش از یک کلاس عمومی در فایل دارید — فقط Yard را public نگه دارید.

بدنهٔ والد در برابر بدنهٔ فرزند

📊 Who prints what for horn

Role horn body
Parent Car prints beep
Child Truck prints honk (overrides)
جدول نقشهٔ کوتاه این صفحه است. اگر فقط وراثت باشد و فرزند خالی بماند، beep روی هر دو نقش می‌ماند. بعد از override، سطر فرزند به honk عوض می‌شود در حالی که سطر والد beep می‌ماند. وقتی دموی دوم هر دو سطر را چاپ می‌کند این نقشه را در ذهن نگه دارید.

مقایسه با extends خالی و با super

در صفحهٔ وراثت، Truck خالی horn والد را نگه داشت و beep چاپ کرد. در صفحهٔ super، سازنده‌ها با super اجرا شدند و car بعد truck چاپ شد. در این صفحه خود متد روی فرزند عوض می‌شود. هنوز به extends نیاز دارید. بعداً هنوز می‌توانید سازنده به کار ببرید. هنوز به interface نیاز ندارید.
اگر هنوز یک Truck خالی باز است، قبل از قضاوت دربارهٔ صفحه، horn فرزندی را اضافه کنید که honk چاپ کند. اگر هنوز فایل سازنده باز است، به فایل override بروید تا t.horn() فراخوانی زیر آزمون باشد. توکن‌های تازه متد بازنویسی‌شده روی فرزند و دو واژهٔ متفاوت صفحهٔ beep و honk هستند.

قبل از interface

می‌توانید horn را روی Truck بازنویسی کنید و از t.horn() مقدار honk ببینید. می‌توانید هم c.horn() و هم t.horn() را صدا بزنید و beep بعد honk را ببینید. برای هر دموی نگهداشته Yard.java را ترجمه کنید و java Yard را اجرا کنید. بدنهٔ فرزند به فراخوانی truck جواب داد. صفحهٔ بعد interface است، جایی که یک نوع می‌تواند متدها را بدون تکیهٔ تنها به extends وعده بدهد.
دموی تک‌truck با honk را برای override روشن نگه دارید. دموی دو شیء را برای تضاد روشن والد در برابر فرزند نگه دارید. فایل‌های interface را از این صفحه بیرون بگذارید. این سه عادت ایست بازرسی قبل از جلو رفتن‌اند. وقتی بعد از t.horn() مقدار honk می‌آید و بعد از c.horn() هنوز beep می‌آید، override کار این درس را کرده و برای موضوع بعدی دربارهٔ interface آماده‌اید.
یک‌بار آخر پوشه را ببینید: یک Yard عمومی، دو نوع کمکی، یک horn فرزند که honk چاپ می‌کند، بدون انتظار صفحه‌کلید، بدون اجبار به interface. یک‌بار دیگر روی دموی باز javac Yard.java و java Yard را اجرا کنید. اگر صفحه هنوز با جدول جور است — والد beep، فرزند honk — override محکم است و دوره می‌تواند در صفحهٔ بعد به interface برود.

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

آماده شروع

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

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

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

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

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