Lei❤面向對象2

下面就提出一些面向對象中用到的關鍵字

1.static關鍵字

成員變量+static=靜態變量

那我們爲什麼要加這個關鍵字呢,他有什麼作用呢

 當我們在設計類的時候 發現多個對象中有共享數據的時候 我們就可以把這個共享的數據 定義爲靜態的
 name age雖然每個對象都有 但是值不一定一樣,這個就和成員變量分開了,一個是特有數據,一個是公有

 所以我們說成員變量創建在堆內存中,那麼加了static關鍵字後,就等於說是靜態的東西從堆中對象空間抽取出來了,放在了靜態方法區

成員函數+static=靜態函數

當前成員函數如果不訪問任何成員變量的情況下 這個函數就可以定義爲靜態的

這也就是說,靜態函數不能直接調用當前類中的成員變量 無法從上下文引用非靜態

這就是爲什麼主函數是靜態的了

因爲主函數是程序的入口,優於其他運行,假設主函數是非靜態的,那麼必須先創建對象才能調用主函數,那麼創建對象時的代碼執行怎麼開始呢?這就是原因

下面談一下類都有哪些

類分爲實體類,工具類,主類/測試類

實體類:

就是爲了描述一個事物 Person Point
類中內容基本上都是成員函數/成員變量
也會而存在一個靜態成員

工具類:

 提供一些已經被實現好的功能 向外部供應
所以工具類中基本上全都是靜態函數
類.Xxx 類.Xxx() Math Arrays
爲啥工具類中都是靜態?
1.共有的
2.長時間存在
3.加載一次 後期隨便使用
如果工具類可以被創建對象 是不是就想用的時候去創建
 效率較低,所以就提供一些已經實現好的功能。

主類:

主要用於運行/測試代碼
這個類中會有主函數的存在
實體類是可以存在主函數的 但是不推薦
工具類一般不會存在主函數

這裏爲了避免出現後期的檢查與修改和閱讀,建議一個類一個java文件

2.對象的內存圖解

 1.javac 將Java源代碼進行編譯 生成字節碼文件
 2.java 將字節碼文件加載進虛擬機中 開始運行程序
    字節碼具體被加載在方法區裏面
    方法區可以大致分爲 非靜態方法區/靜態方法區
    所有非靜態的代碼(二進制)內容加載進非靜態去
    所有靜態的代碼(二進制)內容加載進靜態區
    JVM接下來會根據參數(java 字節碼文件名(類名)) 去靜態區找主函數
    將主函數代碼加載進虛擬機棧 開始運行
   3.後面的和之前一樣

3.靜態變量和成員變量的區別

1.生命週期
        成員變量隨着對象的創建而創建 隨着對象的消亡而消亡
        靜態變量隨着類的加載而創建 隨着程序結束而消失
2.調用方式
        成員變量必須先創建對象 在通過對象去調用
        靜態變量可以被對象調用 也可以直接用類調用
3.存儲位置
        成員變量存在於堆內存中對象的所屬空間裏
        靜態變量存在於靜態方法區中類的所屬空間裏
4.命名
        成員變量-對象的特有屬性
        靜態變量-對象的共有屬性 類成員

4.代碼塊

代碼塊分爲局部代碼塊,構造代碼塊,靜態代碼塊

局部代碼塊:

   存在於函數當中(包括函數) for(){...} if(){...} 

構造代碼塊:

直接在類中出現的{...}
當對象創建一次 構造代碼塊執行一次
 作用等同於構造函數

  靜態代碼塊:

直接在類中出現的static{...}
當類被加載的時候 僅且只執行一次
作用於 對類進行一些初始化操作 JDBC

可以從中領會到怎麼設計
一段優秀的代碼;您是一個高級程序員,可以從中全面瞭解到設計模式以及 Java 的邊角技術的使用;您是
一個頂級的系統分析師,可以從中獲得共鳴,尋找到項目公共問題的解決辦法,那麼那些前輩們都設計出了好多種優秀的編碼技巧模式
常見的策略模式,代理模式,單例模式,多例模式,工廠方法模式,抽象工廠模式,門面模式,適配器模式,模板方法模式等26種

5.單例模式

這個模式很有意思,而且比較簡單,但是我還是要說因爲它使用的是如此的廣泛,如此的有人緣,單例就是單一,獨苗的意思,因爲你的思維是獨一份的,古代這種例子好比皇帝,我們認爲皇帝就是個單例模式,每天參拜的皇帝是一樣的。所以它是絕對的單例模式。

那麼這種方法是具體怎樣實現的呢

1.既然只能創建一個對象的話 就得不能讓外界去創建對象

限制使用new不現實

只能從對象的創建流程中考慮 只要有一個步驟不行 對象就創建不出來
開闢空間分配地址 是由計算機底層決定 我們也控制不了
構造函數執行  只需要將構造函數私有化即可


 2.既然外界不能創建對象 我們還得保證對象的創建

所以我們只能在類內部創建對象
Single s=new Single();
能否寫成 成員變量的形式?
所以private static


 3.內部創建出對象 還得向外界提供

因爲private 外界不能直接訪問 所以見解 向外界提供一個函數 外界通過調用函數獲取對象