多態(tài):參數(shù)不同,相同的類(lèi)執(zhí)行的功能不同。多態(tài)是一項(xiàng)讓程序員將改變的事物與未改變的事物分離開(kāi)來(lái)的重要特征。只有普通的方法調(diào)用可以是多態(tài)的,構(gòu)造器并不具有多態(tài)性(它實(shí)際上是static方法,只不過(guò)該static聲明是隱式的)。只有非private方法才可以被覆蓋(在導(dǎo)出類(lèi)中,對(duì)于基類(lèi)中的private方法最好采用不同名字)。
將一個(gè)方法調(diào)用同一個(gè)方法主體關(guān)聯(lián)起來(lái)被稱(chēng)為綁定,java中除了static方法和final方法(private屬于final方法)之外,其他所有的方法都是后期綁定(后期綁定;在運(yùn)行時(shí)根據(jù)對(duì)象的類(lèi)型進(jìn)行綁定)
復(fù)雜對(duì)象調(diào)用構(gòu)造器的順序:
- 調(diào)用基類(lèi)構(gòu)造器
- 按聲明順序調(diào)用成員的初始化方法
- 調(diào)用導(dǎo)出類(lèi)構(gòu)造器的主題
必須令所有構(gòu)造器都得到調(diào)用,否則就不可能正確構(gòu)造完整對(duì)象。銷(xiāo)毀的順序應(yīng)該和初始化順序相反,對(duì)于字段則意味著與聲明順序相反。
- 向上轉(zhuǎn)型會(huì)丟失具體的類(lèi)型信息
- 接口和內(nèi)部類(lèi)為我們提供了一種將接口與現(xiàn)實(shí)分離的更加結(jié)構(gòu)化的方法
- 抽象類(lèi)介于普通類(lèi)與接口之間(包含抽象方法的類(lèi)叫做抽象類(lèi))
抽象類(lèi)(abstract)和接口(interface)的區(qū)別
- 接口:只提供形式,而未提供任何實(shí)現(xiàn)。接口包含的域必須是隱式的static和final的,當(dāng)要實(shí)現(xiàn)一個(gè)接口時(shí),在接口中被定義的方法必須被定義為public。接口可以實(shí)現(xiàn)解耦合。使用接口可以達(dá)到向上轉(zhuǎn)型為多個(gè)基類(lèi)型的目的,與使用抽象基類(lèi)相同,防止客戶端程序員創(chuàng)建該類(lèi)的對(duì)象,并確保這僅僅是建立一個(gè)接口。子類(lèi)使用關(guān)鍵字implements來(lái)實(shí)現(xiàn)接口。它需要提供接口中所有聲明的方法的實(shí)現(xiàn)。接口可以繼承一個(gè)或多個(gè)接口。
- 抽象類(lèi):它可以有默認(rèn)的方法實(shí)現(xiàn)。其實(shí)現(xiàn)需要子類(lèi)使用extends關(guān)鍵字來(lái)繼承抽象類(lèi)。如果子類(lèi)不是抽象類(lèi)的話,它需要提供抽象類(lèi)中所聲明的抽象方法的實(shí)現(xiàn)。抽象類(lèi)可以有構(gòu)造器。抽象類(lèi)的速度比接口要快。
使用場(chǎng)景
- 如果擁有一些方法并且想讓它們中的一些有默認(rèn)實(shí)現(xiàn),就使用抽象類(lèi)
- 要實(shí)現(xiàn)多重繼承,就必須使用接口
- 要是基本功能在不斷改變,那么就需要使用抽象類(lèi)
內(nèi)部類(lèi)(InnerClass)相關(guān)
- 想從外部類(lèi)的非靜態(tài)方法之外的任意位置創(chuàng)建某個(gè)內(nèi)部類(lèi)的對(duì)象,那么必須像在main()方法中那樣具體地指明這個(gè)對(duì)象的類(lèi)型,即:OutClassName.InnerClassName[典型情況:外部類(lèi)有一個(gè)方法,該方法返回一個(gè)指向內(nèi)部類(lèi)的引用]。內(nèi)部類(lèi)的對(duì)象能訪問(wèn)其外圍對(duì)象的所有成員,而不需要任何特殊條件。