شی گرایی در زبان جاوا (متدهای سازنده و اعضای استاتیک)


شی گرایی در زبان جاوا (متدهای سازنده و اعضای استاتیک)
برای خرید این درس نیاز است وارد سایت شوید. در صورت نداشتن حساب کاربری عضو شوید.

متدهای سازنده
در هر کلاس امکان تعریف متدی به نام متد سازنده وجود دارد.
در واقع متد های سازنده رفتاری شبیه به متد های Setter دارند؛و کارشان بیشتر این است که در لحظه‌ی تولید یا بوجود آمدن اشیاء و نمونه های کلاس، اعضای خصوصی آن را مقدار دهی کنند؛ اگر ما نیاز داشته باشیم در لحظه‌ی به وجود آمدن نمونه ای از کلاس به فیلد های داده ای آن مقدار بدهیم، شاید بهترین زمان برای این کار استفاده از متد های سازنده باشد.
متد های سازنده یک سری ویژگی خاص دارند؛ در واقع اگر ما یک کلاس داشته باشیم میتوانیم به کمک متد های سازنده رفتار های خیلی خوبی انجام دهیم؛ اما ویژگی های اصلی متد های سازنده چیست؟
برای این که بهتر آشنا شویم کلاس Person که جلسه قبل هم مثال زدیم دوباره تعریف میکنیم، و اینبار برای متد های سازنده از آن استفاده میکنیم.

کد کلاس اصلی:

package package1;

public class MainClass {

	public static void main(String[] args) {
		
	}

}

کد کلاس Person:

package package1;

public class Person {
	private String Name;
	private String Family;
	private int Age;
	private float Avg;

}


در جلسه قبل روش فراخوانی یک نمونه از کلاس را توضیح دادیم که قطعه کد زیر میباشد:
 

Person p1=new Person();     


کلمه Person که بعد از کلمه new قرار گرفته است در واقع اسم کلاس نیست و همان متد سازنده است؛ از این که یک پرانتز جلویش قرار دارد میتوان تشخیص داد که یک متد میباشد.
متد های سازنده، متد هایی هستند همنام کلاس، متد های سازنده معمولا به صورت عمومی تعریف میشوند؛ اما در آینده و در جلسات بعد خواهیم فهمید که همیشه این متد ها به صورت عمومی نیستند؛ متد های سازنده دارای نوع داده خروجی نیستند؛ از این متد ها استفاده میشود برای مقدار دهی اولیه به اعضای داده ای کلاس؛ متد های سازنده هم میتوانند مانند تابع های Setter به ما کمک کنند تا اعضای خصوصی را پر کنیم.
در پرانتز جلوی نام متد سازنده میتوانیم ورودی ها را تعیین کنیم:
کد کلاس Person:

package package1;  

public class Person {
	private String Name;
	private String Family;
	private int Age;
	private float Avg;

	
	
	public Person(String name,String family,int age,float avg)
	{
		Name=name;
		Family=family;
		Age=age;
		Avg=avg;
	}
}


حالا که متد سازنده را تعریف کردیم به کلاس اصلی برمیگردیم تا از آن استفاده کنیم؛ میبینیم که برنامه دچار خطا شده است،همانطور که گفتیم Person بعد از کلمه new یک سازنده است اما تا زمانی که ما خودمان برای کلاس Person سازنده تعریف نکرده باشیم؛ برای رفع خطا ما باید برای این متد سازنده مقدار تعیین کنیم به شکل زیر:
 

Person p1=new Person("mehdi", "abbasi", 39, 18.5f);     


در لحظه ای که شی p1 قرار است ساخته شود مقادیر تعیین شده ارسال میشوند و در خانه های مورد نظر قرار میگیرند.
از این لحظه به بعد باید ما هر زمان یک شی تعریف میکنیم به طور مثال p2 وPerson را مینویسیم دیگر اجازه نداریم مقدار ها را خالی بگذاریم، چرا؟ چون ما در این حالت مقداری برای سازنده ارسال نکرده ایم و سازنده کلاس نیاز دارد ورودی را دریافت کند؛ مگر این که همان سازنده پیشفرض را دوباره داشته باشیم:
کد کلاس Person:

package package1;

public class Person {
	private String Name;
	private String Family;
	private int Age;
	private float Avg;

	
	
	public Person(String name,String family,int age,float avg)
	{
		Name=name;
		Family=family;
		Age=age;
		Avg=avg;
	}
	
	public Person()
	{
		
	}
}


آیا امکان دارد در یک کلاس ما دو تابع هم نام داشته باشیم؟ بله، امکانش وجود دارد این مبحث همان  Overloadingمتد ها است.

اگر داخل یک کلاس از چندین تابع همنام استفاده کردیم، اشکالی ندارد به شرط این که یا تعداد ورودی های متد با هم متفاوت باشد؛ یا اینکه اگر تعداد ورودی ها یکسان است نوع داده ورودی متفاوت باشد.
اعضای استاتیک
ما چهار دسته عضو استاتیک داریم که دو دسته آن از بقیه مهم تراند:
•    اعضای استاتیک داده ای.
اعضای استاتیک داده ای یعنی ما میتوانیم داده هایمان را به صورت استایک تعریف کنیم.
•    اعضای استاتیک تابعی.
اعضای استاتیک تابعی یعنی ما میتوانیم تابع هایمان را به صورت استاتیک تعریف کنیم.
اعضای استاتیک داده ای
در یک پروژه جدید نام کلاس اصلی را MainClass و نام یک کلاس دیگر را MyClass میگذاریم؛ در MyClass چند عضو تعریف میکنیم و سطح دسترسی را عمومی قرار می دهیم. تا به این جا همه اعضای ما معمولی هستند؛ 
کد MyClass:

package package1;     

