java學習中,static 修飾符使用、static方法、靜態代碼塊、主函數為何如此寫、單例設計模式(java 學習中的小記錄)
作者:王可利(Star·星星)
static (靜態修飾符)
1.用來修飾成員變量
成員變量被static修飾 就叫靜態成員變量,如果沒有修飾叫非靜態成員變量。
靜態成員變量的訪問方式:
1.用對象進行訪問,直接點語法拿到。如:對象名.變量名
2.通過類名來直接訪問。 如:類名.變量名
注意:不要認為方便把所有的變量都用static修飾,只有當數據真正需要共享是才需要用static修飾。
只有靜態變量才能用類來訪問,非靜態變量只能用對象來訪問,類是不能訪問的。
靜態變量和非靜態變量的區別:
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.創建一個公開的靜態方法,判斷是否存在對象,如果不存在就創建一個,如果存在就直接返回。