天天看點

Java基礎複習(六)面向對象的三大特征Java基礎複習(六)面向對象的三大特征

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(){
	}
}