int money = 500;
void spendMoney(int n){
money -= n;
System.out.println("Father spend " +n+ ",remain " +money);
}
}
class Son extends Father{ }
public class Money{
public static void main(String[] args){
Father father = new Father();
Son son = new Son();
System.out.print("Before father spend money, son has ");
System.out.println(son.money+ ".");
father.spendMoney(250);
System.out.print("After father spend money, son has ");
System.out.println(son.money+ ".");
}
}
output:
Before father spend money, son has 500.
Father spend 250,remain 250
After father spend money, son has 500.
自父類別繼承而來的實體變數,會變成自己的實體變數,與父類別無關。
========================================================
class Father{
int money = 500;
void spendMoney(int n){ money -= n; }
}
class Son extends Father{
void spendMoney(int n){
money -= n;
super.spendMoney(n); //這裡呼叫父函式來用,並不是用父物件去呼叫函式
}
}
public class Money2{
public static void main(String[] args){
Father father = new Father();
Son son = new Son();
System.out.print("Before son spend money, son has ");
System.out.println(son.money+ ".");
son.spendMoney(250);
System.out.print("After son spend money, son has ");
System.out.println(son.money+ ".");
System.out.println("Father has " +father.money);
}
output:
Before son spend money, son has 500.
After son spend money, son has 0.
Father has 500
呼叫super.spendMoney(n)的意思是,Son物件呼叫父函式(spendMoney())來改變本身value的值,並不是叫Father物件呼叫自已的spendMoney()。因此父物件的value的值並不會變成250。
==================================================
class Father{
int money = 500;
void spendMoney(int n){ money -= n; }
}
class Son extends Father{
void spendMoney(int n){ super.spendMoney(n); }
int getMoney(){ return super.money; }
}
public class Money2{
public static void main(String[] args){;
Son son = new Son();
System.out.print("Before son spend money, he has ");
System.out.println(son.money+ ".");
son.spendMoney(250);
System.out.print("After son spend money, he has ");
System.out.println(son.getMoney()+ ".");
}
}
output:
Before son spend money, he has 500.
After son spend money, he has 250.
這裡Son類別內的方法全是存取自Father類別內的方法,仍可正常運作,不會因沒有Father實體而不能存取其實體成員;所以應該可以這樣想:Son類別繼承了Father的field:money、spendMoney(),雖然在Son把spendMoney()給覆寫了,但在呼叫super.spendMoney()時,在編譯器眼裡其實是長這樣:spendMoney(250){ money -=250;}
所以我可以大膽的說,在Son繼承父類別時,在Son裡的spendMoney方法其實有兩個:
void spendMoney(int n){ money -= n; } 跟 void spendMoney(int n){ super.spendMoney(n); }
當呼叫super.spendMoney(n)時,就是呼叫自己的spendMoney(int n){ money -= n; }。
至於為什麼可以這樣想呢?因為啊,就Father類別在程式碼內沒有建立實體啊,所以它的spendMoney()根本不存在啊。Son因為繼承了Father,而且又建立了實體,所以當呼叫super.spendMoney()時,其實就是在跟編譯器說:“嘿,幫我跑一下spendMoney函式,不是跑我覆寫的那一個,是我老爸留給我的那一個spendMoney喔!謝謝!“
====================================================
class Father{
int money = 500;
void spendMoney(int n){ money -= n; }
}
class Son extends Father{
int money = 250;
void spendMoney(int n){ super.spendMoney(n); }
void getFathersMoney(Father f){ money = f.money; }
}
public class Money3{
public static void main(String[] args){;
Son son = new Son();
System.out.println("Son has " +son.money+ ".");
son.getFathersMoney(son);
System.out.println("Son has " +son.money+ ".");
}
}
output:
Son has 250.
Son has 500.
這段程式碼是說,兒子偽裝成爸爸去銀行提爸爸的錢。
沒有留言:
張貼留言