溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

詳談Java靜態(tài)動(dòng)態(tài)的問(wèn)題

發(fā)布時(shí)間:2020-09-01 12:12:29 來(lái)源:腳本之家 閱讀:139 作者:jingxian 欄目:編程語(yǔ)言

Cannot make a static reference to the non-static field

靜態(tài)方法中不能引用非靜態(tài)成員變量及方法

class A {
  private int a = 1;

  public sttaic void main(String[] args){
    System.out.println(a);
  }
}

因?yàn)閷?shí)例變量應(yīng)該是具體對(duì)象的狀態(tài),應(yīng)該先A a =  new A();然后System.out.println(a,a);

或者將變量改為static

No enclosing instance of type EventApp4 is accessible. Must qualify the allocation with an enclosing instance of type EventApp4 (e.g. x.new A() where x is an instance of EventApp4).

原因:內(nèi)部類沒(méi)有用static限定,所以是動(dòng)態(tài)的,而我在main函數(shù)中new了這個(gè)內(nèi)部類。為什么這樣就出現(xiàn)問(wèn)題了呢,因?yàn)殪o態(tài)的方法以及變量在類加載之時(shí)就已經(jīng)進(jìn)入內(nèi)存了,但是非靜態(tài)的方法和變量只能在實(shí)例化之后才會(huì)進(jìn)入內(nèi)存,所以在靜態(tài)方法中new非靜態(tài)的內(nèi)部類就會(huì)出錯(cuò),因?yàn)榇藭r(shí)這個(gè)內(nèi)部類還不存在呢。反之,在動(dòng)態(tài)方法中new靜態(tài)方法是不會(huì)出現(xiàn)錯(cuò)誤的,原因同樣,靜態(tài)的在非靜態(tài)的之前就已經(jīng)存在了。

從java的內(nèi)存機(jī)制去分析,首先當(dāng)你New 一個(gè)對(duì)象的時(shí)候,并不是先在堆中為對(duì)象開(kāi)辟內(nèi)存空間,而是先將類中的靜態(tài)方法(帶有static修飾的靜態(tài)函數(shù))的代碼加載到一個(gè)叫做方法區(qū)的地方,然后再在堆內(nèi)存中創(chuàng)建對(duì)象。所以說(shuō)靜態(tài)方法會(huì)隨著類的加載而被加載。當(dāng)你new一個(gè)對(duì)象時(shí),該對(duì)象存在于對(duì)內(nèi)存中,this關(guān)鍵字一般指該對(duì)象,但是如果沒(méi)有new對(duì)象,而是通過(guò)類名調(diào)用該類的靜態(tài)方法也可以。

遇到遇上問(wèn)題時(shí),有以下原則

1.在main中,使用靜態(tài)方法靜態(tài)變量靜態(tài)類,即將變量、方法都限定為static

2.在main中,實(shí)例化本類或其他類(要使用的類)

3.將main中的語(yǔ)句放進(jìn)構(gòu)造函數(shù)中,在main中實(shí)例化本類,因?yàn)闃?gòu)造函數(shù)中可以使用本類的引用this

以上這篇詳談Java靜態(tài)動(dòng)態(tài)的問(wèn)題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持億速云。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI