//這是一個Employee類
import?java.util.Date;
import?java.util.GregorianCalendar;
public?class?Employee?{
???????private?String?name;
???????private?double?salary;
???????private?Date?hireDay;
???????public?Employee(String?n,?double?s,?int?year,?int?month,?int?day)
???????{
??????????name?=?n;
??????????salary?=?s;
??????????GregorianCalendar?calendar?=?new?GregorianCalendar(year,?month?-?1,?day);
??????????//?GregorianCalendar?uses?0?for?January
??????????hireDay?=?calendar.getTime();
???????}
???????public?String?getName()
???????{
??????????return?name;
???????}
???????public?double?getSalary()
???????{
??????????return?salary;
???????}
???????public?Date?getHireDay()
???????{
??????????return?hireDay;
???????}
???????
???????public?void?raiseSalary(double?byPercent)
???????{
??????????double?raise?=?salary?*?byPercent?/?100;
??????????salary?+=?raise;
???????}
}
————————————————————————————————————————
//這是一個Manage類,繼承Employee類
public?class?Manager?extends?Employee?{
????private?double?bonus;
????
????public?void?setBonus(double?b){
????????bonus=b;
????}
????
????public?Manager(String?n,?double?s,?int?year,?int?month,?int?day)?{
????????super(n,?s,?year,?month,?day);
????????bonus=0;
????}
????
????public?double?getSalary(){
????????return?super.getSalary()+bonus;
????}
}
——————————————————————————————————————————————
//測試類
public?class?ManageTest?{
????public?static?void?main(String[]?args)?{
????????Employee[]?staff=new?Employee[3];
????????Manager?boss=new?Manager("Carl?Cracker",80000,1987,12,15);
????????boss.setBonus(5000);
????????staff[0]=boss;
????????staff[1]=new?Employee("Harry?Hacker",50000,1989,10,1);
????????staff[2]=new?Employee("Tommy?Tester",40000,1990,3,15);
????????
????????//首先舉個例子:報錯,編譯器將staff[0]看做Employee對象,不允許調用Manager類對象的方法。
????????staff[0].setBonus(1000);????
????????/*
?????????*?那么當for循環i=0時,staff[i]調用的getSalary()為什么還是Manager類的方法,salary=85000;
?????????*?我知道“動態綁定”這個概念。但是我不懂的問題在于:
?????????*?前面已經舉例了,編譯器將staff[0]看作Employee對象,那么應該說明編譯器不知道staff[0]是Manager對象,
?????????*?應該會調用Employee類的getSalary()方法啊。結果為什么還是調用了Manager()中的getSalary()方法?
?????????*?哪里理解錯了嗎?
?????????*/
????????for(int?i=0;i<staff.length;i++){
????????????System.out.println("name="+staff[i].getName()+",salary="+staff[i].getSalary());
????????}
????}
}
——————————————————————————
//運行結果
name=Carl?Cracker,salary=85000.0(不是我想象中的80000.0)
name=Harry?Hacker,salary=50000.0
name=Tommy?Tester,salary=40000.0
問題在測試類的注釋中。
添加回答
舉報
0/150
提交
取消