黑馬程序員-Java基礎-面向對象-類和對象、封裝、構造函數、this、static、餓漢式&懶漢式

第一講  面向對象概念java

一、  定義設計模式

相對於與面向過程而言的,將功能封裝進對象,咱們只關心具有了該功能的對象,而不用關注對象的具體細節。數組

面向對象的特色:使複雜問題簡單化。咱們只關心什麼對象能處理什麼事情,而不用關心具體的實現細節。安全

二、  面向對象特徵jvm

封裝、繼承、多態。函數

 

第二講  類和對象的關係this

一、  概述設計

類就是:對現實生活中事物的描述,能夠是實體的事物也能夠是一件事等;3d

對象是:是某類事物的實例,實實在在存在的個體;對象

映射到java中,描述就是class定義的類。

具體對象就是對應java在堆內存中用new建立的實體。

二、  舉例描述類和對象關係

           

如圖中表示:圖紙就是用於描述汽車的,而實際的汽車就是一個汽車實體。

圖紙描述的內容有:汽車的屬性(顏色、長度、寬度等),還描述了汽車的行爲(開燈、啓動等)。

第三講  封裝

一、  定義

封裝是指隱藏對象的屬性和實現細節,僅對外提供公共訪問方式,能夠利用public和private來實現封裝。

好處:將變化隔離,便於使用,提升重用性,提升安全性

封裝原則:將不須要對外提供的內容都隱藏起來;把屬性都隱藏,提供公共方法對其訪問。

二、  封裝實例

代碼中的age和name已經被封裝在Person類中。

對外提供訪問私有成員方式的緣由是:能夠在訪問方式中加入邏輯判斷等語句,對訪問的數據進行操做,提升代碼健壯性。

 

 

第四講  構造函數&構造代碼塊

一、  特色

1)       函數名是固定的,與類型相同;

2)       不用定義返回值類型,與void不一樣;

3)       不能夠寫return語句;

二、  構造函數應用

1)       對象一創建就會調用與之對應的構造函數;能夠用於給對象進行初始化。

2)       當一個類中沒有定義構造函數時,那麼系統會默認給該類加入一個空參數的構造函數,方便該類進行初始化。

3)       當在類中自定義了構造函數後,默認的構造函數就沒有了。

應用實例:能夠定義多個構造函數,由於不一樣的實例對象初始化方式可能不一樣。

三、  構造函數與通常函數的區別

1)       構造函數是在對象一創建就執行,給對象初始化;

2)       通常函數是被對象調用時才執行,給對象添加對象具有的功能;

3)       一個對象創建,構造函數只運行一次,而通常方法能夠被對對象屢次調用;

四、  判斷什麼時候定義構造函數

當分析事物時,該事物存在具有一些特性或者行爲,那麼將這些內容定義在構造函數中

五、  構造代碼塊

做用:給對象進行初始化。對象已創建就運行,並且優先於構造函數執行。

和構造函數的區別:構造代碼塊是給全部對象進行統一初始化,而構造函數是給對應的對象初始化。

第五講  this關鍵字

一、  This關鍵字

This表明的是:本類的對象,表明它所在函數所屬對象的引用,即,那個對象在調用this所在的函數,this就表明哪一個對象。

應用:

1)         用於區分局部變量和成員變量同名狀況,以下:

2)         當定義類中功能時,該函數內部要用到調用該函數的對象時,這時用this來表示這個對象。

二、  This在構造函數互調中的應用

用於構造函數之間進行互相調用。

注意:語句只能定義在構造函數的第一行,由於初始化要先與執行(當調用一個構造函數時,函數體內的this()就至關於初始化)

 

 

第六講  static關鍵字

一、  static做用

用於修飾成員(成員變量、成員函數)。

被static修飾的內容將被對象所共享,內存中將該內容和對象分開存儲。

二、  特色

1)        隨着類的加載而加載,隨着類的消失而消失,生命週期最長;

