有時候寫程序時常常遇到這樣的情況:
1、定義了變量和方法不知道什么時候該加上static修飾符。
2、static變量和方法與非static變量和方法有什么區別?
3、在一個類的靜態方法里為什么不能訪問該類的非靜態成員變量和方法?
4、在一個類的非靜態方法中為什么可以訪問該類的靜態變量和方法?
5、在靜態方法中為什么不能用this?
6、靜態構造函數有什么作用?
基于以上問題,我發表自己的看法如下:
1、static變量及方法不用實例化對象就可以用類名.靜態變量和類名.靜態方法這種方式進行訪問,這使得訪問更加方便,不用手工實例化對象。對于某些只讀變量和方法來說很適合共享。
2、static與非static最大的區別就是static類型的變量及方法在調用的時候就在內存中分配了地址,且這個地址只有一份,故static可以直接訪問。而非static必需手工去實例化該類,以對象的方式去訪問變量和方法。
3、在一個靜態方法里去訪問該類的非靜態變量或方法,由于static是屬于類本身的,是在類被調用的時候,static類型就已經生成,而非 static此時并沒有生成,它不屬于這個類本身,它是屬于這個類的對象。故在沒有實例化成對象的時候,在靜態方法中訪問非靜態是根本找不到它們的,它不屬于這個類。
4、在非靜態方法中去訪問靜態,由于類被調用時,靜態變量和方法就已經生成,也就是說它們屬于這個類。既然已經存在,故不管是在靜態方法中,還是非靜態方法中都可以訪問到它們。
5、this表明對象本身,而在靜態方法中并沒有對象概念存在,它只有類本身這個概念,它和對象是屬于兩種互拆的狀態,即我中無你,你中無我的情況。也就是說你用對象名.靜態變量或對象名.靜態方法是不可訪問的。
6、每個類都必須有構造函數,否則此類無法實例化成對象。而我們有時定義的類可以不寫它的構造函數,這是因為編譯器會幫我們加上一個靜態的空構造函數。這樣才能實例化。也可以用靜態構造函數去初始化靜態變量。