شی گرایی در زبان جاوا (Getter-setter)


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

تعریف کلاس ها به صورت دیگر، این گونه است که کلاس ها یک نوع داده جدید هستند؛ که توسط برنامه نویس تعریف میشود و از آن لحظه به بعد، به انواع داده‌ی ساده در جاوا اضافه میشود.
به طور ساده تر ما در جاوا با داده هایی از جنس: int ، float ، Boolean و... آشنا شده ایم که به آنها داده های پیچیده میگویند.
ما هرگاه نیاز داشته باشیم داده هایی غیر از این ها را نگهداری کنیم، حتما باید آن ها را تعریف کنیم؛ یعنی یک نوع داده جدید به سیستم اضافه کنیم.
مثلا در سیستم دانشگاه به عنوان یک دانشجو، نام و نام خانوادگی و بقیه اطلاعات مربوط به شما در سیستم باید کنار هم ذخیره شود.
اما اگر یک داده از نوع int برای نگهداری سن تعریف کرده ایم؛ این متغیر تنها میتواند مقدار سن را در خود نگهداری کند؛ و اگر بخواهیم نام خود را ذخیره کنیم باید یک متغیر از نوع String تعریف کنیم؛ این دو کاملا متفاوت و مجزا از هم هستند.
اما در محیط های کاربردی آیا واقعا به همین شکل است؟
یعنی شما داده هایتان به صورت مجزا و جدا از هم ذخیره میشود؟
قطعا به این شکل نیست؛ یعنی ما نیاز داریم که اگر بخواهیم اطلاعات یک دانشجو را نگهداری کنیم، همه‌ی اطلاعات این دانشجو کنار هم قرار بگیرند.
برای این کار از کلاس ها استفاده میکنیم که این قابلیت را دارند تا چندین نوع اطلاعات را در کنار یکدیگر ذخیره کنند.
وقتی که ما یک کلاس تعریف میکنیم؛ در واقع ظرف های متعددی از جنس های مختلف را کنار هم تعریف میکنیم.
خود این کلاس به عنوان یک نوع داده جدید به لیست ما اضافه میشود؛ از این لحظه به بعد ما میتوانیم از کلاس ها همانند متغییر ها استفاده کنیم.
برای درک بهتر این موضوع به مثال زیر دقت کنید:
فرض کنید قصد داریم اطلاعات یک فرد را نگهداری کنیم؛ اطلاعات این فرد شامل: نام، نام خانوادگی، سن و معدلش میباشد.
در اینجا ما چهار اطلاعات متفاوت از یک فرد را میخواهیم نگهداری کنیم؛ اگر قرار باشد این اطلاعات به صورت مجزا ذخیره شوند، ما باید برای هرکدام از اطلاعات یک متغییر تعریف کنیم.

package package1;

public class MyClass {

	public static void main(String[] args) {
	
		String name;
		String family;
		int age;
		float avg;

	}

}

در کد بالا چهار متغییر تکی که هیچ رابطه ای با یکدیگر ندارند قرار است داده های ما را ذخیره کنند.
آیا واکشی این اطلاعات کار راحتی است؟ قطعا به این صورت نخواهد بود.
بهترین راه برای انجام این کار این است که ما یک ظرف یکجا داشته باشیم که این ظرف چند بخش داشته باشد؛ برای این کار ما باید یک کلاس تعریف کنیم. این ها کلاس های مدل ما هستند.
در این کلاس همان فیلد ها و اطلاعات مثال قبل را وارد میکنیم:

package package1;

public class Person {

	String name;
	String family;
	int age;
	float avg;

}

ما تا به اینجا انواع داده‌ی ساده را داشتیم یعنی در تابع Main میتوانستیم داده هایی از جنس int و... تعریف کنیم؛ اما حالا با این توضیحات میتوانیم یک شئ از کلاس مورد نظر تعریف کنیم.

package package1;

public class MyClass {

	public static void main(String[] args) {
	
		int x;
		Person person1;

	}

}

ما وقتی مینویسیم:

int x;

 x یک متغییر از نوع int میباشد؛ اما اگر از یک کلاس یک متغییر تعریف کنیم، دیگر به آن متغییر گفته نمیشود و به آن شئ یا نمونه ای از کلاس گفته میشود.
متغییر ها و نمونه ها یک تفاوت مهم با هم دارند؛ متغییر ها در لحظه تعریف شدن از حافظه فضای خود را میگیرند. اما نمونه هایی که از کلاس ها تعریف میشوند، بعد از تعریف شدن باید درخواست بدهیم تا برای آن فضا اختصاص داده شود.
به روش زیر از مدیر حافظه برای نمونه درخواست فضا میکنیم:

package package1;

public class MyClass {

	public static void main(String[] args) {
	
		int x;
		Person person1;
		person1 =new Person();

	}

}

وقتی که از کلمه کلیدی new استفاده میکنیم مدیر حافظه، فضایی را برای شئ یا نمونه‌ی ما در نظر میگیرد.
برای دسترسی به اعضای یک کلاس میتوانیم نام نمونه کلاس را بیاوریم و بعد از گذاشتن یک نقطه، آن بخش مورد نظر مثلا فیلد name را داشته باشیم؛ برای بهتر فهمیدن این موضوع به کد زیر توجه کنید:

package package1;

public class MyClass {

