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

اضافه‌بار متد در Java

دو متد در یک کلاس بگذارید که هر دو نام paint داشته باشند. یک سر static void paint(String word) است. دیگری static void paint(int n) است. بدنه‌ها کوتاه‌اند: اولی word را چاپ می‌کند، دومی n را. از main صدا بزنید paint("ok"); و بعد paint(3);. صفحه باید دو خط نشان دهد: اول ok و بعد 3. Java متد دوم را تداخل حساب نمی‌کند. دو سر را متدهای جدا می‌بیند چون فهرست پارامترها فرق دارد. همین نام مشترک با فهرست‌های متفاوت کار این صفحه است.

یک نام، فهرست‌های متفاوت

تا اینجا هر ایدهٔ تازه نام متد تازه‌ای داشت: ring، greet، twice. اینجا عمداً نام همان paint می‌ماند. چیزی که عوض می‌شود بین پرانتز است. یک فهرست یک String دارد. فهرست دیگر یک int. کامپایلر هر دو را نگه می‌دارد چون این فهرست‌ها یکی نیستند.
یک برنامهٔ کوچک با نام Sign.java بسازید. public class روی خط اول باید با نام فایل یکی باشد: public class Sign. نام کلاس قدیمی Box یا Tip را در این فایل نگه ندارید؛ کامپایلر انتظار دارد نام کلاس و نام فایل جور باشند.
بیرون از main، هنوز داخل آکولاد کلاس، هر دو سرِ paint را بنویسید. روی این صفحه void را نگه دارید: هر بدنه چاپ می‌کند و چیزی لازم نیست از راه return به main برگردد. بدنهٔ اول System.out.println(word); است. بدنهٔ دوم System.out.println(n); است. قبل از کامپایل فایل را ذخیره کنید. برنامهٔ کامل اول در جعبهٔ بعدی است.

Sign.java با دو متد paint

این نسخه‌ای است که اول کامپایل می‌کنید. main دو صدا دارد. کلاس دو متد paint دارد که یک نام را شریک‌اند.

paint String and paint int

java
public class Sign {
    public static void main(String[] args) {
        paint("ok");
        paint(3);
    }

    static void paint(String word) {
        System.out.println(word);
    }

    static void paint(int n) {
        System.out.println(n);
    }
}

از پوشه‌ای که Sign.java آنجاست، javac Sign.java را اجرا کنید. وقتی پرانتز و آکولاد و نقطه‌ویرگول‌ها جور باشند، javac خودش خطی نمی‌نویسد. بعد java Sign را اجرا کنید — نه java Sign.java. پسوند .java را از فرمان دوم بردارید. همین دو فرمان در Windows و macOS کار می‌کند. برنامه باید دو خط چاپ کند و تمام شود: ok بعد 3. منتظر تایپ شما نمی‌ماند. اگر ترمینال منتظر ماند، هنوز nextLine از تمرین قدیمی داخل فایل است. آن را پاک کنید و دو صدای paint به‌همراه دو متد paint بالا را نگه دارید.
اجرا را یک‌بار به ترتیب ببینید. Java از main شروع می‌کند. اولین صدا paint("ok") است. آرگومان یک String است، پس Java بدنه‌ای را اجرا می‌کند که String word می‌گیرد و ok را چاپ می‌کند. دومین صدا paint(3) است. آرگومان یک int است، پس Java بدنه‌ای را اجرا می‌کند که int n می‌گیرد و 3 را چاپ می‌کند. هر دو بار نام paint یکی است. فهرست داخل پرانتز است که بدنه را انتخاب می‌کند.
اگر هر دو خط ok نشان دادند، شاید فقط متد String مانده و برای هر صدا یک کلمهٔ ثابت چاپ کرده‌اید. اگر هر دو خط 3 نشان دادند، شاید فقط متد int مانده. هر دو سر را نگه دارید. اگر javac بگوید paint از قبل تعریف شده، ببینید آیا هر دو سر یک فهرست دارند — مثلاً دو نسخه از paint(String word). اضافه‌بار به تفاوت واقعی در فهرست نیاز دارد، نه به کپی دوم همان سر فقط با نام پارامتر دیگر.

فهرست دوم با دو کلمه

تعداد پارامتر هم می‌تواند فرق کند. یک اضافه‌بار سوم اضافه کنید که دو مقدار String بگیرد و آن‌ها را با یک فاصله در یک خط چاپ کند. دو متد paint اول را سر جایشان بگذارید. شکل جدید را از main بعد از صداهای قبلی صدا بزنید، یا یک main تازه که فقط روی این شکل تمرکز دارد بنویسید تا یاد بگیرید.

paint two Strings

java
public class Sign {
    public static void main(String[] args) {
        paint("hi", "sam");
    }

