وراثت در Java
با extends یک نوع فرزند بسازید تا بتواند متدی را که روی والد نوشته شده به کار ببرد. روی Car متد horn را بگذارید تا beep چاپ کند. بنویسید class Truck extends Car. در Yard.java یک Truck بسازید و t.horn() را صدا بزنید. با javac Yard.java ترجمه کنید و java Yard را اجرا کنید. صفحه باید beep را نشان دهد. دموی دوم یک Car ساده هم میسازد تا ببینید بعد از وجود فرزند، والد هنوز کار میکند. super را برای صفحهٔ بعد بگذارید. در این صفحه horn را روی Truck دوباره ننویسید — override بعداً میآید.
فرزند متد والد را نگه میدارد
صفحهٔ paths مکانها را با Paths.get نام برد. این صفحه ماژول تازه را شروع میکند: یک کلاس میتواند فرزند کلاس دیگر باشد. فایل تدریس را با نام Yard.java باز کنید. نام کلاس عمومی را Yard نگه دارید تا با نام فایل یکی باشد. دموهای مسیر باقیماندهٔ Route، نویسندههای Store، scannerهای Reader، و هر Scanner صفحهکلید را پاک کنید. برنامه نباید منتظر تایپ بماند. برای این درس به سطر import نیاز ندارید.
بالای کلاس عمومی، نوع والد package-private را اعلام کنید:
class Car {
داخل Car یک متد نمونه void horn() بنویسید که beep چاپ کند:
System.out.println("beep");
بعد فرزند را اعلام کنید:
class Truck extends Car {
بدنهٔ Truck را در این صفحه خالی نگه دارید. فرزند horn را بازنویسی نمیکند. آکولاد خالی کافی است تا بگوید Truck نوعی از Car است.
داخل Yard.main یک truck بسازید و متد ارثی را صدا بزنید:
Truck t = new Truck();
t.horn();
فراخوانی کار میکند چون extends Car نوع Truck را به Car وصل میکند. شما horn را داخل Truck کپی نکردید.
class Car {
void horn() {
System.out.println("beep");
}
}
class Truck extends Car {
}
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 میمانند. گذاشتن سه کلاس عمومی در یک فایل باعث رد شدن javac میشود — همان قاعدهٔ صفحهٔ classes را نگه دارید.
صفحه beep را نشان میدهد. یکبار اجرا را راه بروید. Java از Yard.main شروع میکند. new Truck() شیء truck میسازد. t.horn() از راه وراثت horn را روی والد Car پیدا میکند. متد beep چاپ میکند. اگر javac بگوید روی Truck نماد horn نیست، خط extends Car نیست یا غلط املا شده — برگردانیدش. اگر note.txt یا چاپ مسیر میبینید، باقیماندهٔ Route هنوز اجرا میشود — به java Yard بروید. اگر ترمینال منتظر تایپ بماند، باقیماندهٔ Scanner صفحهکلید هنوز در فایل است — پاکش کنید.
extends را با دقت بنویسید. ویرگول یا واژهٔ اشتباه implements این درس نیست. وراثت اینجا همان کلیدواژهٔ extends بین نام فرزند و والد است. نام فرزند اول میآید: Truck extends Car، نه برعکس.
در این صفحه super ننویسید. صدا زدن سازندهٔ والد با super درس بعد است. داخل Truck هم horn دوم ننویسید؛ داستان override بعداً میآید. امروز فرزند خالی میماند و هنوز از متد والد استفاده میکند. آن بدنهٔ خالی تدریس عمدی است، نه اشتباهی که با کپی کردن horn داخل Truck «درست» شود.
📊 Parent and child on this page
| Piece | Role |
|---|---|
| Car | parent type that owns horn |
| Truck | child type via extends Car |
| Yard | public starter with main |
| horn | prints beep; written only on Car |
والد هنوز بهتنهایی کار میکند
برنامهٔ دوم همان Car، همان Truck extends Car خالی، و همان Yard عمومی را نگه میدارد. داخل main هم یک Car و هم یک Truck بسازید و روی هر کدام horn را صدا بزنید.
class Car {
void horn() {
System.out.println("beep");
}
}
class Truck extends Car {
}
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 و بعد دوباره beep را نشان میدهد. خط اول از Car ساده میآید. خط دوم از Truckی میآید که horn را به ارث برده است. ساختن فرزند نوع والد را پاک یا خراب نکرد. هر دو شیء میتوانند همان بدنهٔ متدی را که یکبار روی Car نوشته شده صدا بزنند. هنوز هر شیء را خودتان با new میسازید؛ خط extends خودش truck نمیسازد.
آن تضاد ایست بازرسی است. وراثت مسیر فرزندی به یک متد موجود اضافه میکند. مجبور نیستید والد را حذف کنید. اگر extends Car را از Truck بردارید، t.horn() ترجمه نمیشود، چون Truck دیگر horn را نمیگیرد. برای فرزند تدریس extends را نگه دارید. وقتی یک beep آرام میخواهید فایل تکtruck را ترجیح دهید. وقتی میخواهید ثابت کنید والد هنوز جواب میدهد فایل دوشیء را ترجیح دهید.
مقایسه با paths روی Route
در صفحهٔ paths، java Route پوشه و فایل را نام برد. در این صفحه، java Yard نوعها را با extends وصل میکند. اگر فایلهای Route هنوز نزدیکاند فقط بهعنوان تاریخ نگه دارید؛ برای دموهای وراثت با java Yard اجرا کنید تا صفحه با این درس یکی باشد.
extends، استفادهٔ دوباره از متد والد، و بدنهٔ خالی فرزند نشانههای تازهاند. از قبل new و متدهای نمونه را از صفحات OOP میشناسید. امروز آن قطعهها برای اولینبار در این مسیر دوره با وراثت روبهرو میشوند. نامهای تدریس Car، Truck و Yard را نگه دارید تا فرمانهای ترجمه و اجرا کوتاه و روشن بمانند.
این صفحه برای super چه میگذارد
این صفحه فرزندی را نشان میدهد که بدون نوشتن super از متد والد استفاده میکند. صفحهٔ بعد super را معرفی میکند تا فرزند عمداً با والد حرف بزند، بهویژه دور سازندهها. اینجا روی extends و فراخوانی ارثی horn بمانید. هنوز super() را بهعنوان الزام روی این دموهای Yard اضافه نکنید.
پیش از super
میتوانید Truck extends Car بنویسید، یک Truck بسازید، و از horn مقدار beep ببینید. میتوانید یک Car ساده هم بسازید و ببینید والد هنوز beep چاپ میکند. Yard.java را ترجمه کنید و برای هر دموی نگهداشتهشده java Yard را بهنوبت اجرا کنید. فرزند خالی ماند و هنوز از متد والد استفاده کرد. صفحهٔ بعد super است، جایی که فرزند مستقیمتر با والد حرف میزند.
دموی تکtruck را برای فراخوانی ارثی روشن نگه دارید. دموی دوشیء را برای اثبات کار کردن خودِ والد نگه دارید. فعلاً super را از این صفحه دور نگه دارید. این سه عادت ایست بازرسی پیش از ادامه است. وقتی از Truckی که هرگز horn خودش را ننوشته beep ظاهر شد، وراثت کارش را برای این درس تمام کرده و برای موضوع بعدی دربارهٔ super آمادهاید.
🧠 دانش خود را بیازمایید
دانش خود را بیازمایید
خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کردهاید
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود