درود
اگر میشه override و super رو یکم توضیح بدید
به نام خدا
توضیح مختصری درباره override
سلام
الان مثلا دو تا کلاس داریم که کلاس دوم از کلاس اول ارث بری کرده:
class Avvali{
}
class Dovvomi extends Avvali{
}
public class Main {
public static void main(String[] args){
}
}
کلاس اولی یه متود داره که رشته ای رو برمی گردونه:
class Avvali{
public String getReshte () { //این متود
return "man dar classe avvali hastam"; // واین رشته رو میگم
}
}
class Dovvomi extends Avvali{
}
public class Main {
public static void main(String[] args){
}
}
خب، اول میای یه شیء از کلاس Dovvomi در کلاس Main ات می سازی.
الان اگه این کد رو وارد کنی:
class Avvali{
public String getReshte () {
return "man dar classe avvali hastam";
}
}
class Dovvomi extends Avvali{
}
public class Main {
public static void main(String[] args){
Dovvomi d = new Dovvomi();
System.out.println(d.getReshte()); //این کد
}
}
کار میکنه! (و در خروجی هم این رو چاپ می کنه:
man dar classe avvali hastam
) در حالی که کلاس دومی دارای چنین متودی نبود. دلیلش هم اینه که چون کامپایلر نتونست اوراید متود getReshte() رو در کلاس دومی پیدا کنه، رفت سراغ خود کلاس اولی که پدر کلاس دومی بود و خود اون متود رو اجرا کرد، نه اوررایدش.
خب،،
الان اگه تو بگیری همون متود رو در کلاس دومی اورراید کنی، بجای اینکه متود موجود در کلاس اولی (یا همون کلاس پدر) اجرا بشه، میاد متود اورراید شدش اجرا میشه.
برای مثال ما در این کد:
class Avvali{
public String getReshte () {
return "man dar classe avvali hastam";
}
}
class Dovvomi extends Avvali{
@override // این متود اورراید شده ی همون متود قبلی هستش
public String getReshte () {
return "man dar classe dovvomi hastam, bande override shode am ";
}
}
public class Main {
public static void main(String[] args){
Dovvomi d = new Dovvomi();
System.out.println(d.getReshte()); //این کد
}
}
این خروجی رو خواهیم داشت:
man dar classe dovvomi hastam, bande override shode am
و توضیح درباره سوپر:
با دستور super میشه متد های قابل دسترسی در کلاس پدر رو به اجرا در آورد.
مثلا اگه بزنی
super.eat("khordam");
کامپایلر میره در کلاس پدر کلاسی که این کد رو توش نوشتی، دنبال متد eat با همچین ورودی هاییی می گرده و اجراش می کنه.
مثال:
class Avvali{
public void eat(String a){
System.out.println(a); //متدی که در این کد اجرا میشه اینه
}
public void eat(){
System.out.println("khordam ghaza ro!");
}
}
class Dovvomi extends Avvali{
public void main (){
super.eat("khordam"); // <--------
}
}
public class Main {
public static void main(String[] args){
Dovvomi d = new Dovvomi();
d.main();
}
}
خروجی کنسول این خواهد بود:
khordam
خب حالا بزار یچیزو برات روشن کنم.
ما وقتی می خواستیم متدی از کلاس پدر رو اجرا کنیم یه super میزاشتیم و یک نقطه و اسم متد و پرانتز و ورودی هاش؛ ولی اگه بخوایم کانستراکتور متد پدر رو صدا بزنیم، فقط یه super خالی و با پرانتز هاش (ورودی های کانتراکتور) می زاریم.
و همچنین باید بگم که وقتی کلاسی ارثبری می کنه، حتما باید تمام کانستراکتور های کلاس باباشو با super در کانستراکتور(های) خودش صدا بزنه.
مثال:
class Avvali{
public Avvali(){ //کانستراکتور 1
System.out.println("Constructor yek seda zade shod!");
}
public Avvali(int a){ //کانستراکتور 2
System.out.println("Constructor do seda zade shod!"+" int a = "+a);
}
public Avvali(String s){ //کانستراکتور 3
System.out.println("Constructor se seda zade shod!");
System.out.println(s);
}
}
class Dovvomi extends Avvali{
public Dovvomi(){ //کانستراکتور 1
super();
}
public Dovvomi(int c){ //کانستراکتور 2
int b = a+7;
super(b);
}
public Dovvomi(String e){ //کانستراکتور 3
super(e);
}
}
public class Main {
public static void main(String[] args){
Dovvomi d;
d = new Dovvomi();
d = new Dovvomi(6);
d = new Dovvomi("salam");
}
}
خروجی:
Constructor yek seda zade shod!
Constructor do seda zade shod! int a = 13
Constructor se seda zade shod!
salam
خیلی ممنون از توضیح کامل
خواهش می کنم.
و همچنین اگه بخوام super رو خلاصه تر بگم، میشه گفت که عملکردش مثل عملکرد کلمه کلیدی this هست، فقط فرقش اینه که this میومد از اجزای کلاس خودی استفاده می کرد؛ ولی super از اجزای کلاس پدرش استفاده می کنه.