java基礎———第七天

關鍵字:static(靜態)

概念:

static是一個修飾符,用於修飾成員(成員變量和成員函數)。當成員被靜態修飾後,就多了一種調用方式:除了可以被對象調用外,還可以直接被類名調用。格式:類名.靜態成員;

特點:

隨着類的加載而加載,隨着類的消失而消失。所以生命週期長。

優先對象存在,被所以對象共享,可被類名所調用。

注意:

靜態方法只能訪問靜態成員,非靜態成員即可以訪問靜態也可以訪問非靜態。

靜態方法中不能定義this、super關鍵字。主函數是靜態的。

利:節省空間,可被類直接調用。

弊:生命週期長,訪問出現侷限性。


實例變量和類變量的區別:

存在位置:

靜態變量(類變量)隨着類的加載而存在於方法區中,實例變量隨着對象的建立而存在於堆內存中。

生命週期:

靜態變量隨着類的消失而消失,實例變量隨着對象的消失而消失。、

所屬範圍:

靜態屬於整個類,被整個類所共享,實例變量時對象的特有數據,所屬對象。


靜態代碼塊

格式:static{

靜態代碼塊執行的語句

  }

特點:

隨着類的加載而加載,只執行一次並優先於主函數執行,用於給類進行初化。


靜態代碼塊和構造代碼塊:

相同點:

都是jvm加載類時且在構造方法執行前執行,在類中科定義多個。

不同點:

靜態代碼塊只在第一次new時執行一次,之後不再執行,而構造函數在每一次new一次就執行一次。

構造代碼塊可在普通方法中定義,而靜態代碼塊不行。


局部代碼塊&構造代碼塊&靜態代碼塊的作用及使用情況:

l1,局部代碼塊:
l作用:控制變量的生命週期;
l在程序中,當我們已經使用完x 後,並且在接下來的代碼中,不會再用到x,那麼就沒必要讓x 在內存中佔用空間了,這用情況下,可以使用局部代碼塊,將x及其所設計到的區域封裝爲局部代碼塊,他們在程序執行中順序不變,只是在執行完成後消失。
l2,構造代碼塊:
l作用:它可以給所有對象進行初始化
l存在於:類中。
l當類中的構造方法以重載的形式存在時,並且有共同成員變量或共同的方法時,可以通過構造代碼塊對其進行初始化;這樣可以減少代碼的重複!
l3,靜態代碼塊:
l作用:給類進行初始化。
l當類中的方法都被靜態了化,並且構造方法被private了,這時我們不能,在將這個類實例化,然而又想讓類增加一些屬性,就可以使用靜態代碼塊

什麼時候使用static?

成員變量所存儲的數據,每個變量都擁有這個數據。此時就可以用static修飾該變量,讓所有對象共享該數據。

成員函數沒有訪問對象的特有數據時,就可以將該方法定義成靜態。因爲該方法沒有訪問到對象的特有數據,所有我們再創建對象去調用方法是沒必要的,將該方法修飾爲靜態後,可直接用類名調用。


靜態的應用:

1.每一個應用程序中都有共性的功能,可以將這些功能進行抽取,獨立封裝,以便複用

2.將方法都靜態後,可方便於使用,但該類還可以被其他程序建立對象。爲了使程序更加嚴謹,強制讓該類不能建立對象,可通過將構造函數私有化實現。


設計模式

設計模式:解決某一類問題最行之有效的方法。共有23種。

單例設計模式:解決一個類在內存只存在一個對象。

餓漢式:

/*
單例設計模式之————餓漢式
	Single類一進內存,就已經創建好了對象。
*/

class Single{
	private int num;	
	private  Single(){}		//將構造函數私有化,防止創建對象
	private static Single s = new Single();

	//設置一個方法,返回創建的對象。
	public static  Single getInstance(){
		return s;
	}
	
	//設置一個方法,改變變量num的值。
	public void setNum(int num) {
		this.num = num;
	}

	//設置一個方法,返回改變後的num值。
	public int getNum() {
		return num;
	}
}

class SingleDemo {
	public static void main(String[] args) {
		Single s1 = Single.getInstance();
		Single s2 = Single.getInstance();

		s1.setNum(23);

		System.out.println(s2.getNum());
	}
}


懶漢式:

//對象是方法被調用時,才初始化,也叫做對象的延時加載。成爲:懶漢式。
//Single類進內存,對象還沒有存在,只有調用了getInstance方法時,才建立對象。
class Single{
	private static Single s = null;
	private Single(){}
	public static Single getInstance(){
		if(s==null){
			synchronized(Single.class){				
				if(s==null)
					s = new Single();
			}
		}
		return s;
	}
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章