黑馬程序員-Java語言基礎 –面向對象 第6天

 ---------------------- android培訓java培訓、期待與您交流! ----------------------


1static(靜態)關鍵字

      用法:是一個修飾符,用於修飾成員(成員變量和成員函數)。

靜態修飾內容被對象所共享。

當成員被靜態修飾後,就多了一種調用方式,除了可以被對象調用外,還可以直接被類名調用。

用法:類名.靜態成員。

被修飾後的成員具備以下特點:

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

2、優先於對象存在。明確一點,靜態是先存在的,對象是後存在的。

3、被所有對象所共享。

4、可以直接被類名調用。(類名.靜態成員)

實例變量(非靜態成員變量)和類變量(靜態成員變量)的區別:

1、存放位置

      類變量隨着類的加載而存在於方法區中。

      實例變量隨着對象的建立而存在於堆內存中

2、生命週期

      類變量生命週期最長,隨着類的消失而消失。

      實例變量生命週期隨着對象的消失而消失。

 

Static靜態使用注意事項:

1、靜態方法只能訪問靜態成員(方法、變量)。(非靜態方法既可以訪問靜態,也可以訪問非靜態。)

2、靜態方法中不可以寫this,super關鍵字。因爲靜態優先於對象存在,所以靜態方法中不可以出現this。

3、主函數是靜態的。

靜態利與弊:

利:對對象的共享數據進行單獨存儲,節省空間;可直接類名調用。

弊:生命週期過長,訪問出現侷限性。即:靜態雖好,只能訪問靜態。

 

主函數(main):public static void main(String[] args){ }

是一個特殊的函數,作爲程序的入口,被JVM調用。

定義:

public:表示該函數的訪問權限最大。

static:代表主函數隨着類的加載就已經存在了。

void:主函數沒有具體返回值。

main:不是關鍵字,但是一個特殊的單詞,可以被JVM識別。

(String[] args):函數的參數,參數類型是一個字符串類型數組,其中args(變量名)代表arguments(參數),可以改。(可在運行時傳入參數。例:java Demo args[0] args[1])

 

主函數格式固定,JVM在調用主函數時,傳入的是newString[0];(一個長度爲0的數組)

 

 

什麼時候使用靜態?

從兩方面下手:(成員變量和成員函數)因爲靜態修飾的內容有成員變量和成員函數。

1、什麼時候定義靜態變量(類變量)呢?

當對象中出現共享數據時,該數據被靜態修飾。

對象中的特有數據要定義成非靜態存在於堆內存中。

2、什麼時候定義靜態函數呢?

當功能內部沒有訪問到非靜態數據(對象特有數據)時,就可以將該功能定義成靜態的。

 

2、靜態的應用[day06-05]

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

2、每一個方法都沒有用到對象中的特有數據,那麼爲了讓程序更嚴謹,是不需要對象的,則將方法定義爲靜態的,直接通過類名調用,進一步爲了不讓該類能夠建立對象,則將構造函數私有化。

3、將.class文件發送給他人,其他人只要將文件設置到classpath路徑下,就可以使用該工具類,但對方不知道類中有什麼方法,所以需要製作程序說明文檔。

set classpath =.;c:\myclass //=.是先查找當前目錄,再查找設置目錄   

 

文檔註釋

API-Application Programming Interface(應用程序接口)

 

public class 類名(類必須是公共的才能創建註釋文檔)

/**

這是一個可以對數組進行操作的工具類,該類中提供了,獲取最值,排序等功能,

@author Lisa

@version V1.1

*/

通過javadoc -d myhelp -author -version ArrayTool.java命令生成文檔,

再通過所生成的myhelp目錄下的index.html瀏覽幫助文檔。

private和default函數不會在文檔中顯示,public和protected函數會顯示)

注意:

一個類中參數的構造函數,系統自動加上的。這個默認的構造函數的權限和所屬類一致。

如果類被public修飾,那麼默認的構造函數也帶public修飾符

如果類沒有被public修飾,那麼默認的構造函數,也沒有public修飾。

默認的構造函數的權限是隨着類的變化而變化的。

 

3、靜態代碼塊

 

格式

static

{

     靜態代碼塊中的執行語句。

}

特點:隨着類的加載而執行,只執行一次,並優先於主函數。

作用:用於給類進行初始化(一個類進內存,不需要對象的情況下,類需要做些什麼事情)

比較:

構造代碼塊:給對象進行初始化。(對象一建立就運行,而且優先於構造函數運行。)          

靜態代碼塊:用於給類進行初始化 

構造函數:給對應的對象初始化的。

 

類的加載:只有用到類的內容時才涉及類的加載問題。

例如:

StaticCode s = null;//不加載類

s = new StaticCode();//加載(默認空參構造函數)

StaticCode.show();//加載

 

4、對象的初始化過程

 

Person p = new Person("zhangsan",20);

這句話都做了什麼事情?

 

1、因爲new語句用到了Person.class,所以會先找到Person.class文件並加載到內存中。

2、執行該類中的static代碼塊,如果有的話,給Person.class類進行初始化。

3、在堆內存中開闢空間,分配內存地址。

4、在堆內存中建立對象的特有屬性。並進行默認初始化。

5、對屬性進行顯示初始化。

6、對對象進行構造代碼塊初始化。

7、對對象進行對應的構造函數初始化。

8、將內存地址賦給棧內存中的p變量。

 

5、設計模式

      解決某以問題最行之有效的方法。(Java23種設計模式[GOF])

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

想要保證對象唯一。

1、爲了避免其他程序過多建立該類對象。先禁止其他其它程序建立該對象。

2、還爲了讓其他程序,可以訪問到該類對象,只好在本類中自定義一個對象。

3、爲了方便其他程序,對自定義對象的訪問,可以對外提供一些訪問方式。

 

這三步怎麼用代碼體現呢?

1、將構造函數私有化

2、在類中創建一個本類對象。

3、提供一個方法可以獲取該對象。

 

對於事物該怎麼描述,還是怎麼描述。當需要將該事物的對象保證在內存中唯一時,就將以上三步驟加上即可。

 

單例設計模式的兩種方式:

餓漢式:先初始化對象。Single類一進內存,就已經創建好了對象。(實際開發用餓漢式

class Single

{

      private Single(){}//私有化構造函數。

      private static Single s = new Single();//(私有並靜態對象)創建一個本類函數 靜態方法,訪問靜態成員

      public static Single getInstance()//提供一個方法可以獲取該對象。(獲取實例instance)

      {

           return s;

      }

}

 

懶漢式:對象是方法被調用時才初始化,也叫做對象的延遲加載

Single類進內存時,對象還不存在,只有調用了getInstance方法時,才建立對象。

class Single

{

      private Single(){}

private static Single s = null;

      public static Single getInstance( )                   

      {

           if(s==null)

           {               

                 s = new Single;

           }

           return s;

      }

}

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;

      }

}

懶漢式有可能出現線程不同步的安全問題。(解決方法:雙重判斷(上右模式))

記住原則,定義單例時,建議使用餓漢式。



---------------------- android培訓java培訓、期待與您交流! ----------------------

詳細請查看:http://edu.csdn.net/heima




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