ورود

View Full Version : سوال: سوال ساده راجع به وراثت



lexical_error
جمعه 14 تیر 1392, 17:14 عصر
سلام دوستان
من به تازگی کار با جاوا رو شروع کردم به قسمت کلاس ها که رسیدم با یه مشکلی برخوردم!
سوالم رو با یک مثال میگم
مثلا 2 کلاس دارم به نامهای a و b که کلاس b از کلاس a مشتق میشه ، اگر برای کلاس a سازنده ای بنویسم که پارامتر داشته باشه کلاس b تنها درصورتی کامپایل میشه که در تعریف سازندش از super استفاده کنم و لیست آرگومانهای مشخص شده در سازنده کلاس a رو براش تعیین کنم، در صورتی که اگر سازنده a پارامتر نداشته باشه کلاس b بدون مشکل کامپایل میشه!
میخواستم بدونم این یه اصل هست در جاوا یا من جایی اشتباه عمل میکنم ؟!!

a.seieddokht
شنبه 15 تیر 1392, 00:24 صبح
سلام دوستان
من به تازگی کار با جاوا رو شروع کردم به قسمت کلاس ها که رسیدم با یه مشکلی برخوردم!
سوالم رو با یک مثال میگم
مثلا 2 کلاس دارم به نامهای a و b که کلاس b از کلاس a مشتق میشه ، اگر برای کلاس a سازنده ای بنویسم که پارامتر داشته باشه کلاس b تنها درصورتی کامپایل میشه که در تعریف سازندش از super استفاده کنم و لیست آرگومانهای مشخص شده در سازنده کلاس a رو براش تعیین کنم، در صورتی که اگر سازنده a پارامتر نداشته باشه کلاس b بدون مشکل کامپایل میشه!
میخواستم بدونم این یه اصل هست در جاوا یا من جایی اشتباه عمل میکنم ؟!!


سلام دوست خوب میخوام این موضوع رو کامل توضیح بدم با این که خودم مبتدی هستم ولی اگه اشتباه نکنم این موضوع رو میدونم و میخوام کمکت کنم
تو جاوا ما 2 نوع شی داریم (object) که بهشون میگن jvm object و developer object حالا jvm object که مشخص فقط 1 با توسط خود jvm ساخته میشه و شامل تمام attribute ها و تمام method های static تعریف شده در سطح کلاس و developer object هم توسط برنامه نویس ساخته میشه یعنی زمانی که شی new میشود و شامل تمام صفات و متد های غیر استاتیک میباشد و به این نکته توجه کن که jvm object تنها 1 بار ساخته میشود ولی developer object میتونه n بار ساخته بشه حالا هرکدوم از این شی ها واسه خودشون constructor دارند که باز هم میگم constructor داخل jvm object تنها 1 بار call میشود ولی constructor داخل developer object هر بار که شی توسط برنامه نویس new شود call میشود به مثال زیر نگاه کن

class A {
static {
System.out.println("i am jvm object constructor (class A) ");
}

public A() {
System.out.println("i am developer object constructor (class A)");
}

}

class B extends A {
static {
System.out.println("i am jvm object constructor (class B) ");
}

public B(){
System.out.println("i am developer object constructor (class B)");
}

}


خروجی این برنامه وقتی از کلاس B نمونه ای بسازید میشه :



i am jvm object constructor (class A)
i am jvm object constructor (class B)
i am developer object constructor (class A)
i am developer object constructor (class B)


با این خروجی مشخص میشه که اول متد سازنده کلاس A اجرا میشود call میشود و بعد متد سازنده کلاس B پس یعنی اگر متد سازنده کلاس فرزند یعنی کلاس B با متد سازنده کلاس پدر یعنی کلاس A هم امضا نباشد مشکل پیش میاد چون اون وقت نمیتونه چیزی به متد سازنده کلاس A پاس کنه و خطا میده و حتما باید این کارو انجام بده مثل این میمونه که شما متد داشته باشی که پارامتر داره و مقداری رو در پارامتراش پاس ندی خوب خطا میده و برای حل این مشکل یا باید متد سازنده کلاس فرزند با متد سازنده پدر هم امضا باشند یا این که بیای داخل متد سازنده پسر کاره زیر رو انجام بدی

روش اول وقتی هم امضا باشن :

class A {
static {
System.out.println("i am jvm object constructor (class A) ");
}

public A(int a) {
System.out.println("i am developer object constructor (class A)");
}

}

class B extends A {
static {
System.out.println("i am jvm object constructor (class B) ");
}

public B(int b){
super(b);
System.out.println("i am developer object constructor (class B)");
}

}



روش دوم وقتی هم امضا نیستند :

class A {
static {
System.out.println("i am jvm object constructor (class A) ");
}

public A(int a) {
System.out.println("i am developer object constructor (class A)");
}

}

class B extends A {
static {
System.out.println("i am jvm object constructor (class B) ");
}

public B(){
super(10);
System.out.println("i am developer object constructor (class B)");
}

}



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

lexical_error
شنبه 15 تیر 1392, 00:44 صبح
ممنون از توضیح کاملتون دوست عزیز:قلب:

spiderman200700
شنبه 15 تیر 1392, 00:49 صبح
http://neo-one.ir/?p=417