    static void paint(String a, String b) {
        System.out.println(a + " " + b);
    }
}

بعد از ذخیره دوباره کامپایل و اجرا کنید: javac Sign.java، بعد java Sign. صفحه باید یک خط نشان دهد: hi sam. صدا دو آرگومان دارد. متد دو پارامتر دارد. همین جور بودن برای Java کافی است تا این بدنه را انتخاب کند. اگر هنوز paint(String word) و paint(int n) قبلی در همان کلاس باشند، می‌توانید نگهشان دارید. صدایی با دو مقدار String متد تک‌آرگومانی String را برنمی‌گزیند، چون تعداد فرق دارد.
وقتی برای تمرین هر سه اضافه‌بار را در یک فایل بگذارید، main می‌تواند هر شکل را در خط خودش صدا بزند. صدایی با یک String هنوز به paint(String word) می‌رود. صدایی با یک int هنوز به paint(int n) می‌رود. صدایی با دو String به paint(String a, String b) می‌رود. نام مشترک این تفاوت‌ها را پاک نمی‌کند.

فهرست خالی کنار فهرست String

متدی با پرانتز خالی هم فهرست متفاوتی است. می‌توانید paint() بدون پارامتر را کنار paint(String word) نگه دارید. صدای خالی paint(); بدنهٔ فهرست خالی را اجرا می‌کند. صدای paint("go"); بدنهٔ String را اجرا می‌کند.

paint empty and paint String

java
public class Sign {
    public static void main(String[] args) {
        paint();
        paint("go");
    }

    static void paint() {
        System.out.println("ready");
    }

    static void paint(String word) {
        System.out.println(word);
    }
}

بعد از javac Sign.java و java Sign، صفحه باید روی خط اول ready و روی خط دوم go نشان دهد. اولین صدا بین پرانتز چیزی ندارد، پس با paint() جور می‌شود. دومین صدا یک String می‌فرستد، پس با paint(String word) جور می‌شود. عوض کردن نام یکی به paintReady هم کامپایل می‌شود، ولی آن مهارت دیگری است. این صفحه نام paint را نگه می‌دارد و می‌گذارد فهرست‌ها تفاوت را حمل کنند.

کدام صدا کدام سر را اجرا می‌کند

صداها را کنار سرها بخوانید. فهرست آرگومان در صدا باید با فهرست پارامتر در سر جور باشد. روی این شکل مبتدی، هم نوع و هم تعداد مهم‌اند.

📊 call beside matching paint

صدا در main سری که اجرا می‌شود خط صفحه
paint("ok"); paint(String word) ok
paint(3); paint(int n) 3
paint("hi", "sam"); paint(String a, String b) hi sam
paint(); paint() ready

اشتباه رایج این است که دو متد بنویسید که هر دو بگویند paint(String word) و انتظار داشته باشید دومی اضافه‌بار حساب شود. فقط عوض کردن نام پارامتر به paint(String label) برای کامپایلر فهرست تازه نمی‌سازد. اینجا نوع و تعداد مهم‌اند. اشتباه دیگر صدا زدن paint(true) است وقتی هرگز فهرست پارامتر boolean ننوشته‌اید. آن‌وقت javac paint جور پیدا نمی‌کند. سری اضافه کنید که نوع موردنظر را بگیرد، یا صدا را به نوعی عوض کنید که از قبل پشتیبانی می‌کنید.
نوشتن System.out.println("paint"); در main کلمهٔ paint را چاپ می‌کند. هیچ متدی را صدا نمی‌زند. وقتی اضافه‌بارِ String را می‌خواهید، paint("ok"); را نگه دارید. ماندن متد twice از فایل قدیمی Box داخل Sign.java می‌تواند صفحه را گیج کند اگر main هنوز twice(7) چاپ کند. main را تا صداهای paint که دارید آزمایش می‌کنید خلوت کنید و فقط اضافه‌بارهای paint لازم برای همان اجرا را نگه دارید.
متد paint را داخل آکولاد main تو در تو ننویسید. متدها داخل کلاس، کنار main می‌نشینند. دو اضافه‌بار دو متد هم‌سطح در همان بدنهٔ کلاس‌اند.

قبل از scope

می‌توانید یک نام متد و چند فهرست پارامتر در همان کلاس نگه دارید. Java بدنه را از روی فهرست آرگومان صدا انتخاب می‌کند. صفحه خطِ بدنهٔ جور را نشان می‌دهد. دو سر با یک فهرست، اضافه‌بار نیستند. صفحهٔ بعد scope است؛ آنجا می‌بینید کدام نام‌ها داخل متد دیده می‌شوند و کدام بیرون می‌مانند.

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

آماده شروع

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

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

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

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

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