صفحه اصلی / دوره‌های آموزشی / آموزش جاوا مقدماتی تا متوسط / توابع Getter و setter در جاوا

توابع Getter و setter در جاوا

توابع Getter و setter در جاوا
براي خريد اين درس نياز است وارد سايت شويد. در صورت نداشتن حساب کاربري عضو شويد.
75,600 تومان

جلسات دوره


                         
مهدی عباسی
مدرس:

مهدی عباسی

18 سال سابقه برنامه‌نویسی و تدریس برنامه‌نویسی
کسب مقام‌های اول و دوم کشوری در مسابقات برنامه‌نویسی

مهدی عباسی هستم، مسلط به حداقل ۲۰ زبان مطرح برنامه نویسی به صورت پیشرفته، مدیر عامل شرکت آریا نرم افزار و بنیانگذار آکادمی درسمن، مسلط به تدریس دروس تخصصی کاردانی و کارشناسی کامپیوتر، پایگاه داده ها، برنامه نویسی پیشرفته، مبانی برنامه نویسی، مباحث ویژه طراحی وب و .... مشاهده رزومه

تعریف کلاس ها به صورت دیگر، این گونه است که کلاس ها یک نوع داده جدید هستند؛ که توسط برنامه نویس تعریف میشود و از آن لحظه به بعد، به انواع داده‌ی ساده در جاوا اضافه میشود.
به طور ساده تر ما در جاوا با داده هایی از جنس: 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 میگویند.


 


 

نظرات دانشجویان

کاربر درسمن
عرفان

با سلام خدمت سایت درسمن یه سوال داشتم ازتون اینکه من alt و shift بعلاوه S رو میزنم بهم خطا میده و پنجره ای باز نمیشه میشه راهنمایی بکنید؟

پشتیبانی 1
پشتیبانی 1

سلام عرفان جان، لطفا سوال خودتون در انجمن برنامه نویسی جاوا کاران درسمن درج کنید تا دوستان در اسرع وقت مشکلتون حل کنند. در این بخش فقط به سوال غیر فنی و پیشنهادات و انتقادات دوره پاسخ داده خواهد شد. با تشکر از شما.

کاربر درسمن
سیدمهدی موسوی

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

پشتیبانی 1
پشتیبانی 1

سلام سید جان وقتتون بخیر، متوجه منظور شما نشدم! قراره چه چیزو به بچهای جاوا کار ارجاع بدهم؟

کاربر درسمن
Ahmad

سلام وقت بخیر ، من توی حوزه شبکه هستم و چند وقته دارم این فیلم ها رو مشاهده میکنم ، فقط توی سایت جایی برای انجام تمرین ندیدم ، چجوری تمرین کنم که دانسته هام و یادگیری هام ثبت و دایمی بشه ؟

پشتیبانی 1
پشتیبانی 1

سلام دوست عزیز وقتتون بخیر، تقریبا برای اکثر دوره ها تمرین قرار داده ایم، من بخش بچهای جاوا کار ارجاع می دهم تا برای این دوره هم تمرین های مناسبی در نظر بگیرند. ممنون از اطلاع رسانیتون.

کاربر درسمن
امیر مهر

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

پشتیبانی 1
پشتیبانی 1

سلام امیر جان خوب هستید؟ مچکرم از لطف شما، ما برای خواسته های شما ارزش قائلیم و آموزش های کم نظیری تولید می کنیم، همانند خودتان که نظیر ندارید.

کاربر درسمن
کامیار

"گاهی نیاز داریم اطلاعات خصوصی یک کلاس را بازیابی کنیم؛ در مرحله قبل ما اطلاعات را در نقش خصوصی ثبت کردیم اما حالا میخواهیم دیگر آن اطلاعات را بازیابی کنیم." این بخش رو متوجه نشدم ممنون میشم یه توضیح کوچولو بدین و اینکه نوشتین در مرحله قبل ما اطلاعات را در نقش خصوصی ثبت کردیم درصورتی که همه شون default بودن یکم گیج شدم !!!!!!!!!!!

پشتیبانی 1
پشتیبانی 1

برای بازیابی اطلاعات خصوصی (مقادیر فیلدهای خصوصی) ما توابع getter استفاده می کنیم که توابعی هستند عمومی (public) و کارشون بازیابی مقدار یکی از فیلدهای خصوصیه.

اینکه ما اونهارو default در نظر گرفتیم فقط به خاطر این بود که داریم تمرین می کنیم ولی بهتره که private باشند.

موفق باشید.

نمایش بیشتر

نظر شما در تصمیم دیگران اثرگذار است.

لطفا برای همراهان درسمن و بهتر شدن دوره نظر خود را بنویسید.

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

186