面向物件基礎/static/this關鍵字/單例模式筆記
第三章 面向物件 3.1 面向物件概念 舉例:大象裝進冰箱 開啟冰箱-->把大象放進去-->關上冰箱 面向過程:強調的是過程(動作即函式) 開啟冰箱 把大象放進去關上冰箱,是三個獨立的功能,三個函式 C語言就是面向過程的語言 面向物件:強調的物件(實體 )。 冰箱就是一個物件,具有開啟,儲存和關閉的功能。 特點: 1.是一種常見的思想,符合人們的思考習慣,只要面對一個物件,不能面對多個函式功能 2.將複雜的問題簡單化 3大特徵:封裝、繼承、多型 3.2 類與物件的關係 類:用java語言對現實生活中的事務進行描述。 通過類的形式來體現 對於事務描述一般只關注兩個方面 屬性和行為 類的構造: 1.成員變數——屬性 2.成員函式——行為
物件:類中事物存在的個體。比如車是一個類 但有多輛車即多個物件 (該事物的例項) 在java中通過new來建立 物件的記憶體體現:
成員變數和區域性變數的區別: 1.成員變數定義在類中,整個類中都可以訪問。 區域性變數定義在函式,語句,區域性程式碼塊中,只在所屬的區域有效 2.成員變數存在堆記憶體的物件中, 區域性變數存在於棧記憶體的方法中 3.成員變數隨著物件的建立而存在,隨著物件消失而消失 區域性變數隨著所屬區域的執行而存在,隨著所屬區域的結束而釋放 4.成員變數有初始化值 區域性變數沒有預設初始化值
匿名物件:沒有名字的物件 new Car();//定義物件的簡寫格式 Car c = new Car(); c.run(); new Car().run(); 1.當物件對方法只調用一次的時候,就可以簡化成匿名物件 2.匿名物件可以作為實際引數進行傳遞 show(new Car()); 3.3 封裝:隱藏物件的實現細節,僅對外提供公共訪問方式 好處: 將變化隔離 便於使用 提高重用性 提高安全性 封裝原則: 把不需要對外提供的內容都隱藏起來 把屬性都隱藏,提供公共方法對其訪問 private: 只在本類中允許訪問 只能修飾成員變數
3.4 建構函式:被java虛擬機器識別 特點: 1.函式名與類名相同 2.不用定義返回值型別 3.沒有具體的返回值 4.不能被其它方法呼叫 作用:給物件進行初始化 注意: 預設建構函式的特點 多個建構函式是以過載的形式存在的 建立物件時,建構函式即被呼叫 建立物件都必須通過建構函式初始化 類中如果沒有定義建構函式,那麼該類中會自動定義一個預設建構函式 如果定義了指定的建構函式,那麼類中就沒有預設建構函式 建構函式不加修飾符 如void等 建構函式有return語句,但不建議使用
一般函式和建構函式的區別: 建構函式: 物件建立時,就會呼叫相對應的建構函式,對物件進行初始化 物件建立時,只被呼叫一次 一般函式: 物件建立後,需要函式功能時才呼叫 物件建立後,可以被呼叫多次。 建構函式的過載: 如Person類。 預設建構函式:Person(){}; 過載:Person(String name){} 3.5 this關鍵字 定義:代表當前物件 this是所在函式所屬物件的引用 簡單來說:哪個物件呼叫了this所在的函式,this就代表哪個物件 使用場景: 當成員變數和區域性變數重名。可以用關鍵字this來區分。 this可以用於在建構函式中呼叫其它建構函式, 但this必須在第一行 因為要初始化 3.6 static關鍵字 特點: 1.static是一個修飾符,用於修飾成員。 2.static修飾的成員被所有的物件所共享。 3.static優先於物件存在,因為static的成員隨著類的載入就已經存在 4.static修飾的成員可以直接被類名呼叫 類名.靜態成員 5.static修飾的資料是共享資料,物件中儲存的是特有資料。 成員變數和靜態變數的區別(static修飾的就是靜態變數): 1.兩個變數的生命週期不同。 成員變數隨著物件的建立而存在 隨著物件的被回收而釋放 靜態變數隨著類的載入而存在,隨著類的消失而消失。 2.呼叫方式不同 成員變數只能被物件呼叫。 靜態變數可以被物件呼叫,還可以被類名呼叫(建議) 3.別名不同 成員變數也成為例項變數 靜態變數成為類變數 4.資料儲存位置不同 成員變數儲存在堆記憶體的物件中. 靜態變數資料儲存在方法區的靜態區,也叫物件的共享資料區 注意事項: 1.靜態方法只能訪問靜態成員 因為靜態函式載入時還沒有物件 非靜態可以訪問靜態又可以訪問非靜態 2.靜態方法中不可以使用this或super關鍵字 3.主函式是靜態的 主函式: 1.格式是固定的 public:因為許可權必須是最大的 static:虛擬機器呼叫時不需要物件,直接用主函式所屬類名呼叫即可。 void:主函式沒有具體的返回值 main:函式名,不是關鍵字,只是一個jvm識別的固定的名字 String args[]:這是主函式的引數列表,是一個數組型別的引數,而且元素都是字串型別的 2.被jvm所識別的 靜態的使用場景: 1.靜態變數: 當分析物件中所具備的成員變數的值都是相同的 若資料在物件中都是不同的,就是物件的特有資料,是非靜態的 如果是相同的資料,不需要修改 可以定義成靜態的 2.靜態函式 判斷該函式功能是否有訪問到物件中的特有資料 即該功能是否需要訪問非靜態的成員變數 如果需要 則是非靜態的。 如果不需要,可以將該功能定義成靜態,也可以定義成非靜態, 但是非靜態要陪物件呼叫,而僅僅建立物件呼叫非靜態的 沒有訪問特有資料的方法,該物件的建立是沒有意義的。
靜態程式碼塊:隨著類的載入而執行,而且只執行一次 static{ System.out.println("林允兒"); }
作用:用於給類進行初始化。
構造程式碼塊(在類中):可以給所有的物件進行初始化 { }
區域性程式碼塊:在方法中,限制變數的生命週期
執行順序:靜態程式碼塊>構造程式碼塊>區域性程式碼塊
javadoc:生成文件和api 命令例如:javadoc -d myhelp -author -version ArrayTool.java 幫助命令:javadoc -help(Javadoc命令的解釋) 注:1.若有一個類的方法都是靜態的,類不需要建立物件 保證其不被建立物件 可以將建構函式私有化 3.7 單例設計模式 設計模式:是一種思想,對問題的解決方式(有23種) 單例:可以保證一個類在記憶體中的物件的唯一性 對於多個程式使用同一個配置資訊物件時,就需要保證該物件的唯一性 保證物件的唯一性 1.不允許其他程式用new建立該類物件 2.在該類中建立一個本類例項 3.對外提供一個方法讓其他程式可以獲取該物件
步驟: 1.私有化該類建構函式 2.通過new在本類中建立一個本類物件 3.定義一個公有的方法,將建立的物件返回 餓漢式:執行緒安全, 類一載入,物件就已經存在了 開發常用這個 class Single { static Single s = new Single(); private Single(){} public static Single getInstance(){ return s; } } 懶漢式:類載入的時候沒有物件,呼叫getInstance方法時才會建立物件 延遲載入形式 執行緒不安全 class Single { static Single s = null; private Single(){} public static Single getInstance(){ if(s == null) s = new Single(); return s; } }