---------------------- android培訓、java培訓、期待與您交流! ----------------------
用法:是一個修飾符,用於修飾成員(成員變量和成員函數)。
靜態修飾內容被對象所共享。
當成員被靜態修飾後,就多了一種調用方式,除了可以被對象調用外,還可以直接被類名調用。
用法:類名.靜態成員。
被修飾後的成員具備以下特點:
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