第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

關(guān)于繼承的小問題

關(guān)于繼承的小問題

狐的傳說 2019-05-25 13:32:10
剛從大學(xué)進入工作崗位的實習(xí)生,java方向,進入工作崗位后才知以前學(xué)的東西只是知其一不知其二....再從溫習(xí)繼承一塊有個疑問//定義一個昆蟲類,里面有攻擊和移動兩個方法packagetest03;publicclassInsect{privateintsize;privateStringcolor;publicintgetSize(){returnsize;}publicvoidsetSize(intsize){this.size=size;}publicStringgetColor(){returncolor;}publicvoidsetColor(Stringcolor){this.color=color;}publicInsect(intsize,Stringcolor){this.size=size;this.color=color;}//移動publicvoidmove(){System.out.println("move");}//攻擊publicvoidattack(){//攻擊之前要移動move();System.out.println("attack");}}packagetest03;//定義一個蜜蜂類,并繼承昆蟲夫類publicclassBeeextendsInsect{publicBee(intsize,Stringcolor){super(size,color);}@Overridepublicvoidmove(){System.out.println("fly");}@Overridepublicvoidattack(){move();//這里super會調(diào)用夫類Insect.attack方法super.attack();//System.out.println("Attack");}}/*測試類*/publicclassTestMain{publicstaticvoidmain(String[]args){Beeb=newBee(1,"red");b.attack();}}//顯示效果是flyflyattack第一個fly是執(zhí)行了Bee類里的move方法,super.attack();執(zhí)行后會走到父類里的attack里再繼續(xù)為什么走Bee的move()而不是父類的move()whynot?flymoveattack
查看完整描述

2 回答

?
MM們

TA貢獻1886條經(jīng)驗 獲得超2個贊

1、java類是運行在jvm(java虛擬機)中的,所以這里的執(zhí)行效果取決于jvm規(guī)范對于方法執(zhí)行效果的定義2、jvm在執(zhí)行一個方法的時候,有以下知識點
2.1.執(zhí)行方法前,虛擬機讀取class文件至內(nèi)存,并生成對應(yīng)的Class對象放在靜態(tài)區(qū)中。跟你這個問題比較相關(guān)的一點是,虛擬機會針對每個類的所有方法,形成一個虛函數(shù)表,以實現(xiàn)運行(調(diào)用)時的快速查找。
2.2.當(dāng)加載一個具有繼承體系的類時,會先加載父類,先調(diào)用父類的構(gòu)造函數(shù),在執(zhí)行子類的構(gòu)造函數(shù)。虛函數(shù)表的生成同樣也具有這種先后順序。子類會覆蓋同名的父類虛方法表中同名同可見性方法。
2.3.具有繼承層次的類的虛方法表查找,默認先查找子類虛方法表,找不到才會找父類的。
結(jié)合題主的例子,當(dāng)TestMain中,執(zhí)行到b.attack();方法時,默認讀取的自然是bee類的虛函數(shù)表,由2.2可知:
第一個fly:bee.attack()——>bee.move()
第二個fly:bee.attack()——>bee.move()——>inset.attack()——>bee.move()
//之所以這里會由insect.attack()里執(zhí)行到bee.move()就是前面說得,insect作為實例化bee類順帶生成的內(nèi)置父類對象,默認讀取虛方法表會優(yōu)先從子類開始查找
題外話,題主可以思考一下為什么java要這么設(shè)計虛方法表的調(diào)用邏輯,與多態(tài)的實現(xiàn)又有什么關(guān)系?
有關(guān)jvm內(nèi)存機制的具體知識,可見傳送門:《深入理解java虛擬機》學(xué)習(xí)筆記系列——java內(nèi)存區(qū)域劃分《深入理解java虛擬機》學(xué)習(xí)筆記系列——對象的內(nèi)存布局《深入理解java虛擬機》學(xué)習(xí)筆記系列——垃圾收集器&內(nèi)存分配策略
                            
查看完整回答
反對 回復(fù) 2019-05-25
?
MMTTMM

TA貢獻1869條經(jīng)驗 獲得超4個贊

因為Bee類繼承了Insect類,所以Bee類調(diào)用方法會優(yōu)先到當(dāng)前類中找尋,沒有才會調(diào)用父類的方法,由于Bee類自己存在move方法的,所以就不會調(diào)用父類的move方法,而為什么會調(diào)用父類的attack方法是因為你用了super,如果你用super.move
                            
查看完整回答
反對 回復(fù) 2019-05-25
  • 2 回答
  • 0 關(guān)注
  • 227 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號