亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

動態綁定的疑惑:編譯器到底是看穿了一切還是啥都沒看穿

動態綁定的疑惑:編譯器到底是看穿了一切還是啥都沒看穿

七九九 2016-02-25 19:07:20
//這是一個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 問題在測試類的注釋中。
查看完整描述

2 回答

?
幽凝

TA貢獻21條經驗 獲得超8個贊

staff[0] = new Manager(....................);

staff[0].setBonus(..........);

試試

查看完整回答
反對 回復 2016-04-27
  • 2 回答
  • 0 關注
  • 1511 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號