大家都知道在static方法中,不能訪問類內非static成員變量和方法。可是原因是什么呢?
這首先要從static方法的特性說起。static方法,即類的靜態成員經常被稱為“成員變量”(class members),對於靜態成員變量,我們叫類屬性(class attributes),對於靜態成員方法,我們叫類方法(class members)。其中靜態成員變量:無論是否產生了對象或無論產生了多少對象的情況下,某些特定的數據在內存空間里只有一份。我們可以直接使用類名來訪問這個static變量,還可以在類的非靜態的成員方法中像訪問其他非靜態成員變量一樣去訪問這個靜態成員變量。對於靜態方法,該方法不必和對象綁在一起。訪問方式有三種,類內:非靜態成員方法可以直接訪問靜態成員方法,類外:類名.成員 對象.成員
從以上我們就可以知道,靜態成員的最大特點是不用和對象綁定在一起。這個方便的特性,也成了它的一個包袱:當在靜態成員的類外時,如果是直接用類名.靜態成員的方式訪問,靜態成員直接訪問了一個非靜態的成員(該被訪問成員一般是類內的,如果是類外的,可能就先創建對象了,因為不能直接訪問,這里的直接訪問與訪問權限沒有概念上的關系,訪問權限是設定了訪問的范圍,直接訪問則是一種訪問方式)。這個時候就出現一個問題,非靜態的成員是怎么訪問的?如果可以直接訪問,難道它也是可以脫離對象的嗎?(靜態成員的訪問是脫離了對象的,而靜態成員又直接訪問了非靜態成員)答案顯然是否定的。所以在靜態方法中不可以直接訪問類內的非靜態成員,如果要訪問非靜態成員,則要先創建對象。
也許會有這樣的疑問:既然是出在了非靜態成員身上,那么可不可以用對象.static方法直接訪問類內的成員?這個樣子的實質還是直接訪問了非靜態成員,並不是說用了對象.static方法訪問就可以改變靜態方法訪問類內成員的方式.
簡而言之:
1.Static方法是類方法,先於任何的實例(對象)存在。即Static方法在類加載時就已經存在了,但是對象是在創建時才在內存中生成。而this指代的是當前的對象2.在方法中定義使用的this關鍵字,它的值是當前對象的引用.也就是說你只能用它來調用屬於當前對象的方法或者使用this處理方法中成員變量和局部變量重名的情況. 3.而且,更為重要的是this和super都無法出現在static 修飾的方法中,static 修飾的方法是屬於類的,該方法的調用者可能是一個類,而不是對象.如果使用的是類來調用而不是對象,則 this就無法指向合適的對象.所以static 修飾的方法中不能使用this.所以甚至有人給static方法的定義就是:沒有this的方法!雖然誇張,但是卻充分說明this不能在static方法中使用!