//這是一個(gè)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;
???????}
}
————————————————————————————————————————
//這是一個(gè)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;
????}
}
——————————————————————————————————————————————
//測(cè)試類
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);
????????
????????//首先舉個(gè)例子:報(bào)錯(cuò),編譯器將staff[0]看做Employee對(duì)象,不允許調(diào)用Manager類對(duì)象的方法。
????????staff[0].setBonus(1000);????
????????/*
?????????*?那么當(dāng)for循環(huán)i=0時(shí),staff[i]調(diào)用的getSalary()為什么還是Manager類的方法,salary=85000;
?????????*?我知道“動(dòng)態(tài)綁定”這個(gè)概念。但是我不懂的問題在于:
?????????*?前面已經(jīng)舉例了,編譯器將staff[0]看作Employee對(duì)象,那么應(yīng)該說明編譯器不知道staff[0]是Manager對(duì)象,
?????????*?應(yīng)該會(huì)調(diào)用Employee類的getSalary()方法啊。結(jié)果為什么還是調(diào)用了Manager()中的getSalary()方法?
?????????*?哪里理解錯(cuò)了嗎?
?????????*/
????????for(int?i=0;i<staff.length;i++){
????????????System.out.println("name="+staff[i].getName()+",salary="+staff[i].getSalary());
????????}
????}
}
——————————————————————————
//運(yùn)行結(jié)果
name=Carl?Cracker,salary=85000.0(不是我想象中的80000.0)
name=Harry?Hacker,salary=50000.0
name=Tommy?Tester,salary=40000.0
問題在測(cè)試類的注釋中。
2 回答

幽凝
TA貢獻(xiàn)21條經(jīng)驗(yàn) 獲得超8個(gè)贊
staff[0] = new Manager(....................);
staff[0].setBonus(..........);
試試
添加回答
舉報(bào)
0/150
提交
取消