Java基礎複習(六)面向對象的三大特征
一 封裝:
1.封裝的表現形式:
把對象的屬性和方法編寫到一個Java類中,這就是一種封裝。類中的方法,本身也是一種封裝,将完成一定功能的代碼封裝在方法體中,實作代碼的重用,方法的使用者不需要關心方法的具體實作,隻需要調用方法即可。
2.封裝的途徑:
把屬性隐藏起來,對外提供通路這些屬性的方法
在Java程式設計中,通常作法是,使用 private 通路修飾符“控制”外部對象,對成員變量的通路權限。然後,給它們(成員變量)提供公開的 (public) 通路的方法。外部“使用者”隻能通過 public 的 setter | getter 方法讀寫屬性的值。
引用類型變量作為方法的參數
當方法的參數為基本資料類型的時候,對形參的修改不會改變實參的值;
而當方法的參數為引用資料類型的時候,實參會把引用即記憶體位址傳遞給形參,這樣相當于,實參與形參,指向了記憶體中“同一個對象”,是以如果當方法參數為引用資料類型的時候,對方法的形參的修改(實際上修改的是形參指向的堆記憶體中的對象),會影響到實參的狀态。
方法(函數)的重載
在同一個類中,可以有多個同名函數,隻要其參數個數或者參數類型不同,即可(和傳回類型沒有關系)。
口訣:方法名相同,參數清單不同,傳回值類型不管。
方法重載的意義就是方法的功能相同,隻是參數不同,這樣需要使用到方法的重載,即實作同樣的功能,但是實作功能的途徑(實作的方式)不同。
單例類
保證一個類隻有一個執行個體,并且提供一個通路他的全局通路點。
單例模式分為下面幾種:
一.餓漢式:
步驟:
1.私有化構造方法;
2.提供一個公共的方法,這個方法可以傳回該類的執行個體對象;
3.建立一個私有化的靜态的類的對象
public class A{
private static A a = new A();
private A(){
System.out.println("建立了一個A的執行個體對象");
}
// 提供一個公有的可以傳回類對象的方法
public static A getSingleton(){
return a;
}
}
這種方法容易造成記憶體浪費,也未達到延遲加載的效果。
二.懶漢式(線程安全式):
步驟:
1.私有化構造方法;
2.提供一個公共的方法,這個方法可以傳回該類的執行個體對象;
3.建立一個私有化的靜态的類的對象 這裡建立類的對象的時候不要直接new出來;
4.在我們的傳回對象的公共方法中寫一個判空的處理
public class A{
private static A a = null;
private A(){
System.out.println("建立了一個A的執行個體對象");
}
public static synchronized A getSingleton() {
if(a == null) {
a = new A();
}
return a;
}
}
不足:效率低。大多數情況下這個鎖占用的額外資源都浪費了,每個線程在想獲得類的執行個體時候,執行 getSingleton() 方法都要進行同步
三.靜态内部類加載:
靜态内部類不會在單例加載時加載,當調用 getSingleton() 方法時才會進行加載,達到類似懶漢式效果,并且也是線程安全的。
類的靜态屬性隻會在第一次加載類時進行初始化,是以上面的方法JVM 幫助我們保證了線程的安全性,在類進行初始化時,其他線程無法進入。
加載一個類時,其内部類不會同時被加載。一個類被加載,當且僅當其某個靜态成員(靜态域、構造器、靜态方法等)被調用時發生,也就是說内部類:AInner隻有我們調用getSingleton()的時候才會被加載。
public class A{
private static class AInner{
private final static A instance = new A();
}
public static A getSingleton(){
return AInner.instance;
}
private A(){
}
}