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

آموزش وراثت در جاوا کاملا جامع و کاربردی

آموزش وراثت در جاوا کاملا جامع و کاربردی
براي خريد اين درس نياز است وارد سايت شويد. در صورت نداشتن حساب کاربري عضو شويد.
75,600 تومان

جلسات دوره


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

مهدی عباسی

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

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

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

 

وقتی یک کلاس از کلاس والدش ارث‌بری کند، میتواند اطلاعات پایه‌ی آن کلاس را نسبت به این که سطح دسترسی چطور باشد برای خودش داشته باشد.
همین مثال را در قالب کد نویسی برای درک بهتر عنوان میکنیم.
ما بجز کلاس اصلی، سه کلاس دیگر داریم که به ترتیب کلاس Person ، کلاس Student، و کلاس Teacher  میباشند که در کلاس Student  و Teacher اطلاعات مختص به خودشان و در کلاس Person اطلاعات عمومی مربوط به استادان و دانشجویان نگهداری میشود.

کد کلاس اصلی:

package package1;		

public class MainClass {

	public static void main(String[] args) {
		Person person1=new Person();
		Student student1=new Student();
		Teacher teacher1=new Teacher();
		
	}

}

کد کلاس Student: 

package package1;			

public class Student {
	String StudentId;
}

کد کلاس Teacher: 

package package1;		

public class Teacher {
	String TeacherCode;
}

کد کلاس Person: 

package package1;			

public class Person {
	String Name;
	String Family;
	int Age;
}


اگر ما در کلاس اصلی، از کلاس Person  یک شی بسازیم، برای این شی ما میتوانیم صفت های Name و Family و Age را ببینیم؛ یک شی هم از کلاس Student میسازیم، این شی هم صفت StudentId که مختص کلاس Student میباشد قابل رویت است؛ و همچنین یک شی از کلاس Teacher میسازیم، از این شی هم که صفت TeacherCode مختص کلاس آن است قابل دسترسی است.
برای این که یک کلاس، فرزند کلاس دیگری باشد، کافی است موقع تعریف کلاس از کلمه extends استفاده کنیم و نام کلاسی که قرار است والدش بشود را بعد از این کلمه تعیین کنیم به شکل زیر:

 

package package1;			

public class Student extends Person{
	String StudentId;
}


حالا اگر یک شی از همان کلاس Student بسازیم میبینیم که به صورت مورثی از صفت های کلاس والدش نیز میتوان استفاده کرد، برای کلاس Teacher نیز به همین صورت میتوان استفاده کرد.
مثال: فرض کنید میخواهیم اطلاعات نام، نان خانوادگی و سن یک فرد را چاپ کنیم، برای این کار یک تابع در کلاس Person مینویسیم:

 

package package1;		

public class Person {
	String Name;
	String Family;
	int Age;
	
	public void PrintPersonInfo() {
		System.out.println("Name :"+Name+"\tFamily :"+Family+"\tAge :"+Age);
	}
}


حالا برای استفاده از این عملیات چاپ، در کلاس اصلی تابع PrintPersonId از کلاس Person را فراخوانی میکنیم:
 

package package1;		

public class MainClass {

	public static void main(String[] args) {
		Person person1=new Person();
		Student student1=new Student();
		Teacher teacher1=new Teacher();
		
		student1.PrintPersonInfo();
		teacher1.PrintPersonInfo();
	}

}


حالا اگر برنامه را اجرا کنیم قطعا خروجی های ما null خواهد بود؛ چرا؟ چون هنوز هیچ مقداری به آن ها نداده ایم؛ در واقع کلاس Person این فیلد هایی که دارد، هنوز پر نشده اند که برای ما مقدار خروجی داشته باشد؛ برای پر کردن این فیلد ها، دو روش داریم، یا باید از Setter ها استفاده کنیم، یا از سازنده ها.
ترجیح میدهیم از سازنده استفاده کنیم؛ در کلاس Person همان طور که در جلسات گذشته آموزش دادیم یک سازنده تعریف میکنیم.

 

package package1;			

public class Person {
	String Name;
	String Family;
	int Age;
	public Person(String name,String Family,int age)
	{
		Name=name;
		Family=family;
		Age=age;
		
	}
	
	public void PrintPersonInfo() {
		System.out.println("Name :"+Name+"\tFamily :"+Family+"\tAge :"+Age);
	}
}


میبینیم که چندین خطا رخ داده است؛ اگر کلاسی فرزند یک کلاس باشد که آن کلاس دارای سازنده ای غیر پیشفرض باشد باید در لحظه‌ی ساخته شدن شی کلاس فرزند، سازنده‌ی کلاس والد تامین شود؛ در آن لحظه که شی ای از کلاس Student تعریف میکنیم، متد سازنده  اش فراخوانی میشود، چون Student فرزند کلاس Person میباشد و Person خودش سازنده دارد، پس حتما باید برای Student یک سازنده بنویسیم:
 

