有時候寫程式時常常遇到這樣的情況: 1、定義了變數和方法不知道什麼時候該加上static修飾符。 2、static變數和方法與非static變數和方法有什麼區別? 3、在一個類的靜態方法里為什麼不能訪問該類的非靜態成員變數和方法? 4、在一個類的非靜態方法中為什麼可以訪問該類的靜態變數和方法? 5、 ...
有時候寫程式時常常遇到這樣的情況: 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、每個類都必須有構造函數,否則此類無法實例化成對象。而我們有時定義的類可以不寫它的構造函數,這是因為編譯器會幫我們加上一個靜態的空構造函數。這樣才能實例化。也可以用靜態構造函數去初始化靜態變數。