讀書筆記_java編程思想

編程思想

2.一切都是對象

2.1用引用操做對象

在java中一切都被看作對象,但實際操做對象的是對象的引用,引用於對象的關係就像電視遙控與電視,聲明一個引用而不指定對象,也是能夠的,可是運行會報空指針,至關於買了有一個遙控器,卻沒有電視.java

2.2對象的存儲地

  1. 寄存器 寄存器位於cpu內部速度最快但容量很小,因此java中根據需求分配寄存器.沒法顯式指定操做寄存器或向寄存器中存儲對象,咱們甚至沒法感覺到寄存器存在的痕跡
  2. 棧 棧位於RAM中,速度僅次於寄存器,但建立程序時,編譯器必須知道存儲在棧中的全部項的確切生命週期,這一爲了效率而產生的約束限制了棧中不能存放對象,只能存放對象的引用,^[這裏不太明白,須要閱讀更深層jvm書籍]
  3. 堆 堆也位於RAM中,存放了java中的全部對象,好處是編譯器不須要全部項的確切生命週期,壞處是由於不知道確切的生命週期,堆中的存儲和垃圾回收須要比棧中更多的時間.有利就有弊.java將這兩種結構與對象的數據結合,打造出合適的jvm內存管理.
  4. 常量池 存儲不會改變的常量.
  • 特例:基本類型 對於一些很小的,簡單可是經常使用的變量,單獨爲他們在堆中建立一個對象,彷佛效率不高.對於這些類型,java採用與c,c++一樣的辦法:建立一個不是引用的變量,這些變量直接存儲值,而且置於棧中,而不是使用new來建立對象,所以更加高效.這些變量被稱做基本類型變量.
  • 數組 建立一個數組對象時,實際上就是建立了一個引用數組,而且全部引用都被初始化爲一個特定值:null

2.5方法

在java中,方法是二等公民,不能單獨存在,每一個方法都必須依賴於類.要聲明方法,必須先聲明一個類來承載這個方法^[狀況在jdk8中彷佛有所改變]. 普通方法依賴於對象,必須先建立對象才能使用方法. 靜態方法依賴於類,使用類自己就能夠調用方法,沒必要須建立對象.c++

javadoc

3操做符

暫略編程

4控制執行流程

暫略設計模式

5初始化與垃圾回收

5.4 this關鍵字

一個類能夠實例化多個對象,每一個對象均可以調用類中的方法,那方法如何知道調用本身的是類中的哪一個類呢,實際上,對象調用方法時,會將本身隱式傳入方法中,想在方法中使用這個對象的話,this就能夠出場了.也就是說,this就表明調用方法的對象. 摘抄數組

5.5 清理

^[暫時略過,但很重要]jvm

5.6變量初始化

java的原則是:全部的變量在使用前(對象實例化)都應該獲得恰當的初始化,因此全部變量在聲明的時候就有一個默認值,基礎類型變量默認值是0,false等.別的變量類型爲null. 靜態變量只會在類裝載時被初始化一次,他是屬於類的,只存在一份.假設static變量時一個隨機值,屢次建立類的對象不會得到不一樣的static變量.this

5.7初始化順序

成員變量將在方法以前被賦值完畢.(避免方法中使用變量時,變量未賦值完成,引發錯誤) 1.靜態變量 2.靜態代碼塊 2.普通成員變量 3.普通代碼塊 3.構造方法(隱式static) 4.普通方法 ??靜態方法啥時候加載,爲何用不了非靜態成員變量 訪問靜態域或靜態方法會致使類的加載,類的加載會加載全部static修飾的東西,包括域和方法. 初始化會引發上述順序加載spa

5.8可變參數

5.9枚舉

總結

在C++中,大量編程錯誤都源於不正確不完整的初始化,java中爲了不重蹈覆轍,使用了構造器這種保障結構. 實例化一個對象前,構造器中及構造器以前(變量賦值)來保證初始化完整.設計

7複用類

7.1組合

7.2繼承

