下面就提出一些面向對象中用到的關鍵字
那我們爲什麼要加這個關鍵字呢,他有什麼作用呢
當我們在設計類的時候 發現多個對象中有共享數據的時候 我們就可以把這個共享的數據 定義爲靜態的
name age雖然每個對象都有 但是值不一定一樣,這個就和成員變量分開了,一個是特有數據,一個是公有
所以我們說成員變量創建在堆內存中,那麼加了static關鍵字後,就等於說是靜態的東西從堆中對象空間抽取出來了,放在了靜態方法區
當前成員函數如果不訪問任何成員變量的情況下 這個函數就可以定義爲靜態的
這也就是說,靜態函數不能直接調用當前類中的成員變量 無法從上下文引用非靜態
這就是爲什麼主函數是靜態的了
因爲主函數是程序的入口,優於其他運行,假設主函數是非靜態的,那麼必須先創建對象才能調用主函數,那麼創建對象時的代碼執行怎麼開始呢?這就是原因
下面談一下類都有哪些
實體類:
就是爲了描述一個事物 Person Point
類中內容基本上都是成員函數/成員變量
也會而存在一個靜態成員
工具類:
提供一些已經被實現好的功能 向外部供應
所以工具類中基本上全都是靜態函數
類.Xxx 類.Xxx() Math Arrays
爲啥工具類中都是靜態?
1.共有的
2.長時間存在
3.加載一次 後期隨便使用
如果工具類可以被創建對象 是不是就想用的時候去創建
效率較低,所以就提供一些已經實現好的功能。
主類:
主要用於運行/測試代碼
這個類中會有主函數的存在
實體類是可以存在主函數的 但是不推薦
工具類一般不會存在主函數
這裏爲了避免出現後期的檢查與修改和閱讀,建議一個類一個java文件
1.javac 將Java源代碼進行編譯 生成字節碼文件
2.java 將字節碼文件加載進虛擬機中 開始運行程序
字節碼具體被加載在方法區裏面
方法區可以大致分爲 非靜態方法區/靜態方法區
所有非靜態的代碼(二進制)內容加載進非靜態去
所有靜態的代碼(二進制)內容加載進靜態區
JVM接下來會根據參數(java 字節碼文件名(類名)) 去靜態區找主函數
將主函數代碼加載進虛擬機棧 開始運行
3.後面的和之前一樣
1.生命週期
成員變量隨着對象的創建而創建 隨着對象的消亡而消亡
靜態變量隨着類的加載而創建 隨着程序結束而消失
2.調用方式
成員變量必須先創建對象 在通過對象去調用
靜態變量可以被對象調用 也可以直接用類調用
3.存儲位置
成員變量存在於堆內存中對象的所屬空間裏
靜態變量存在於靜態方法區中類的所屬空間裏
4.命名
成員變量-對象的特有屬性
靜態變量-對象的共有屬性 類成員
代碼塊分爲局部代碼塊,構造代碼塊,靜態代碼塊
局部代碼塊:
存在於函數當中(包括函數) for(){...} if(){...}
構造代碼塊:
直接在類中出現的{...}
當對象創建一次 構造代碼塊執行一次
作用等同於構造函數
靜態代碼塊:
直接在類中出現的static{...}
當類被加載的時候 僅且只執行一次
作用於 對類進行一些初始化操作 JDBC
這個模式很有意思,而且比較簡單,但是我還是要說因爲它使用的是如此的廣泛,如此的有人緣,單例就是單一,獨苗的意思,因爲你的思維是獨一份的,古代這種例子好比皇帝,我們認爲皇帝就是個單例模式,每天參拜的皇帝是一樣的。所以它是絕對的單例模式。
那麼這種方法是具體怎樣實現的呢
1.既然只能創建一個對象的話 就得不能讓外界去創建對象
限制使用new不現實
只能從對象的創建流程中考慮 只要有一個步驟不行 對象就創建不出來
開闢空間分配地址 是由計算機底層決定 我們也控制不了
構造函數執行 只需要將構造函數私有化即可
2.既然外界不能創建對象 我們還得保證對象的創建
所以我們只能在類內部創建對象
Single s=new Single();
能否寫成 成員變量的形式?
所以private static
3.內部創建出對象 還得向外界提供
因爲private 外界不能直接訪問 所以見解 向外界提供一個函數 外界通過調用函數獲取對象