亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

急急急!為什么用HelloWorld.this.score是錯誤的?

我記得前面講的靜態方法中對靜態變量的使用有兩種方法:

第一種直接用(變量名);

第二種用(實例化一個對象;對象.變量名);

應該是類似的吧,我這里不就相當于第二種方法么?

正在回答

7 回答

只要類不是靜態的 就有對象,有對象就有this

0 回復 有任何疑惑可以回復我~
#1

wswzh0329 提問者

非常感謝!
2015-10-06 回復 有任何疑惑可以回復我~

。。我現在知道this使用的前提是要有當前對象,然后也看了static的相關知識,靜態在對象之前就存在,加載了一次,放在內存中;然后又產生了新的問題:

要調用內部類的普通方法,必須先創建內部類的對象沒錯吧?!--所以內部類中的成員是可以用this表示的?!

現在要用this調用外部類的成員,就要看外部類的對象是不是存在;針對這個問題,可以用創建內部類對象需不需要外部類對象來判斷:

1.要是需要,說明有內類對象就肯定存在外類對象,就可以用this引用;

2.要是不需要,說明即使有內類對象也沒有外部對象,也就不能用this引用;--到目前的邏輯應該沒錯吧?

接著就具體的判斷:

1.成員內部類:明確的說了需要用外部類的對象來創建內部類的對象,所以能用this;

2.靜態內部類:也是明確的說了不需要外部類的對象來創建內部類的對象,所以不能用this;

3.方法內部類:可以分為普通方法內部類跟靜態方法內部類,普通方法內部類沒什么問題,它屬于外類的對象,所以肯定是需要對象來調用的,所以可以用this;

問題來了,靜態方法內部類需不需要用外部類的對象來創建內部類的對象呢?根據它能用this來引用,說明是需要外類對象來創建的,可是這個方法不是屬于外類的嗎,應該不需要外類的對象就能直接用???

大神幫幫忙,非常感謝!


0 回復 有任何疑惑可以回復我~
#1

天啟之魂

this的值到底是什么 你還是沒弄清楚,你可以理解為this實際上是方法(非靜態)在進棧后,方法里的一個局部,這個變量的值就是堆內存中某個對象的首地址值,即調用這個函數的對象的首地址值,你調用this.a 即表示你調用的是this指向的堆內存中的對象中的這個a 而方法內部類定義在方法中,可以理解這個內部類只是這個方法的一個局部變量,是沒辦法在外部直接獲取的,你需要在方法中建立一個內部類的對象,這個對象在方法的內部,所以你只能通過訪問這個方法來訪問這個內部類的對象 如果這個方法時靜態方法,這個靜態方法在加載后還是會在堆內存中產生一個新對象,而這個對象的首地址值,就是內部類的this的值
2015-10-06 回復 有任何疑惑可以回復我~
#2

wswzh0329 提問者 回復 天啟之魂

。。還是似懂非懂,堆內存跟棧還不了解,等以后在來理解吧,先記住結果。非常感謝!
2015-10-06 回復 有任何疑惑可以回復我~
#3

天啟之魂

得到你個最佳回答真心不容易,幾次被你繞進去了,有機會先學下棧內存和堆內存在建立對象時的內存體現,不然很多東西弄不清楚,imooc最不好的就是沒有講這些很關鍵的知識點
2015-10-06 回復 有任何疑惑可以回復我~
#4

wswzh0329 提問者 回復 天啟之魂

。。能被我繞進去說明我扯的有道理啊,哈哈!再次感謝!
2015-10-06 回復 有任何疑惑可以回復我~
查看1條回復

?或者你沒懂什么是靜態!你想自己想清楚為什么靜態不能使用this在來考慮別的問題

0 回復 有任何疑惑可以回復我~
#1

wswzh0329 提問者

。。我現在知道this使用的前提是要有當前對象,然后也看了static的相關知識,靜態在對象之前就存在,加載了一次,放在內存中;然后又產生了新的問題: 字數太多了,放在下面,麻煩大神看一下?。?/div>
2015-10-06 回復 有任何疑惑可以回復我~

只想說一句 ,你根本沒懂什么是this!就這!

0 回復 有任何疑惑可以回復我~

這是靜態方法中的內部類中的使用:在內部類的普通方法下面可以使用this;在靜態方法下面直接使用this就會報錯--對應問題的第二點!(可以的話順便幫我解決一下注釋中帶問號的問題,謝謝?。?/p>


//靜態方法中的內部類 ? ?注:內部類中的方法只能是普通方法

public int a=1; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//只能(new Shiyan().a)來調用

public static int A=3; ? ? ? ? ? ? ? ? ? ? ? ? ? //(Shiyan.A)和(new Shiyan().A)和(Shiyan.this.A) 要是沒有相同的還能用(A)

public static void print(){

int b=2; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //唯一的變量形式,要么設為final常量

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//要是有相同的b,如何取這個b的值??????????????????

class Inner{

public ?int c=8; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//只能是普通方法

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //(this.c)和(new Inner().c)來調用;要是沒有相同的,還能(c);

public ?void print(){ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//只能是普通方法,靜態方法就會報錯!

int d=4; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//唯一的變量形式,理由跟上面的b相同

int c=4;

System.out.println(Shiyan.this.A); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //為什么可以用?

System.out.println(b);

System.out.println(this.c);

System.out.println(d);

}

}

System.out.println(this.A); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//報錯了?!

Inner in=new Inner();

in.print();

}


0 回復 有任何疑惑可以回復我~

? 這是靜態內部類中普通方法show()下面的調用出錯的情況

? ? // 創建靜態內部類

public ?static ? ? ? ?class SInner {

? ? ? ? // 內部類中的變量score

? ? ? ? int score = 91;

? ? ? ??

public void show() {

System.out.println("訪問外部類中的score:" + HelloWorld.this.score ? ? ? ? ? );

? ? ? ? ? ? //這里為什么不能用HelloWorld.this.score

System.out.println("訪問內部類中的score:" + score);

}

}


0 回復 有任何疑惑可以回復我~

................調用靜態變量兩種 ?

一種是 ?類名.變量名?

一種是 ?對象名.變量名

你自己創造了第三種!不謝!


0 回復 有任何疑惑可以回復我~
#1

wswzh0329 提問者

。。在后面的嘗試中我發現: 1.靜態方法中不能使用(this。變量名)來調用靜態變量,【Cannot use this in a static context】 那么,問題來了, 2.為什么在靜態方法內部類中的方法中(普通方法)可以使用(Outer。this。變量名)來調用外部類的成員變量?--不是跟第一點沖突了?也是在靜態方法下啊?!難道是內部類中的普通方法調用中調用而不是直接在外部類的靜態方法中直接調用的原因? 3.在靜態內部類中,同樣是在普通方法下面,為什么使用Outer。this。變量名就報錯了? 大哥幫忙解答一下! 下面有代碼
2015-10-06 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
Java入門第二季 升級版
  • 參與學習       531142    人
  • 解答問題       6326    個

課程升級!以終為始告別枯燥,在開發和重構中體會Java面向對象編程的奧妙

進入課程

急急急!為什么用HelloWorld.this.score是錯誤的?

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號