2)        優先於對象而存在,靜態是先存在,對象是後存在;

3)        被全部對象所共享;

4)        能夠直接被類類型所調用

三、  實例變量和類變量(被static修飾的成員變量)的區別

1)         內存中的位置

l  類變量隨着類的加載而存在於方法區(共享區/數據區)中;

l  實例變量隨着對象的創建而存在於堆內存中;

2)         生命週期

l  類變量生命週期最長,隨着類的加載而加載,隨着類的消失而消失;

l  實例變量生命週期隨着對象的加載而加載,隨着對象的消失而消失;

四、  靜態使用注意事項

1)        靜態方法只能訪問靜態成員

由於靜態方法隨着類的加載而加載,但非靜態成員依賴於實例對象的建立而產生,靜態方法和非靜態成員的生命週期不一樣,在調用時會出現錯誤,所以靜態方法不能調用非靜態成員。但非靜態方法既能夠訪問靜態也能夠訪問非靜態

2)        靜態方法中不能夠定義this,super關鍵字

由於靜態優先於對象存在,而this、super表明的是實例對象。

3)        主函數是靜態的

l  主函數:一個特殊的函數,做爲程序的入口,能夠被jvm調用。

l  主函數的定義:

l  Public:表明着該函數訪問權限是最大的;

l  Static:表明主函數隨着類的加載就已經存在了。

l  Void:主函數沒有具體的返回值。

l  Main:不是關鍵字,可是是一個特殊的單詞,能夠被jvm識別。

l  (string[] args):函數的參數,參數類型是一個數組,該數組中的元素是字符串,字符串類型的數組。

特色:主函數是固定格式的,只有這樣才能被jvm識別;同時主函數也有通常函數的特性,能夠被重載

 

 

五、  靜態的優劣

1) 優勢:能夠對對象的共享數據進行單獨空間的存儲,節省空間,沒有必要每個對象中都存儲一份。靜態成員能夠被類名直接調用,而非靜態成員必須經過對象來調用。

2) 劣勢:生命週期過長。訪問出現侷限性,靜態方法只能訪問靜態成員

六、  何時使用靜態

1)  何時定義靜態變量

當對象中出現共享數據時,該數據能夠被靜態所修飾;對象的特有數據須定義爲非靜態的,存放於堆內存對應的對象空間中。

2)  何時定義靜態函數

當功能內部沒有訪問到非靜態數據(對象的特有數據)時,能夠將此函數定義爲靜態的。

七、  靜態代碼塊和非靜態代碼塊

1)      靜態代碼塊:隨着類的加載而執行,只執行一次,並優先於主函數執行,用於給類進行初始化。

2)      構造代碼塊:隨着實例對象的建立而執行,每建立一個對象就會被執行一次,屬於實例對象。

執行順序:靜態代碼塊——>主函數——>構造代碼塊

         書寫格式:

         Static

{

         靜態代碼塊中的執行語句。

}

 

第七講  單例設計模式

一、  概念

設計模式:解決某一類問題最行之有效的方法,java中有23種設計模式。

單例設計模式:解決一個類在內存中只存在一個對象的問題

二、  解決對象惟一性的方法

1)        禁止其餘程序創建該類對象:將構造函數私有化;

2)        爲了讓其餘程序能夠訪問到該類對象,須要在本類中自定義一個對象;

3)        爲了能讓其餘程序訪問到該類中對象,須要對外提供一些訪問方式:提供一個公開的方法來獲取該類對象

三、  單例設計模式表現形式

1)        餓漢式:類一被加載,就會在堆內存中建立該類對象。

2)         懶漢式:只有方法被調用時,纔會建立對象。

懶漢式的缺點:當建立對象的函數同時被多個程序調用時,懶漢式可能會出現錯誤。

解決方法:能夠經過鎖定(synchronized)來解決這個問題,並且經過雙重判斷對象是否爲空,來稍微提升運行效率。

相關文章
相關標籤/搜索