static方法不能直接訪問類內的非static變量和不能調用this,super語句分析

你們都知道在static方法中,不能訪問類內非static成員變量和方法。但是緣由是什麼呢? this

這首先要從static方法的特性提及。static方法,即類的靜態成員常常被稱爲「成員變量」(class members),對於靜態成員變量,咱們叫類屬性(class attributes),對於靜態成員方法,咱們叫類方法(class members)。其中靜態成員變量:不管是否產生了對象或不管產生了多少對象的狀況下,某些特定的數據在內存空間裏只有一份。咱們能夠直接使用類名來訪問這個static變量,還能夠在類的非靜態的成員方法中像訪問其餘非靜態成員變量同樣去訪問這個靜態成員變量。對於靜態方法,該方法沒必要和對象綁在一塊兒。訪問方式有三種,類內:非靜態成員方法能夠直接訪問靜態成員方法,類外:類名.成員  對象.成員 對象

從以上咱們就能夠知道,靜態成員的最大特色是不用和對象綁定在一塊兒。這個方便的特性,也成了它的一個包袱:當在靜態成員的類外時,若是是直接用類名.靜態成員的方式訪問,靜態成員直接訪問了一個非靜態的成員(該被訪問成員通常是類內的,若是是類外的,可能就先建立對象了,由於不能直接訪問,這裏的直接訪問與訪問權限沒有概念上的關係,訪問權限是設定了訪問的範圍,直接訪問則是一種訪問方式)。這個時候就出現一個問題,非靜態的成員是怎麼訪問的?若是能夠直接訪問,難道它也是能夠脫離對象的嗎?(靜態成員的訪問是脫離了對象的,而靜態成員又直接訪問了非靜態成員)答案顯然是否認的。因此在靜態方法中不能夠直接訪問類內的非靜態成員,若是要訪問非靜態成員,則要先建立對象。 內存

也許會有這樣的疑問:既然是出在了非靜態成員身上,那麼可不能夠用對象.static方法直接訪問類內的成員?這個樣子的實質仍是直接訪問了非靜態成員,並非說用了對象.static方法訪問就能夠改變靜態方法訪問類內成員的方式. class

簡而言之:變量

1.Static方法是類方法,先於任何的實例(對象)存在。即Static方法在類加載時就已經存在了,可是對象是在建立時纔在內存中生成。而this指代的是當前的對象

2.在方法中定義使用的this關鍵字,它的值是當前對象的引用.也就是說你只能用它來調用屬於當前對象的方法或者使用this處理方法中成員變量和局部變量重名的狀況. 

3.並且,更爲重要的是this和super都沒法出如今static 修飾的方法中,static 修飾的方法是屬於類的,該方法的調用者多是一個類,而不是對象.若是使用的是類來調用而不是對象,則 this就沒法指向合適的對象.因此static 修飾的方法中不能使用this.因此甚至有人給static方法的定義就是:沒有this的方法!雖然誇張,可是卻充分說明this不能在static方法中使用!
相關文章
相關標籤/搜索