1.下面這段代碼的輸出結(jié)果是什么?
ublic?class?Test?{????public?static?void?main(String[]?args)??{????????new?Circle();????}}?class?Draw?{?????????public?Draw(String?type)?{????????System.out.println(type+"?draw?constructor");????}}?class?Shape?{????private?Draw?draw?=?new?Draw("shape");?????????public?Shape(){????????System.out.println("shape?constructor");????}}?class?Circle?extends?Shape?{????private?Draw?draw?=?new?Draw("circle");????public?Circle()?{????????System.out.println("circle?constructor");????}}
這道題目主要考察的是類繼承時構(gòu)造器的調(diào)用順序和初始化順序。要記住一點:父類的構(gòu)造器調(diào)用以及初始化過程一定在子類的前面。由于Circle類的父類是Shape類,所以Shape類先進行初始化,然后再執(zhí)行Shape類的構(gòu)造器。接著才是對子類Circle進行初始化,最后執(zhí)行Circle的構(gòu)造器。
2.下面這段代碼的輸出結(jié)果是什么?
public?class?Test?{????public?static?void?main(String[]?args)??{????????Shape?shape?=?new?Circle();????????System.out.println(shape.name);????????shape.printType();????????shape.printName();????}}?class?Shape?{????public?String?name?=?"shape";?????????public?Shape(){????????System.out.println("shape?constructor");????}?????????public?void?printType()?{????????System.out.println("this?is?shape");????}?????????public?static?void?printName()?{????????System.out.println("shape");????}}?class?Circle?extends?Shape?{????public?String?name?=?"circle";?????????public?Circle()?{????????System.out.println("circle?constructor");????}?????????public?void?printType()?{????????System.out.println("this?is?circle");????}?????????public?static?void?printName()?{????????System.out.println("circle");????}}
這道題主要考察了隱藏和覆蓋的區(qū)別
覆蓋只針對非靜態(tài)方法(終態(tài)方法不能被繼承,所以就存在覆蓋一說了),而隱藏是針對成員變量和靜態(tài)方法的。這2者之間的區(qū)別是:覆蓋受RTTI(Runtime type identification)約束的,而隱藏卻不受該約束。也就是說只有覆蓋方法才會進行動態(tài)綁定,而隱藏是不會發(fā)生動態(tài)綁定的。在Java中,除了static方法和fina·方法,其他所有的方法都是動態(tài)綁定。因此,就會出現(xiàn)上面的輸出結(jié)果。
總結(jié)
父類的構(gòu)造器調(diào)用以及初始化過程一定在子類的前面
初始化順序也是按照;先對象成員初始化--->普通對象代碼塊初始化-->構(gòu)造方法初始化
以上就是長沙一度軟件培訓(xùn)java培訓(xùn)機構(gòu)的小編針對“互聯(lián)網(wǎng)常見的Java繼承基礎(chǔ)練習(xí)題”的內(nèi)容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。