	public static void main(String[] args) {
	
		int x;
		Person person1=new Person();
		person1.name="mehdi";

	}

}

یکی از بزرگترین ارزش هایی که کلاس ها به ما میدهند کپسوله سازی است؛
این ارزش امکان این را به ما میدهد که صفت های داخل یک کلاس از دید کلاس های دیگر مخفی بشوند.
در اکثر مواقع بهتر است که داده ها یا صفت های یک کلاس از دید کلاس های دیگر مخفی باشد؛ یعنی به صورت مستقیم نتوانیم از بیرون کلاس به آنها دسترسی داشته باشیم.
برای دسترسی به اعضای یک کلاس که در دید دیگر کلاسها مخفی شدند باید از یک سری واسطه ها استفاده کنیم.
به طور مثال ما برای صحبت با رئیس یک اداره، مستقیما نمی توانیم رئیس را ببینیم اما میشود یک سری واسطه ها را قرارداد که ما از طریق آنها که به صورت عمومی تعریف شده است بتوانیم به آن عضو خصوصی دست داشته باشیم.
به این صورت که ما باید  اول منشی رئیس را ببینیم.
پس باید عضوی در کلاس تعریف کنیم که بتواند دسترسی به اعضای خصوصی داشته باشد و ما هم بتوانیم آن را ببینیم یا به عبارتی نمونه کلاس بتواند آن را ببیند.
ابتدا یک متد تعریف میکنیم؛ این تابع دسترسی public یا عمومی دارد و هیچ خروجی ندارد.
کار این تابع این است که هر موقع آنرا صدا زدیم یک String برای آن می فرستیم که باید آن را گرفته و در متغییری به نام name قرار بدهد.
بر این متد ها متدهای مقدار دهی یا Setter میگویند.

کد کلاس Person:

package package1;

public class Person {

	String name;
	String family;
	int age;
	float avg;
	public void SetName(String n) {
		name=n;
	}
	
}

 

کد کلاس اصلی:

package package1;

public class MyClass {

	public static void main(String[] args) {
	
		Person person1=new Person();
		person1.SetName("Mehdi");
		
	}

}


در کد بالا مشاهده کردید با این که سطح دسترسی در کلاس Person در حالت خصوصی میباشد در کلاس اصلی به راحتی میتوان به آن دسترسی پیدا کرد.
گاهی نیاز داریم اطلاعات خصوصی یک کلاس را بازیابی کنیم؛ در مرحله قبل ما اطلاعات را در نقش خصوصی ثبت کردیم اما حالا میخواهیم دیگر آن اطلاعات را بازیابی کنیم.
تابعی تعریف میکنیم که خروجی String دارد و نامش Getname است و همچنین ورودی ندارد.

برای درک بهتر به کد زیر دقت کنید:

کد کلاس Person:

package package1;

public class Person {

	private String name;
	private String family;
	int age;
	float avg;
	public void SetName(String n) {
		name=n;
	}
	public void SetFamily(String f) {
		family=f;
	}
	
	public String GetName() {
		return name;
	}
	public String GetFamily() {
		return family;
	}
	
}

 

کد کلاس اصلی:

package package1;

public class MyClass {

	public static void main(String[] args) {
	
		Person person1=new Person();
		person1.SetName("Mehdi");
		person1.SetFamily("Abbasi");
		
		
		System.out.println(person1.GetName());
		System.out.println(person1.GetFamily());
		
	}

}


در بعضی برنامه ها ممکن است لازم باشد تعداد زیادی از متدهای Getter و Setter را بکار بگیریم و نوشتن این کدها ممکن است خیلی طولانی و خسته کننده باشد.
برای همین در بعضی از IDE ها این امکان را به وجود آورده تا بتوانیم به راحتی این کدها را تولید کنیم.
برای تولید Getter و Setter در Eclipse باید کلیدهای ترکیبی Alt+Shift+S را بزنیم و در پنجره ای باز میشود گزینه Generate Getter and Setter را  کلیک کنید.
پنجره ای که باز میشود که امکان انتخاب متغییر های مورد نظر را به ما میدهد تا کدهای Getter و Setter را اضافه کنیم. این کدها برای فراخوانی یک شی از یک کلاس دیگر است اما اگر مخواهیم یک شی دیگر را نیز فراخوانی کنیم هیچ مشکلی پیش نمی اید و تمام خانه ها و متغیر ها  که برای شی اول  تولید شده برای شی دوم هم تولید میشود. 

اعضای کلاس به صورت کلی دو دسته اند.
اعضای داده ای برای هر کدام از نمونه ها مجزا هستند یعنی این که شی اول فضا های خودش را دارد و شی دوم نیز فضا های خودش را داراست.
اما متد های کلاس برای تمام نمونه ها به صورت اشتراکی استفاده میشوند.
نکته مهم این است که هنگام ارسال مقدار به متغیر ها هر شی به صورت جداگانه برای متغیر های خودش مقدار را ارسال میکند. یعنی اجازه ندارند متغییر های شی دیگر را پر کنند.
برای همین منظور مفهومی به نام this ایجاد میشود؛ this در واقع در سطح کلاس اشاره میکند به شی جاری یعنی در هر لحظه شی‌ای که باعث فراخوانی شدن کلاس میشود، در سطح کلاس به آن this میگویند.


 


 


نظر بدهید

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

مشخصات دوره


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

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

درباره مدرس :

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