5 回答

十三灬叔
TA貢獻3條經驗 獲得超3個贊
這是因為jvm加載java文件順序的問題。先加載靜態變量,靜態方法,靜態代碼塊。然后才加載變量,非靜態方法。所以在靜態方法中如果調用非靜態方法或者靜態變量,非靜態的變量和方法還沒有被jvm加載,所以會報編譯錯誤。

不斯文敗類
TA貢獻3條經驗 獲得超5個贊
首先要理解面向對象,搞清楚什么是“類”,什么是“對象”。
靜態變量又叫類變量,靜態方法又叫類方法。為什么這么叫,因為他們是屬于類的,而不是類的對象的。
拿類變量來說:
public class Test {
????private int a =5;
????public static int b = a;
}
在部署類的時候就已經生成類變量(此處的b)了,而實例變量(即非static修飾,此處的a)需要在當前類實例化(即生成對象,編程初期可以簡單理解為new)的時候才會生成。
也就是說,當你程序跑起來的時候,即使從運行到結束都沒用過Test類,變量b都存在,而變量a需要等到new Test()的時候才會存在。已經存在的東西去訪問未存在的東西,這顯然是不合理的。
所以不允許。
再深層一點,還可以探索到類變量和實例變量在內存中存儲的關系,當然這是如何理解static的問題,不是static能否訪問非static的問題,就不說了。



hello_world_mk
TA貢獻13條經驗 獲得超2個贊
public?class?StaticTest?{ public?static?void?main(String[]?args)?{ } static?void?test(){ new?StaticTest().test1(); } void?test1(){ test(); } }
不能直接調用
添加回答
舉報
0/150
提交
取消