編程思想
2.一切都是對象
2.1用引用操做對象
在java中一切都被看作對象,但實際操做對象的是對象的引用,引用於對象的關係就像電視遙控與電視,聲明一個引用而不指定對象,也是能夠的,可是運行會報空指針,至關於買了有一個遙控器,卻沒有電視.java
2.2對象的存儲地
- 寄存器 寄存器位於cpu內部速度最快但容量很小,因此java中根據需求分配寄存器.沒法顯式指定操做寄存器或向寄存器中存儲對象,咱們甚至沒法感覺到寄存器存在的痕跡
- 棧 棧位於RAM中,速度僅次於寄存器,但建立程序時,編譯器必須知道存儲在棧中的全部項的確切生命週期,這一爲了效率而產生的約束限制了棧中不能存放對象,只能存放對象的引用,^[這裏不太明白,須要閱讀更深層jvm書籍]
- 堆 堆也位於RAM中,存放了java中的全部對象,好處是編譯器不須要全部項的確切生命週期,壞處是由於不知道確切的生命週期,堆中的存儲和垃圾回收須要比棧中更多的時間.有利就有弊.java將這兩種結構與對象的數據結合,打造出合適的jvm內存管理.
- 常量池 存儲不會改變的常量.
- 特例:基本類型 對於一些很小的,簡單可是經常使用的變量,單獨爲他們在堆中建立一個對象,彷佛效率不高.對於這些類型,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的元素是棧頂元素,也就是最後一個方法調用(拋出異常之處),最後一個元素也就是棧底元素是調用的第一個方法.