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

super در Java

داخل سازندهٔ فرزند با super سازندهٔ والد را اول اجرا کنید. Truck extends Car را نگه دارید. در Truck() بنویسید super(); بعد truck را چاپ کنید. در Car() مقدار car را چاپ کنید. Yard.java را ترجمه کنید و java Yard را اجرا کنید. صفحه باید اول car بعد truck را نشان دهد. دموی دوم با super("car") یک علامت به Car(String mark) می‌دهد. بازنویسی متد را برای صفحهٔ بعد بگذارید — این درس ترتیب سازنده‌ها با super است.

اول سازندهٔ والد را صدا بزنید

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

Yard super then truck print

java
class Car {
    Car() {
        System.out.println("car");
    }
}

class Truck extends Car {
    Truck() {
        super();
        System.out.println("truck");
    }
}

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

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

با super یک مقدار به والد بدهید

برنامهٔ دوم extends را نگه می‌دارد. سازندهٔ والد حالا String mark می‌گیرد و همان علامت را چاپ می‌کند. فرزند super("car") را صدا می‌زند و بعد truck چاپ می‌کند.

Yard super with mark argument

java
class Car {
    Car(String mark) {
        System.out.println(mark);
    }
}

class Truck extends Car {
    Truck() {
        super("car");
        System.out.println("truck");
    }
}

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

با javac Yard.java ترجمه کنید، بعد java Yard را اجرا کنید. صفحه دوباره اول car بعد truck را نشان می‌دهد. این‌بار car آرگومانی است که با super("car") دادید، نه چاپ ثابت داخل یک Car() بدون آرگومان. فرزند رشتهٔ علامت را انتخاب کرد؛ سازندهٔ والد آن را چاپ کرد. بعد فرزند truck را چاپ کرد.
امضای سازندهٔ والد را یک‌بار دیگر بخوانید: Car(String mark). رشتهٔ داخل گیومه در super("car") همان mark است. برای این بررسی چیز دیگری را عوض نکنید — extends Car بماند، چاپ truck در فرزند بماند، و new Truck() در main بماند. صفحه هنوز زیر car مقدار truck را می‌آورد چون چاپ فرزند فقط بعد از برگشت super("car") اجرا می‌شود.
اگر super("car") را ننویسید در حالی که Car فقط Car(String mark) دارد، javac رد می‌کند، چون والد دیگر سازندهٔ بی‌صدا بدون آرگومان ندارد که خودش صدا بزند. نوشتن super(...) جور همان‌طور است که فرزند والد را با مقادیر لازم شروع می‌کند. super را اولین دستور داخل Truck() نگه دارید. اگر javac از نبود سازندهٔ پیش‌فرض روی Car شکایت کرد، اول سازندهٔ فرزند را ببینید و مطمئن شوید سطر super("car") هست و هنوز اول است.

مقایسه با extends سادهٔ صفحهٔ horn

در صفحهٔ وراثت یک Truck خالی بدون نوشتن سازنده horn را صدا زد. در این صفحه سازنده‌ها با super به ترتیب اجرا می‌شوند. دموهای horn را اگر نزدیک‌اند به‌عنوان تاریخ نگه دارید؛ فایل تدریس super را با java Yard اجرا کنید تا صفحه car بعد truck را نشان دهد.
صفحهٔ horn ثابت کرد extends یک متد را به‌اشتراک می‌گذارد. این صفحه ثابت می‌کند extends مسیر ساخت را هم به‌اشتراک می‌گذارد: فرزند با super والد را شروع می‌کند، بعد با چاپ خودش ادامه می‌دهد. هر دو درس Truck extends Car را نگه می‌دارند. فقط بدنهٔ Truck عوض می‌شود — از آکولاد خالی با صدای بعدی horn، به سازنده‌ای که با super شروع می‌شود.
توکن‌های تازه super()، super("car")، و ترتیب سازنده‌اند. هنوز به extends نیاز دارید. هنوز لازم نیست متدی را بازنویسی کنید. اگر فراخوانی باقی‌ماندهٔ horn هنوز در main هست، برای این دموها حذفش کنید تا صفحه فقط چاپ سازنده‌ها را نشان دهد.

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

این صفحه سازنده‌های والد را با super اجرا می‌کند. صفحهٔ بعد override را نشان می‌دهد، جایی که فرزند نسخهٔ خودش از متدی را می‌نویسد که والد از قبل دارد. اینجا با فراخوانی super در سازنده بمانید. هنوز لازم نیست horn را روی Truck عوض کنید.
وقتی بعداً متدی را بازنویسی می‌کنید، اغلب هنوز اول سازندهٔ والد را با super صدا می‌زنید. این صفحه را نیمهٔ سازندهٔ همان داستان بدانید. هر دو دموی Yard را تا وقتی car بعد truck خودکار به نظر برسد تمام کنید، بعد درس override را باز کنید.

قبل از override

می‌توانید super(); را صدا بزنید بعد truck چاپ کنید و اول car را ببینید. می‌توانید وقتی والد mark می‌گیرد super("car") را صدا بزنید و باز car بعد truck را ببینید. برای هر دموی نگهداشته Yard.java را ترجمه کنید و java Yard را اجرا کنید. سازندهٔ والد قبل از چاپ فرزند تمام شد. صفحهٔ بعد override است، جایی که فرزند بدنهٔ یک متد را عوض می‌کند.
دموی super() بدون آرگومان را برای ترتیب روشن نگه دارید. دموی super("car") را برای پاس آرگومان روشن نگه دارید. بازنویسی متد را از این صفحه بیرون بگذارید. این سه عادت ایست بازرسی قبل از جلو رفتن‌اند. وقتی بعد از new Truck() مقدار car بالای truck می‌آید، super کار این درس را کرده و برای موضوع بعدی دربارهٔ override آماده‌اید.
یک‌بار آخر پوشه را ببینید: یک Yard عمومی، دو نوع کمکی، بدون انتظار صفحه‌کلید، بدون باقی‌ماندهٔ path، بدون اجبار به بازنویسی horn. یک‌بار دیگر روی دموی باز javac Yard.java و java Yard را اجرا کنید. اگر صفحه هنوز car بعد truck چاپ می‌کند، ترتیب سازنده محکم است و دوره می‌تواند در صفحهٔ بعد به override برود.

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

آماده شروع

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

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

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

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

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