學習《JAVA編程思想》第四版

來源:互聯網
上載者:User

                                           學習《JAVA編程思想》第四版

(一)在一個類中,所有成員變數在定義時的初始化在建構函式進行初始化之前完成,就是說,先進行定義時的初始化,然後再是構造方法裡的初始化。

(二)為什麼要進行方法重載?
       1、不同類型的對象可能有相似的操作,在抽象的過程中把“相似”抽象出同一個方法名,因此進行方法的重載可以使得同名方法接受不同類型、不同數量的參數,從而對該操作的行為進行具體的控制;
       2、構造方法的存在要求必須支援方法重載。因為構造方法必須與類同名,又可能存在需要對類的成員進行不同程度的初始化(體現在構造方法的參數的類型和數量),因此構造方法必須重載。

(三)如何判斷方法重載?
       判斷方法的重載是根據“方法名”、“方法參數”和“方法參數的順序”,方法的重載必須滿足以下條件:
       1、在使用重載時只能通過不同的參數樣式。例如:不同的參數類型、不同的參數個數、不同的參數順序(當然,同一方法內的幾個參數類型必須不一樣,例如可以是fun(int, float), 但是不能為fun(int, int));
       2、不能通過“存取權限”、“傳回型別”、“拋出的異常”進行重載;
       3、方法的異常類型和數目不會對重載造成影響;
       4、對於繼承來說,如果某一方法在父類中是存取權限是priavte,那麼就不能在子類對其進行重載,如果定義的話,也只是定義了一個新方法,而不會達到重載的效果。

(四)方法的參數如果有基本類型對重載有什麼影響?
       因為基本類型會自動從較小型別提升到較大類型,因此如果傳入的int,但是類中只有f(long)和f(float),因為沒有f(int),因此int自動提升到long,從而調用f(long),提升的順序是byte-char-short-int-long-float-double。

(五)什麼叫重載的二義性?
      如果在重載方法時,其他的都相同,僅僅是傳回型別不同,則會出現二義性,比如f(){}和int f(){return 1;}。
      1、如果調用int i = f();,則編譯器能正確找到所調用的方法;
      2、如果僅僅調用f();,則編譯器沒有任何條件來確定到底應該調用哪個方法;
      所以,不能根據傳回型別來重載。

(六)為什麼在方法體內定義的局部變數必須顯式初始化?
      像java的基本類型,在定義類的成員變數時如果沒有顯式初始化,則會隱含地初始化為0或false等。但是在方法體內定義時必須進行顯示初始化,因為編譯器會認為這是程式員的一個“粗心的錯誤”,有可能他自己並不需要定義或者不是定義這種類型,顯式初始化會起到一個提示程式員的作用。

(七)當構建一個類的執行個體時,編譯器依次主要做以下三件事情:
      1、為對象分配記憶體空間;
      2、初始化對象中執行個體變數的值,初始化值可以是預設值或按指定的方式初始化。“指定的方式”可能是直接賦值、運算式賦值或調用其他任何方法賦值;
      3、調用對象的構造方法。

(八)靜態變數只有在必要的時候才執行初始化,它只在第一次使用時初始化,然後就一直存在供其他執行個體使用。“必要的時候”指:建立對象時、用類名直接存取時、在裝載類時。

(九)構造方法即使沒有顯式使用static關鍵字,它實際上是一個靜態方法。

(十)JAVA初始化順序
       JAVA類首次裝入時,會對靜態成員變數或方法進行一次初始化,但方法不被調用是不會執行的,靜態成員變數和靜態初始化塊層級相同,非靜態成員變數和非靜態初始化塊層級相同。
先初始化父類的靜態代碼--->初始化子類的靜態代碼-->(建立執行個體時,如果不建立執行個體,則後面的不執行)初始化父類的非靜態代碼--->初始化父類建構函式--->初始化子類非靜態代碼--->初始化子類建構函式
       其他說明:
      1 、類只有在使用New調用建立的時候才會被JAVA類裝載器裝入;
      2、建立類執行個體時,首先按照父子繼承關係進行初始化;
      3、類執行個體建立時候,首先初始化塊部分先執行,然後是構造方法;然後從本類繼承的子類的初始化塊執行,最後是子類的構造方法;
      4、類消除時候,首先消除子類部分,再消除父類部分;

