《Java編程思想》第四版讀書筆記 第七章

複用代碼的兩種方法:java

一、組合,將對象的引用用於新類;編程

二、繼承。ide

 

7.1函數

每個非基本類型的對象都有一個toString()方法,並且當編譯器須要一個String而卻只有一個對象時,toString()方法將會被調用。測試

7.1的倒數第二段最後一句話不明白,查了一下英文原版,我以爲能夠這麼翻譯:優化

若是沒有在定義處初始化,將不能保證發送給對象的引用信息前(按做者前文所述,發送給對象的引用信息能夠理解爲咱們常說的調用對象的方法)它會被初始化,這樣將會形成運行時異常。命令行

 

7.2翻譯

Java中能夠爲每一個類都建立main()方法。即時一個程序中包含多個類,也只有命令行所調用的那個類的main()方法會被調用。即時類Cleanser不是一個public類,若是命令行滴啊用java Cleanser,那麼Cleanser.main()仍然會被調用。即便那個類只有包訪問權限,其public main()仍然是可訪問的。對象

在一個main內部還能夠顯示的調用另外一個類的main。繼承

當建立了一個導出類的對象時,該類包含了一個基類的子對象。這個子對象與用基類直接建立的對象是同樣的。兩者的區別在於後者來自於外部,而基類的子對象被包裝在導出類對象內部。

練習5是想告訴咱們,導出類中若是在定義處初始化的對象,他們執行的順序是:

基類的構造函數——導出類中定義處初始化的對象——導出類的構造函數。

通過編程測試,這個順序不管導出類有無默認構造函數,構造函數中是否顯示調用super()都成立。

7.4

若是基類擁有某個已經被屢次重載的方法名稱,導出類中另外定義一個重載的版本並不會屏蔽在基類中的任何版本(這種特性與C++不一樣)。所以,不管在該層或者它的基類中對方法進行定義,重載機制均可以正常工做。

這種機制多是會代碼變得混亂,從1.5開始增長了@Override註解。當要覆寫某個方法時,能夠選擇添加這個註解,在不留心重載而不是覆寫了這個方法,編譯器就會報錯。簡言之,@Override註解能夠防止在不想重載時意外的進行了重載。

 

7.7

做者認爲,雖然繼承在OOP編程中佔用重要的位置,可是應該謹慎使用。究竟是使用組合仍是繼承,一個最清晰的判斷方法是想想是否須要重新類向基類進行向上轉型。若是必須向上轉型,則繼承是必要的;但若是不須要,應當好好考慮是否須要繼承。

練習17在給咱們預習多態的概念,雖然函數函數是基類的引用,可是函數體內是實參(導出類)的方法被調用,而不是基類的。

7.8

使用到final有三種狀況:數據、方法和類。

final數據:

final用於基本類型則定義了該類型的一個常量;用於對象,表示該對象的引用恆定不變(而改對象的屬性是能夠更改的)。

文中說:「在對這個常量進行定義的時候,必須對其進行賦值。」這句話不能理解爲必須在定義處賦值,通過編程驗證,對於static final能夠在static語句塊中對其進行賦值,而對於final能夠在構造函數中進行賦值。也許做者想表達的意思是定義了常量,就必須在某處進行賦值。

一個既是static又是final的字段只佔據一段不能改變的存儲空間。帶有恆定初值的final static基本類型全用大寫字母命名,而且字與字之間用下劃線隔開。

咱們不能由於某數據是final的就認爲在編譯時能夠知道它的值。在運行時可以使用隨機生成的數值爲其初始化。

在參數列表中以聲明的方式將參數指明爲final。這意味着沒法在方法中更改參數引用所指向的對象,或者基本類型的值。這一特性主要用來想匿名內部類傳遞數據。

final方法:

使用final方法的主要緣由是防止任何繼承類覆蓋這個方法。

在Java早起實現,使用final方法表明該函數內聯,以便來提升代碼效率。在Java 5/6中,再也不須要使用final方法來進行優化了。

類中全部的private方法都隱式的指定爲final的。由於沒法取用private方法,因此也就沒法覆蓋它。

final類:

不能被繼承。final類中的方法隱式的被指定爲final的。

7.9

類加載發生於建立類的第一個對象或訪問了static域或static方法之時。構造函數是隱式static的。所以更準確的說,類是在其任何static成員被訪問時加載。全部的static對象和static代碼段都會在加載時依定義類時的書寫順序依次初始化。

相關文章
相關標籤/搜索