複用代碼的兩種方法: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代碼段都會在加載時依定義類時的書寫順序依次初始化。