java學習中,static 修飾符使用、static方法、靜態代碼塊、主函數為何如此寫、單例設計模式(java 學習中的小記錄)


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.創建一個公開的靜態方法,判斷是否存在對象,如果不存在就創建一個,如果存在就直接返回。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM