Thinking in Java學(xué)習(xí)筆記(一)

          Posted on 2009-05-21 20:59 eric_xu 閱讀(220) 評(píng)論(0)  編輯  收藏 所屬分類: Java

          接口定義了對(duì)某個(gè)特定對(duì)象所能發(fā)出的請(qǐng)求。

          對(duì)象是服務(wù)提供者

          protected成員限于自己和子類訪問

          覆寫(override)與重載(overload)

          重載:方法名必需相同,參數(shù)列表必需不相同,返回值類型可以不同

          覆寫:方法名必需相同,參數(shù)列表必需相同,返回值類型必需相同

           

          看了一下java tutorial里面對(duì)接口的定義,底下附1:接口是抽取相互之間沒有關(guān)系的類的共同特征,而不用去關(guān)注類之間的關(guān)系。
                
          我覺得這個(gè)是接口和抽象類最關(guān)鍵的區(qū)別,接口是希望一組沒有層次關(guān)系的類之間可以擁有共同的行為,而抽象類作為父類的話,自然希望其子類在邏輯上和父類是有一定的關(guān)系的。比如說一個(gè)抽象類,bird,里面有fly這個(gè)方法。我們現(xiàn)在想設(shè)計(jì)一架飛機(jī)也可以飛,雖然我們可以讓plane這個(gè)類繼承bird這個(gè) 抽象類,但是這兩個(gè)完全是風(fēng)馬牛不相及的東西,自然不應(yīng)該有繼承關(guān)系了。但如果是接口設(shè)計(jì)的話,我們可以設(shè)計(jì)出一個(gè)flyable的接口,里面定義fly 的方法,因?yàn)?/span>birdplane都可以飛,所以我們可以讓鳥和飛機(jī)類去implement這個(gè)flyable的接口,然后各自實(shí)現(xiàn)不同的fly的方法。
                  java tutorial
          還有一個(gè)例子,比如說商店有若干種商品,各種商品之間一般不會(huì)有什么繼承關(guān)系,但是現(xiàn)在店主希望管理各種商品,所以店主希望所有的商品都實(shí)現(xiàn)一種可以稱為manageable的接口,里面包含用于管理的一些方法和屬性,如價(jià)格、索引號(hào)這樣的屬性或者設(shè)置零售價(jià)格這樣的方法。這樣接口就巧妙地將各種不相關(guān)的類聯(lián)系起來了。如果各種各樣的商品類implementmanageable接口,那么店主只需要面向manageable這個(gè)接口就可以管理各種商品了,而不需要考慮各種商品之間是否有什么層次關(guān)系。所以接口給編程以極大的靈活性,而常說的面向接口編程大概是這個(gè)意思吧。
                  Java
          中還有一些常用接口,比如說comparable接口,任何類只要實(shí)現(xiàn)了這個(gè)接口,都可以被compare
                 
          24個(gè)人感覺都是基于1的。不過附3,看不太懂,是什么意思。附4講到了可以通過接口實(shí)現(xiàn)多重繼承,Java的接口也突破了單繼承的限制,可以通過implements多個(gè)接口實(shí)現(xiàn)多重繼承。不過個(gè)人感覺接口志不在此,只是在語法上達(dá)到了這樣的效果。
                
          總結(jié)一下,抽象類是一種類是對(duì)一組具有相同屬性和方法的邏輯上有關(guān)系的事物的一種抽象。而接口則是對(duì)一組具有相同屬性和方法的邏輯上不相關(guān)的事物的一種抽象。

          附:You use an interface to define a protocol of behavior that can be implemented by any class anywhere in the class hierarchy. Interfaces are useful for the following:

          1.Capturing similarities among unrelated classes without artificially forcing a class relationship
          2.Declaring methods that one or more classes are expected to implement
          3.Revealing an object's programming interface without revealing its class
          4.Modeling multiple inheritance, a feature of some object-oriented languages that allows a class to have more than one superclass

          后期綁定,當(dāng)向?qū)ο蟀l(fā)送消息時(shí),被調(diào)用的代碼直到運(yùn)行時(shí)才能確定。編譯器確保被調(diào)用方法的存在,并對(duì)調(diào)用參數(shù)和返回值類型檢查,但并不知道將被執(zhí)行的確切代碼。

          為了執(zhí)行后期綁定,Java使用一小段特殊代碼來替代絕對(duì)地址調(diào)用。在Java中,動(dòng)態(tài)綁定是缺省行為。

          將導(dǎo)出類視為基類的過程為向上轉(zhuǎn)型(upcasting)

           

          abstract class方式中,Demo可以有自己的數(shù)據(jù)成員,也可以有非abstarct的成員方法,而在interface方式的實(shí)現(xiàn)中,Demo只能夠有靜態(tài)的不能被修改的數(shù)據(jù)成員(也就是必須是static final的,不過在interface中一般不定義數(shù)據(jù)成員),所有的成員方法都是abstract的。從某種意義上說,interface是一種特殊形式的abstract class 

           

          1 多態(tài)只針對(duì)非final方法;
           
          不針對(duì)變量、final方法
          2
          方法[final]是運(yùn)行時(shí)對(duì)應(yīng)對(duì)象
           
          變量、fianl是編譯期間對(duì)應(yīng)對(duì)象
          3
          多態(tài)只能調(diào)用父類中有的方法(向上擴(kuò)展后)
           
          不能調(diào)用父類中沒有的方法;
           
          不能調(diào)用子類中擴(kuò)展父類[not overridding]方法
          4
          多態(tài)定義:指的是使用同一個(gè)實(shí)現(xiàn)接口,以實(shí)現(xiàn)不同的對(duì)象實(shí)例
           
          多態(tài)好處:多態(tài)讓程序依賴接口或者抽象類,而不是具體類

           

          1.Java中除了staticfinal方法外,其他所有的方法都是運(yùn)行時(shí)綁定的。private方法都被隱式指定為 final的,因此final的方法不會(huì)在運(yùn)行時(shí)綁定。當(dāng)在派生類中重寫基類中staticfinal、或private方法時(shí),實(shí)質(zhì)上是創(chuàng)建了一個(gè)新的方法
          2.
          在派生類中,對(duì)于基類中的private方法,最好采用不同的名字。
          3.
          包含抽象方法的類叫做抽象類。注意定義里面包含這樣的意思,只要類中包含一個(gè)抽象方法,該類就是抽象類。抽象類在派生中就是作為基類的角色,為不同的子類提供通用的接口。
          4.
          對(duì)象清理的順序和創(chuàng)建的順序相反,當(dāng)然前提是自己想手動(dòng)清理對(duì)象。
          5.
          在基類的構(gòu)造方法中小心調(diào)用基類中被重寫的方法,這里涉及到對(duì)象初始化順序。
          6.
          構(gòu)造方法是被隱式聲明為static方法。
          7.
          用繼承表達(dá)行為間的差異,用字段表達(dá)狀態(tài)上的變化。


          在寫代碼的時(shí)候決定將對(duì)象放到棧里或是靜態(tài)的存儲(chǔ)區(qū)域,將存儲(chǔ)空間的分配和釋放優(yōu)先考慮。(C++,速度快)必須通過編程方式來確定何時(shí)銷毀對(duì)象,可能導(dǎo)致內(nèi)存泄漏。

          在一個(gè)被稱為堆的內(nèi)存池里動(dòng)態(tài)地創(chuàng)建對(duì)象。存儲(chǔ)空間是運(yùn)行時(shí)被動(dòng)態(tài)管理的。(Java,靈活性高)垃圾回收,自動(dòng)發(fā)現(xiàn)不再被使用的對(duì)象并銷毀。

          單根繼承體系結(jié)構(gòu)Java所有對(duì)象都具有一個(gè)共同接口,保證所有對(duì)象都具有某些功能,它們是相同的基本類型Object。使垃圾回收容易,將必須支持的功能置于基類中。

          容器很容易復(fù)用,能存儲(chǔ)Object的容器能存儲(chǔ)任何東西。

          Java程序的執(zhí)行速度會(huì)有前后不一致的情況(垃圾收集器),不能用于實(shí)時(shí)系統(tǒng)。

          posts - 37, comments - 5, trackbacks - 0, articles - 0

          Copyright © eric_xu

          主站蜘蛛池模板: 禄丰县| 龙海市| 玉龙| 宁阳县| 兰溪市| 铅山县| 敦化市| 肇东市| 麻江县| 车致| 彰武县| 扬州市| 汶上县| 徐州市| 方山县| 宝应县| 根河市| 建水县| 施甸县| 株洲县| 新宁县| 无锡市| 康乐县| 扶绥县| 宁德市| 甘谷县| 砀山县| 焉耆| 宿迁市| 芦山县| 三河市| 富源县| 和顺县| 合江县| 油尖旺区| 临沂市| 竹山县| 崇左市| 云南省| 兴仁县| 北碚区|