static方法不能直接訪問類內的非static變數和不能呼叫this,super語句分析
大家都知道在static方法中,不能訪問類內非static成員變數和方法。可是原因是什麼呢?
這首先要從static方法的特性說起。static方法,即類的靜態成員經常被稱為「成員變數」(class members),對於靜態成員變數,我們叫類屬性(class attributes),對於靜態成員方法,我們叫類方法(class members)。其中靜態成員變數:無論是否產生了物件或無論產生了多少物件的情況下,某些特定的資料在記憶體空間裡只有乙份。我們可以直接使用類名來訪問這個static變數,還可以在類的非靜態的成員方法中像訪問其他非靜態成員變數一樣去訪問這個靜態成員變數。對於靜態方法,該方法不必和物件綁在一起。訪問方式有三種,類內:非靜態成員方法可以直接訪問靜態成員方法,類外:類名.成員 物件.成員
從以上我們就可以知道,靜態成員的最大特點是不用和物件繫結在一起。這個方便的特性,也成了它的乙個包袱:當在靜態成員的類外時,如果是直接用類名.靜態成員的方式訪問,靜態成員直接訪問了乙個非靜態的成員(該被訪問成員一般是類內的,如果是類外的,可能就先建立物件了,因為不能直接訪問,這裡的直接訪問與訪問許可權沒有概念上的關係,訪問許可權是設定了訪問的範圍,直接訪問則是一種訪問方式)。這個時候就出現乙個問題,非靜態的成員是怎麼訪問的?如果可以直接訪問,難道它也是可以脫離物件的嗎?(靜態成員的訪問是脫離了物件的,而靜態成員又直接訪問了非靜態成員)答案顯然是否定的。所以在靜態方法中不可以直接訪問類內的非靜態成員,如果要訪問非靜態成員,則要先建立物件。
也許會有這樣的疑問:既然是出在了非靜態成員身上,那麼可不可以用物件.static方法直接訪問類內的成員?這個樣子的實質還是直接訪問了非靜態成員,並不是說用了物件.static方法訪問就可以改變靜態方法訪問類內成員的方式.還有乙個疑問就是,super指標的使用.(意思是呼叫父類被覆蓋的方法)
例子:
class person
} class student extends person
public static void main(string args)
} //看起來,這個例子中的
public static void getinfo()
super.getinfo();語句是個靜態的方法,可以直接呼叫,但是這裡的呼叫方式卻是錯誤的,用到了super指標.如果是直接呼叫,沒有物件的話,指標從**來的?所以這個疑問也是可以打消的.
記住課本上的三條規則.還有就是main()中也是不可以使用this及super指標的.
以後的所有設想都要用**來表示,不然越說越模糊.
Static 和 構造方法
static 關鍵字 意思 靜態的。可以用來修飾屬性,方法與 塊。可以又類名呼叫,也可以由物件呼叫。而用static修飾過的變數變為靜態變數,靜態變數是類級別,之開闢乙個空間。之後對該靜態變數的每一次呼叫或修改都將改變該變數的值並儲存。靜態的方法只能呼叫靜態的屬性。在這裡插入描述 靜態的成員可以被非...
static 變數和static 函式
在c語言程式設計中,static的乙個作用是資訊遮蔽!比方說,你自己定義了乙個檔案 該檔案中有一系列的函式以及變數的宣告和定義!你希望該檔案中的一些函式和變數只能被該檔案中的函式使用,那麼,你可以在該函式 變數的前面加上static,代表他們只能被當前檔案中的函式使用!而在c 中,用static來作...
Static 變數和Static函式
static變數和static函式 一 static 變數static變數大致分為三種用法 1.用於區域性變數中,成為靜態區域性變數.靜態區域性變數有兩個用法,記憶功能和全域性生存期.2.用於全域性變數,主要作用是限制此全域性變數被其他的檔案呼叫.3.用於類中的成員.表示這個成員是屬於這個類但是不屬...