استارت‌آپ و کارآفرینی

آموزش قدم به قدم جاوا – قسمت چهاردهم

در این قسمت با مفهوم Overloading یا سربارگذاری آشنا خواهیم شد.

سربارگذاری متدها (Method Overloading)

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

گاهی اوقات نیاز داریم که در یک کلاس چند متد با نام یکسان داشته باشیم. در جاوا قابلیتی به نام سربارگذاری متد وجود دارد که به ما اجازه می‌دهد دو یا چند متد با نام یکسان اما با تعداد یا نوع پارامترهای مختلف داشته باشیم.

مثال:

public class Printer {
	
	public void print(String text) {
		System.out.println(text);
	}
	
	public void print(String text, int count) {
		for (int i = 0; i < count; i++) {
			System.out.println(text);
		}
	}
	
}

در این کلاس دو متد Overload شده به نام print داریم که اولی مقدار پارامتر خود را در کنسول چاپ می‌کند و دومی دو پارامتر به نام‌های text و count دریافت می‌کند و مقدار text را به تعداد count چاپ می‌کند.

همانطور که دیدید نام این دو متد دقیقا با هم یکسان است اما در تعداد پارامتر با هم تفاوت دارند. وقتی یکی از این دو متد در برنامه فراخوانی شود کامپایلر از تعداد پارامترهای ورودی به متد متوجه می‌شود که منظور برنامه نویس کدام متد print بوده است.

نکته: متدهای Overloadشده الزاما نباید تعداد پارامترهای متفاوت باهم داشته باشند. متدهای Overload شده می‌توانند همگی به تعداد یکسان پارامتر داشته باشند اما در این صورت نوع داده پارامترهای آن‌ها باید با هم متفاوت باشد. مثلا کد قبل را می‌توان به شکل زیر نوشت:

public class Printer {
	
	public void print(String text) {
		System.out.println(text);
	}
	
	public void print(char text) {
		System.out.println(text);
	}
	
}

نکته: متدهای Overload شده می‌توانند نوع داده برگشتی متفاوتی باهم داشته باشند.

سربارگذاری سازنده‌ها (Constructor Overloading)

سربارگذاری سازنده‌ها این امکان را به ما می‌دهد تا چند سازنده در یک کلاس داشته باشیم. شرط وجود چند سازنده در یک کلاس هم مانند متدها، داشتن تعداد یا نوع پارامتر متفاوت برای هر سازنده می‌باشد.

مثال:

public class Printer {
	private boolean isOn;
	private String model;
	private int numberOfPapers;
	
	public Printer(boolean isOn) {
		this.isOn = isOn;
	}
	
	public Printer(boolean isOn, String model) {
		this.isOn = isOn;
		this.model = model;
	}
	
	public Printer(boolean isOn, String model, int numberOfPapers) {
		this.isOn = isOn;
		this.model = model;
		this.numberOfPapers = numberOfPapers;
	}
}

در این کلاس سه سازنده داریم که می‌توانیم هنگام ایجاد شی از این کلاس از یکی از این سازنده‌ها استفاده کنیم.

اگر به کد سازنده‌های دوم و سوم دقت کنید می‌بینید که کد سازنده‌های قبلی در آن‌ها تکرار شده است. برای جلوگیری از این کار می‌توانیم به شکل زیر عمل کنیم:

public class Printer {
	private boolean isOn;
	private String model;
	private int numberOfPapers;
	
	public Printer(boolean isOn) {
		this.isOn = isOn;
	}
	
	public Printer(boolean isOn, String model) {
		this(isOn); // Calls Printer(boolean isOn)
		this.model = model;
	}
	
	public Printer(boolean isOn, String model, int numberOfPapers) {
		this(isOn, model); // Calls Printer(boolean isOn, String model)
		this.numberOfPapers = numberOfPapers;
	}
}

همانطور که در سازنده‌های دوم و سوم می‌بینید و در کامنت هم نوشته شده است با عبارت this() می‌توانیم سازنده‌های دیگر را فراخوانی کنیم (با کاربرد دیگر عبارت this که برای دسترسی به فیلدهای کلاس به‌کار می‌رود در قسمت قبل آشنا شدید)

مثلا در سازنده سوم دو پارامتر isOn و model را به سازنده دومی دادیم تا آن‌ها را به فیلدهای مربوطه نسبت دهد.

4 نظرات
  1. فامیلاکالا می گوید

    آقای مصطفی نصیری، خیلی خوبه که با قدرت این آموزش رو ادامه میدید. هرچند من خودم زیاد علاقه به این کار ندارم و میخوام به سمت دیزاین و فرانتند برم. موفق باشی.

    1. مصطفی نصیری می گوید

      ممنون از لطف شما. شما هم موفق باشید.

  2. iman313 می گوید

    اقا واقعا اموزش هاتون معرکه است خدا خیرتون بده که رایگان هم قرار میدید .
    شماکه حرفه ای هستید تروخدا ادامه بدید جاوا رو

  3. محمد علی خاصه پز می گوید

    این کاربورد this رو نمی دونستم و برام جالب بود . یک سوال توی زبان های دیگه هم مثل زبان #C هم این کار بورد هست ؟؟؟

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.