public class MyClass {
	public int num1;
	public int num2;
	public void print() 
	{
		num1++;
		System.out.println(num1);
	}

}


برای دسترسی به این اعضا کافی است ما یک شی در کلاس اصلی تعریف کنیم :
کد MainClass:

package package1;    

public class MainClass {

	public static void main(String[] args) {
		MyClass obj1=new MyClass();
		obj1.num1=300;
		
	}

}


اگر همین کار را برای obj2 انجام بدهیم :
 کد MainClass:

package package1;     

public class MyClass {
	public int num1;
	public static int num2;
	public void print() 
	{
		num1++;
		System.out.println(num1);
	}

}


ما دو شی متفاوت داریم، به نام های obj1 و obj2، که هر کدام فیلد های یکسانی دارند؛ مقدار های فیلد های هر شی هیچ ارتباطی با فیلد های شی دیگر ندارد؛ یعنی اگر ما فیلد num1 از obj1 را چاپ کنیم همان مقدار 300 چاپ خواهد شد؛ چرا؟ چون این فیلد ها به صورت مجزا از هم هستند یعنی برای هر شی این فیلد ها برای خودش است و متفاوت با شی دیگری میباشد.
اما اگر بگوییم که num2 از نوع static میباشد یعنی این که همه‌ی شی ها به صورت اشتراکی از این فیلد استفاده میکنند؛ این فیلد فضای مشترک بین تمام نمونه های این کلاس میباشد.
کد MyClass:

package package1;  

public class MyClass {
	public int num1;
	public static int num2;
	public void print() 
	{
		num1++;
		System.out.println(num1);
	}

}


اگر در کلاس اصلی بگوییم:
کد MainClass:

package package1;    

public class MainClass {

	public static void main(String[] args) {
		MyClass obj1=new MyClass();
		MyClass obj2=new MyClass();
		obj1.num2=500;
		obj2.num2=150;
		System.out.println(obj1.num2);
	}

}


حالا اگر برنامه را اجرا کنیم توقع داریم که مقدار 500 برایمان چاپ شود اما میبینیم که 150چاپ میشود، دلیلش این است که عضو num2 یک عضو static و مشترک بین این کلاس است؛ شی اول در مرحله اول مقدار را 500 قرار میدهد اما بعد از آن شی دوم مقدار آن را به 150 تغییر میدهد.
درمیابیم که اعضای استاتیک یک کلاس متعلق به شی خاصی نیستند؛ و اگر هر شی مقدار آن را دستکاری کند برای همه تغییر کرده است.
حالا که این عضو استاتیک است لازم نیست نام شی را قبل از آن تعریف کنیم چون متوجه شدیم که این عضو متعلق به هیچ کدام از این نمونه ها نیست و متعلق به کلاس میباشد.
پس میتوانیم موقع فراخوانی به جای نوشتن نام شی، اسم کلاس این عضو را بنویسیم؛ در واقع عضو استاتیک متعلق به کلاس میباشد.
اعضای استاتیک تابعی
اگر متدی را به صورت استاتیک تعریف کنیم چند ویژگی به آن داده ایم:
•    این متد دیگر اجازه ندارد با اعضای غیر استاتیک کار کند.
•    شبیه به اعضای استاتیک داده ای ما برای استفاده از آن ها نیاز نیست نام شی را ذکر کنیم و کافی است نام کلاس و تابع مورد نظر را ذکر کنیم.


نظر بدهید

نشانی ایمیل شما منتشر نخواهد شد .
برای ارسال نظر نیاز است وارد سایت شوید. در صورت نداشتن حساب کاربری عضو شوید.

مشخصات دوره


مدرس دوره : مهدی عباسی
تعداد جلسات 26 جلسه
مدت زمان 685 دقیقه
حجم دوره 1/84 گیگابایت
سطح مهارت مقدماتی
وضعیت دوره پایان یافته
: میانگین امتیاز دوره

رایگان
برای دسترسی به این دوره وارد یا عضو شوید.
مهدی عباسی
مهدی عباسی

درباره مدرس :

مدیر‌ عامل‌ شرکت آریا‌ نرم‌‌ افزار دارنده مدرک کارشناسی‌ ارشد مهندسی کامپیوتر 12‌ سال سابقه تدریس دروس کامپیوتر را در دانشگاههای دولتی، آزاد، پیام‌نور ملایر، شهیدشمسی‌پور تهران و تدریس برنامه‌نویسی در انیستیتو ایزایران، مجتمع فنی و موسسه راه‌آینده تهران دارا میباشد و تا به حال راهنمایی انجمنهای علمی دانشگاه و صدها پروژه دانشجویی را برعهده داشته است. تخصص اصلی: با داشتن گواهی‌نامه‌های معتبر تدریس از انیستیتو‌ ایزایران، راه آینده‌تهران و سازمان‌فنی‌حرفه‌ای، تدریس و آموزش‌ دروس کامپیوتر، ‌برنامه‌نویسی کامپیوتر و کلاسهای کنکور کارشناسی و کارشناسی‌ارشد میباشد.همچنین تجربه داوری و نظارت مسابقات برنامه‌نویسی کشوری‌ACM را در سالهای متعدد داشته و تیم مورد رهبری ایشان در 3سال متوالی مقام اول مسابقات کشوری را از آن خود کرده است.ایشان مقالاتی در زمینه شبکه‌های کامپیوتری، تکنیک‌های وزارت دفاع و ... به ثبت رسانده و مشاور و کارشناس در طراحی و برنامه نویسی بیش از 50‌برنامه کاربردی تحت وب و ویندوز و موبایل میباشد. افتخارات دیگر:کسب مقام دوم ایده‌های برتر در مسابقات استارت‌آپ و بکند کشوری را نام برد.