子類繼承父類後,不僅是將父類的屬性和方法單純複製到子類中.當建立一個子類對象時,該對象中包含了一個父類對象.這個父類對象和調用父類構造器得到的父類對象是同樣的.區別僅僅是後者來自於外部,前者被包裝在子類對象內部. 要達到上述效果,須要調用java提供給咱們的保證對象初始化成功的結構---構造器.也就是說,子類構造器中會隱式調用父類構造器.若是父類沒有空參構造器,須要在子類構造器第一行調用父類構造器,不然編譯不會經過. 子類能夠在本身的類中對父類方法進行重載,或者直接重寫覆蓋.代理

7.3代理

7.6protected

容許來自其餘包的繼承包內父類的子類訪問父類的protected域,起到保護包的做用.不繼承,不能訪問.

7.7向上轉型

子類在方法層面是父類的超集,子類中一定含有父類的全部方法,因此java容許隱式的向上轉型.由於父類能調用的方法,子類確定能夠調用. 對於域來講,父類的private域或者friendly域,顯式訪問會報錯,但子類向上轉型後訪問會編譯經過並被初始化爲null.

7.8final

static final修飾變量能夠保證變量在類中只有一份且不變. p147有加載順序,很重要

  • final基本類型變量 變量值不準改變
  • final引用類型變量 引用不容許被從新指向其餘對象,但對象自己能夠改變,包括數組,數組也是對象
  • 空白final變量 聲明變量時不賦值,在構造方法中才對final變量賦值,經過對構造方法傳參,這樣更靈活. 也就是說,final變量的肯定是在對象初始化時才肯定.這種方式侷限性也在這裏,不能用於static final修飾的變量.
  • final參數 參數引用不容許被從新賦值
  • final方法 全部private方法都隱式添加了final,由於他只對本身可見,也就不存在被子類重寫的狀況. 在子類中聲明一個方法聲明和父類private方法聲明同樣的方法,不屬於方法重寫,只是聲明瞭一個普通的子類方法.
  • final類 不容許被繼承,全部方法被隱式添加final

8多態

封裝,繼承,多態 子類能夠重寫父類的方法,而且子類引用能夠自動向上轉型爲父類引用的這一特徵,叫作繼承. 在運行期間,父類的引用能夠自動綁定爲子類引用,以自動的調用具體子類的方法的這一過程,叫作動態.注意,多態只是針對普通方法的,對象的域以及靜態方法,都不具備多態性. 子類調用順序

9接口

需結合設計模式

  • 策略模式
  • 適配器模式

12異常

12.2java中的異常

  • 異常也是類 java中的異常也是一個類對象,他也有一個默認的構造器,而且標準異常類都有一個參數爲String類型的帶參構造器,用於存儲異常信息.
  • 拋出異常與方法返回的類似之處 方法拋出異常與方法正常返回返回值有不少類似之處,好比: 1.他們均可以中斷方法繼續執行 2.正常返回會返回一個引用,拋出異常一樣也會拋出一個異常的對象引用
  • 不一樣之處: 處理返回對象的"目的地",方法返回值交給棧中的上一層調用方法,異常則交給適當的異常處理程序,具體要看誰有能力處理這個異常,一個異常可能會跨越許多方法調用棧才能找到他的處理程序.

12.3捕獲異常

異常會被第一個能夠處理他的catch語句捕獲,而且捕獲後就結束,也就是說,多個並列的catch語句並不會像swtich語句那樣被捕獲屢次.可是一個異常被捕獲後處理完也能夠繼續拋出

12.5聲明你的異常

在方法聲明上使用throws關鍵字來向上一層方法聲明你的異常,若是上一層方法有能力處理,就會處理這些異常,沒有的話,他們應該繼續向上聲明異常.

12.6棧軌跡

經過調用e.printStackTrace來打印異常信息,信息能夠經過getStackTrace來直接訪問,該方法將返回一個數組. 數組中元素是棧軌跡,每一個元素表示棧中的一幀,索引爲0的元素是棧頂元素,也就是最後一個方法調用(拋出異常之處),最後一個元素也就是棧底元素是調用的第一個方法.

相關文章
相關標籤/搜索