java學習中,static 修飾符使用、static方法、靜態代碼塊、主函數爲什麼如此寫、單例設計模式(java 學習中的小記錄)java
做者:王可利(Star·星星)設計模式
static (靜態修飾符)數組
1.用來修飾成員變量mvc
成員變量被static修飾 就叫靜態成員變量,若是沒有修飾叫非靜態成員變量。jvm
靜態成員變量的訪問方式:函數
1.用對象進行訪問,直接點語法拿到。如:對象名.變量名工具
2.經過類名來直接訪問。 如:類名.變量名學習
注意:不要認爲方便把全部的變量都用static修飾,只有當數據真正須要共享是才須要用static修飾。測試
只有靜態變量才能用類來訪問,非靜態變量只能用對象來訪問,類是不能訪問的。this
靜態變量和非靜態變量的區別:
1.做用上來看:
a.靜態變量是用來共享的,全部的對象均可以訪問到
b.非靜態變量就是用來描述同一類事物的公共屬性。
2.數量和存儲的位置上:
a.靜態變量存在靜態方法區(數據共享區),而且只有一份數據。
b.非靜態變量存在堆區中,對象有N個,數據就有N個。
3.生命週期:
a.靜態變量是在隨着類文件的加載而加載,隨着類文件消失而消失。
b.非靜態變量是隨着對象建立而建立,隨着對象的消失而消失。
2.修飾方法
static 修飾的方法和OC中的類方法有點類似,OC中類方法只能用類名來調用,類是不容許訪問屬性的。
而java中static修飾的方法是能夠用對象名來調用的,也能夠用類名來調用,不過推薦使用類名調用。(這樣的話就能夠知道是直接知道是靜態方法)。
如: public static void study(){
靜態方法
}
調用:類名.方法名(); / 對象名.方法名();
結構上就是在普通方法 public 後面多加了一個static,用static修飾的方法是靜態方法,不叫類方法。
static 修飾的方法使用須要注意的點:
1.靜態方法能夠用對象和類名調用。非靜態方法只能用對象來調用。
2.靜態方法是能夠訪問靜態成員變量的,可是不可以訪問非靜態的成員變量。非靜態方法能夠訪問任何的成員變量。
緣由:有可能靜態方法被調用了,可是對象尚未被建立出來,天然就沒有成員變量。
3.靜態方法中能夠直接訪問靜態方法,可是不能訪問非靜態方法。非靜態方法是能夠訪問靜態方法。
緣由:有可能靜態方法被調用了,可是對象尚未被建立出來,又由於非靜態方法只能由對象來調用,因此調用不了。
若是對象被建立出來,靜態方法早就存在內存中了。
4.靜態方法中是不容許出現this關鍵字 或者 super關鍵字的。
this:表示一個方法調用者對象。
特色:靜態的數據在就存在於非靜態的數據存在內存中。
何時使用static來修飾方法?
當一個方法不須要直接訪問非靜態數據,這個時候就能夠用static來修飾(定於工具類 如:arrays)
靜態代碼塊
大括號{}前面加一個static就是靜態代碼塊。
格式:
static{
}
編譯java.class文件被使用的時候就執行了。使用到這個類的時候就使用了。
權限修飾符:
1.public :公共的,公開的,權限是最大的,在任何的狀況下均可以調用。
2.private:私有的,權限是最小的,只能本身本類中訪問。
3.protected:受保護的。
主函數爲何要這樣來定義?
public static void main(String[] args){}
1.爲何使用 public:
main 主方法是由jvm(java虛擬機)來調用的,jvm實際也是一個程序,因此是爲了保證jvm可以在任何狀況下來調用主函數。
2.爲何使用 static:
若是沒有static 這個時候調用主方法就須要經過對象來調用,jvm若是建立對象不知道該傳遞什麼參數(如:構造方法有無參的,或者N個參數的),因此爲了不麻煩,就將方法定義成了靜態的方法,這個時候就不須要考慮對象了,直接用類名就能夠調用。
3.爲何返回值是void :
main 是由jvm調用,返回值是給jvm ,jvm接收返回值是沒有任何意義的,因此就不須要返回值。
4. main:
main 不是一個關鍵字,沒有特別的含義,由於不少語言都以main 做爲函數的入口,因此main 已經約定好了的,這個就叫入口。
5.args:
用來接收程序運行的時候傳進來的參數。
如:額外知識:
Object-c 中遍歷數組有一個是 for in 的方法,在java中 for循環加強是 foreach 方法,括號裏面用的是 冒號 :不是分號;
代碼以下:
1 public class Star_static { 2 3 public static void main(String[] args) { 4 5 //加強for循環, java 叫 foreach循環 這裏args傳的就是一個參數。 6 for(String s : args){ 7 System.out.println(s); 8 } 9 } 10 }
能夠這樣在Demo6 後面寫參數,控制檯傳遞參數,不過這樣不方便,通常使用 Scanner會比較多。這個用的比較少。
單例設計模式
單例設計模式:一個類只可以建立一個對象出來,無論在哪裏使用都是這個類。
軟件行業中設計模式大概有23種:
可能在java學習中會講到下面的設計模式:
1.單例設計模式
2.觀察者設計模式
3.模塊設計模式(mvc)
4.裝飾設計模式
5.工廠設計模式
設計模式:用來解決同一個問題的解決方案。
如何實現單例設計模式?(目的:阻止別人用new來屢次建立對象)
詳見一下代碼註釋分析:
1 class SingleDog{ 2 3 String name; 4 5 //阻止讓別人用 new 來對次建立對象 (保證對象惟一) 6 //private 私有方法只能在本類使用,若是使用public的話,外面的類就能夠經過點語法拿到而後建立多個,就不惟一了。這樣就至關因而成員變量了。 7 private static SingleDog s = new SingleDog(); 8 9 //私有化構造方法,防止經過new來建立對象 10 private SingleDog(){} 11 12 //提供一個靜態的方法(不用建立對象就能夠調用)來接收惟一的對象 13 public static SingleDog getInstance(){ 14 return s;//返回以前new的那個對象 15 } 16 } 17 18 public class Star_dlsjmm { 19 20 public static void main(String[] args) { 21 SingleDog star1 = SingleDog.getInstance();//調用類中無參數的構造方法 22 star1.name = "星星"; 23 SingleDog star2 = SingleDog.getInstance(); 24 SingleDog star3 = SingleDog.getInstance(); 25 //若是打印的結果 star2 ,star3 不是空的 就是單例了 26 System.out.println(star1.name); 27 System.out.println(star2.name); 28 System.out.println(star3.name); 29 } 30 }
通過測試發現,單例設計模式是成功的。打印的三個對象都同樣,沒有出現null。
總結:
餓漢單例設計模式:
步驟:
1.定義一個私有的靜態成員變量來引用對象(私有的靜態對象),設置對象惟一。
2.私有化構造方法,防止new對象。
3.建立一個公開的靜態方法,返回上面的對象。
懶漢單例設計模式(要用的時候才建立對象):
步驟:
1.定於一個私有的靜態成員變量,不要賦值。
2.私有化構造方法,防止new對象。
3.建立一個公開的靜態方法,判斷是否存在對象,若是不存在就建立一個,若是存在就直接返回。