5 回答

TA貢獻(xiàn)3條經(jīng)驗(yàn) 獲得超3個(gè)贊
這是因?yàn)閖vm加載java文件順序的問題。先加載靜態(tài)變量,靜態(tài)方法,靜態(tài)代碼塊。然后才加載變量,非靜態(tài)方法。所以在靜態(tài)方法中如果調(diào)用非靜態(tài)方法或者靜態(tài)變量,非靜態(tài)的變量和方法還沒有被jvm加載,所以會(huì)報(bào)編譯錯(cuò)誤。

TA貢獻(xiàn)3條經(jīng)驗(yàn) 獲得超5個(gè)贊
首先要理解面向?qū)ο?,搞清楚什么是“類”,什么是“?duì)象”。
靜態(tài)變量又叫類變量,靜態(tài)方法又叫類方法。為什么這么叫,因?yàn)樗麄兪菍儆陬惖?,而不是類的?duì)象的。
拿類變量來說:
public class Test {
????private int a =5;
????public static int b = a;
}
在部署類的時(shí)候就已經(jīng)生成類變量(此處的b)了,而實(shí)例變量(即非static修飾,此處的a)需要在當(dāng)前類實(shí)例化(即生成對(duì)象,編程初期可以簡(jiǎn)單理解為new)的時(shí)候才會(huì)生成。
也就是說,當(dāng)你程序跑起來的時(shí)候,即使從運(yùn)行到結(jié)束都沒用過Test類,變量b都存在,而變量a需要等到new Test()的時(shí)候才會(huì)存在。已經(jīng)存在的東西去訪問未存在的東西,這顯然是不合理的。
所以不允許。
再深層一點(diǎn),還可以探索到類變量和實(shí)例變量在內(nèi)存中存儲(chǔ)的關(guān)系,當(dāng)然這是如何理解static的問題,不是static能否訪問非static的問題,就不說了。



TA貢獻(xiàn)13條經(jīng)驗(yàn) 獲得超2個(gè)贊
public?class?StaticTest?{ public?static?void?main(String[]?args)?{ } static?void?test(){ new?StaticTest().test1(); } void?test1(){ test(); } }
不能直接調(diào)用

TA貢獻(xiàn)10條經(jīng)驗(yàn) 獲得超2個(gè)贊
非靜態(tài)方法可以調(diào)用該類的靜態(tài)方法和靜態(tài)變量;靜態(tài)方法不能調(diào)用該類的非靜態(tài)方法和非靜態(tài)變量
添加回答
舉報(bào)