靜態方法無法直接呼叫非靜態成員變數和方法 看到這句話,要想到形容的是這樣的如下
靜態方法裡面無法呼叫非靜態變數
下面在寫乙個對比非靜態的方法和靜態方法呼叫變數對比
問題原因
靜態變數和靜態的方法是屬於類,不屬於物件,呼叫的時候不需要例項化(當然如果你非要例項化之後在呼叫也是可以的),
非靜態的變數和方法是屬於物件的,呼叫的需要先例項化,這也就是上面中的name報錯的原因,
大家需要注意,無法直接呼叫,並不是無法使用,我們例項化物件之後就可以呼叫的.
為了更好的理解,我寫了乙個demo
public class student
public static void ***()
public static void main(string args)
}
可以看到,靜態變數可以直接呼叫,靜態方法輸入類的,可以直接通過類.方法 的方法直接使用
非靜態的變數在靜態的方法中需要例項化物件,即是student student = new student(); 例項化物件student 然後通過物件呼叫方法和變數
為什麼靜態方法不能呼叫非靜態方法?
1.靜態方法是屬於類的,即靜態方法是隨著類的載入而載入的,在載入類時,程式就會為靜態方法分配記憶體,而非靜態方法是屬於物件的,物件是在類載入之後建立的,也就是說靜態方法先於物件存在。2.當你建立乙個物件時,程式為其在堆中分配記憶體,一般是通過this指標來指向該物件。靜態方法不依賴於物件的呼叫,它是...
為什麼靜態方法不能直接訪問非靜態成員
static成員是在jvm的classloader載入類的時候初始化的,而非static的成員是在建立物件,即new 操作的時候才初始化的 類載入的時候初始化static的成員,此時static 已經分配記憶體空間,所以可以訪問 非static的成員還沒有通過new建立物件而進行初始化,所以必然不可...
為什麼靜態方法不能直接訪問非靜態成員?
static成員是在jvm的classloader載入類的時候初始化的,而非static的成員是在建立物件,即new 操作的時候才初始化的 類載入的時候初始化static的成員,此時static 已經分配記憶體空間,所以可以訪問 非static的成員還沒有通過new建立物件而進行初始化,所以必然不可...