package package1;			

public class Student extends Person{
	public Student() {
		
	}
	String StudentId;
}


در لحظه شروع باید سازنده کلاس والد را فراخوانی کنیم و برای آن مقادیر ارسال کنیم:
 

package package1;  			

public class Student extends Person{
	public Student() {
		super("ali","rezaie",30);
	}
	String StudentId;
}


با کلمه کلیدی super سازنده کلاس والد فراخوانی می شود؛
برای گرفتن ورودی برای پر کردن فیلدها به روش زیر عمل می کنیم:

 

کد کلاس Student:

package package1; 		

public class Student extends Person{
	public Student(String name,String family,int age,int studentid) {
		super(name,family,age);
		StudentId=studentid;
	}
	int StudentId;
}

کد کلاس اصلی: 

package package1;		

public class MainClass {

	public static void main(String[] args) {
		Student student1=new Student("Ali","Rezaie",30,1);
		Teacher teacher1=new Teacher();
		

		
		student1.PrintPersonInfo();
		teacher1.PrintPersonInfo();
	}

}

 


حالا یک شی دیگر با نام Student2 می سازیم و اطلاعات آن را پر می‌کنیم:
 

package package1;		

public class MainClass {

	public static void main(String[] args) {
		Student student1=new Student("Ali","Rezaie",30,1);
		Student student2=new Student("Reza","Javadi",29,2);
		Teacher teacher1=new Teacher();
		

		
		student1.PrintPersonInfo();
		teacher1.PrintPersonInfo();
	}

}


همین کارها را برای کلاس Teacher نیز انجام می دهیم:
 

کد کلاس Teacher:

package package1;			

public class Teacher extends Person{
	public Teacher(String name,String family,int age,int teacherCode) {
	super(name,family,age);
	TeacherCode=teacherCode;
	}
	
	int TeacherCode;
}

 کد کلاس اصلی:

package package1;		

public class MainClass {

	public static void main(String[] args) {
		Student student1=new Student("Ali","Rezaie",30,1);
		Student student2=new Student("Reza","Javadi",29,2);
		Teacher teacher1=new Teacher("Mehdi","Abbasi",39,1000);
		

		
		student1.PrintPersonInfo();
		teacher1.PrintPersonInfo();
	}

}

 


حالا با استفاده از همان تابع اطلاعات عمومی را برایمان چاپ می‌کرد اطلاعات را چاپ می کنیم:
 

package package1;			

public class MainClass {

	public static void main(String[] args) {
		Student student1=new Student("Ali","Rezaie",30,1);
		Student student2=new Student("Reza","Javadi",29,2);
		Teacher teacher1=new Teacher("Mehdi","Abbasi",39,1000);
		

		
		student1.PrintPersonInfo();
		student2.PrintPersonInfo();
		teacher1.PrintPersonInfo();
	}

}


اگر بخواهیم می توانیم در هر کدام از کلاس ها مختص خودشان یک Print بنویسیم که StudentId را چاپ کند:
برای کلاس Student :

 

package package1;			

public class Student extends Person{
	public Student(String name,String family,int age,int studentid) {
		super(name,family,age);
		StudentId=studentid;
	}
	int StudentId;
	
	public void Print() {
		System.out.println("Student Id is :"+StudentId);
		
	}
}


برای کلاس Teacher :
 

package package1;		

public class Teacher extends Person{
	public Teacher(String name,String family,int age,int teacherCode) {
	super(name,family,age);
	TeacherCode=teacherCode;
	}
	
	int TeacherCode;
	public void Print() {
		System.out.println("Teacher Code is :"+TeacherCode);
		
	}
}


حالا برای چاپ اطلاعات مختص به هر شی و کلاس به صورت زیر عمل می کنیم:
 

package package1;			

public class MainClass {

	public static void main(String[] args) {
		Student student1=new Student("Ali","Rezaie",30,1);
		Student student2=new Student("Reza","Javadi",29,2);
		Teacher teacher1=new Teacher("Mehdi","Abbasi",39,1000);
		

		
		student1.PrintPersonInfo();
		student1.Print();
		student2.PrintPersonInfo();
		student2.Print();
		teacher1.PrintPersonInfo();
		teacher1.Print();
	}

}

 

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

کاربر درسمن
علی صابری

سلام ممنون از آموزش هاتون ببخشید چرا برای هر کدوم مستقیم sysout نمی نویسیم و متد سازنده میسازیم براش؟

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

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

نمایش بیشتر

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

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

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

189