。。在后面的嘗試中我發現:
1.靜態方法中不能使用(this。變量名)來調用靜態變量,【Cannot use this in a static context】
那么,問題來了,
2.為什么在靜態方法內部類中的方法中(普通方法)可以使用(Outer。this。變量名)來調用外部類的成員變量?--不是跟第一點沖突了?也是在靜態方法下啊?!難道是內部類中的普通方法調用中調用而不是直接在外部類的靜態方法中直接調用的原因?
3.在靜態內部類中,同樣是在普通方法下面,為什么使用Outer。this。變量名就報錯了?
大哥幫忙解答一下!
下面有代碼
2015-10-06
只要類不是靜態的 就有對象,有對象就有this
2015-10-06
。。我現在知道this使用的前提是要有當前對象,然后也看了static的相關知識,靜態在對象之前就存在,加載了一次,放在內存中;然后又產生了新的問題:
要調用內部類的普通方法,必須先創建內部類的對象沒錯吧?!--所以內部類中的成員是可以用this表示的?!
現在要用this調用外部類的成員,就要看外部類的對象是不是存在;針對這個問題,可以用創建內部類對象需不需要外部類對象來判斷:
1.要是需要,說明有內類對象就肯定存在外類對象,就可以用this引用;
2.要是不需要,說明即使有內類對象也沒有外部對象,也就不能用this引用;--到目前的邏輯應該沒錯吧?
接著就具體的判斷:
1.成員內部類:明確的說了需要用外部類的對象來創建內部類的對象,所以能用this;
2.靜態內部類:也是明確的說了不需要外部類的對象來創建內部類的對象,所以不能用this;
3.方法內部類:可以分為普通方法內部類跟靜態方法內部類,普通方法內部類沒什么問題,它屬于外類的對象,所以肯定是需要對象來調用的,所以可以用this;
問題來了,靜態方法內部類需不需要用外部類的對象來創建內部類的對象呢?根據它能用this來引用,說明是需要外類對象來創建的,可是這個方法不是屬于外類的嗎,應該不需要外類的對象就能直接用???
大神幫幫忙,非常感謝!
2015-10-06
?或者你沒懂什么是靜態!你想自己想清楚為什么靜態不能使用this在來考慮別的問題
2015-10-06
只想說一句 ,你根本沒懂什么是this!就這!
2015-10-06
這是靜態方法中的內部類中的使用:在內部類的普通方法下面可以使用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();
}
2015-10-06
? 這是靜態內部類中普通方法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);
}
}
2015-10-04
................調用靜態變量兩種 ?
一種是 ?類名.變量名?
一種是 ?對象名.變量名
你自己創造了第三種!不謝!