(十一)靜態塊的初始化:靜態快就像其它的靜態初始化一樣,只進行一次:第一次建立對象時或第一次調用類的一個靜態成員(通常直接用類名訪問類的靜態成員)。
        非靜態塊的初始化的作用:1、對匿名類的初始化提供直接支援;2、保證了無論調用哪個構造方法都執行特定的初始化操作。

(十二)類的存取層級只有package和public,沒有private和protected。
        1、對於package層級的類,其方法一般設為package,但是也可以也可以設定成public。
        2、實際上,內部類的存取層級可以為private和protected,但只有這一種特殊情況。

(十三)final類型的變數分為編譯時間初始化(這種類型的常量一定是基本類型的)和運行時初始化兩種。
        final使基本類型的變數的值為常量,而使物件類型的執行個體的引用變數為常量,它不能再引用其它執行個體,但它所引用的執行個體是可以改變的。

(十四)什麼叫blank final?有什麼作用?
        成員變數在定義為final,但是暫時不顯式初始化。但是它在使用前必須被初始化,編譯器會檢查。注意:定義成final類型的基本類型的變數的隱式初始化並不起作用。
        定義成blank final的變數一般在構造方法中初始化,因此在建立類的執行個體時可以產生一些特殊效果:使得每個類的不同執行個體的這個執行個體變數擁有不同的值(要達到這種效果,就不能再加上static關鍵字了)。

(十五)final類型的參數:對方法的參數加final限制,主要用於想匿名內部類傳遞資料。

(十六) final類型的方法:一是在父類定義的方法加上final可以防止被子類覆蓋。二是早期處於效率的考慮,現在已經沒這個可言了。

(十七)類的所有private方法都隱含為final,不需要顯式聲明為final。但是private成員變數並不是final的,因為private成員變數可以隱式初始化,final的變數是不能通過隱式初始化來初始化的,因此,要是private成員變數是是final的,必須顯式地加上final關鍵字。

(十八)final類型的類不允許繼承,final類的成員變數可以是final的,也可以不是final的,由你自己決定。但是final類的所有方法都隱含是final的。

(十九)在一個類中,如果成員變數或方法定義為private,則表明該成員變數或方法並不是類提供給外部的介面。覆蓋只會發生在類提供給外部的介面上,因此如果子類定義了與父類private成員變數或方法名字、參數均相同的方法,它不是覆蓋,而是子類定義的新的方法。

(二十)方法覆蓋和方法重載具有以下相同點:
       1、都要求方法同名。
       2、都可以用於抽象方法和非抽象方法之間。
       3、方法覆蓋和方法重載具有以下不同點:
       4、方法覆蓋要求參數簽名必須一致,而方法重載要求參數簽名必須不一致。
       5、方法覆蓋要求傳回型別必須一致,而方法重載對此不做限制。
       6、方法覆蓋只能用於子類覆蓋父類的方法,方法重載用於同一個類的所有方法(包括從父類中繼承而來的方法)。
       7、方法覆蓋對方法的存取權限和拋出的異常有特殊的要求,而方法重載在這方面沒有任何限制。
       8、父類的一個方法只能被子類覆蓋一次,而一個方法在所在的類中可以被重載多次。
在覆蓋要注意以下的幾點:
     1、覆蓋的方法的標誌必須要和被覆蓋的方法的標誌完全符合,才能達到覆蓋的效果;
     2、覆蓋的方法的傳回型別必須和被覆蓋的方法的傳回型別一致;(在jdk1.4及以前的版本有此嚴格要求,從jdk1.5開始弱化了,只要求覆蓋方法的傳回型別與被覆蓋方法的傳回型別相同或者前者是後者的子類就可以了)
     3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;
     4、被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。
     5、子類方法的存取層級不能低於父類方法的存取層級。

(二十一)只有類的方法才存在多態性;類的成員變數不存在多態性;類的static方法也不存在多態性。
父類和子類如果存在同名的成員變數,則不叫覆蓋,而叫遮蓋,子類實際上包含了這兩個變數,它們的儲存空間是不同的但是子類的該變數是預設的,要想訪問父類的那個變數就必須顯式使用super來訪問。

(二十二)抽象類別可能並不包含抽象的方法,此時它的作用僅僅是使得無法建立該類的執行個體而已;

(二十三)介面可以包含成員變數,都隱含是static並且final,但是不會是blank final的(static與blank final是衝突的,參考(十四)),介面類如果沒有顯式設定存取層級,則預設為package;介面裡的方法如果沒有顯式設定存取層級,則預設為public,而不是通常的預設為package。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.