覺得蠻有意思,測(cè)試之,然后把結(jié)果再記錄一下。
定義在類中方法之外的內(nèi)部類分為實(shí)例內(nèi)部類和靜態(tài)內(nèi)部類.
實(shí)例內(nèi)部類自動(dòng)持有外部類的實(shí)例的引用,即可以訪問外部類的所有變量;
靜態(tài)內(nèi)部類可以直接訪問外部類的靜態(tài)成員;
定義在方法中的內(nèi)部類叫局部內(nèi)部類,該類只能訪問被final修飾的局部變量和參數(shù)
接口定義如下:
interface Super{
public void print();
}
例子1:
代碼
public class Test {
int c=18;
public Super getInstance(){
int a=5;
final int b=6;
class Inner implements Super{
public void print() {
//局部內(nèi)部類中訪問本方法的局部變量
System.out.println(a);//編譯錯(cuò)誤: 從內(nèi)部類中訪問局部變量 a;需要被聲明為final
//內(nèi)部類中訪問成員變量
System.out.println(b);//正常
System.out.println(c);//正常
}
}
return new Inner();
}
public static void main(String[] args) {
Super s=new Test().getInstance();
s.print();
}
}
例子2:
對(duì)上面例子1的例子改變一下,從內(nèi)部類->匿名內(nèi)部類
匿名內(nèi)部類既然叫匿名,那么名字對(duì)于該類來說已經(jīng)不重要,因?yàn)樵撃涿惖膶?shí)例本來就不打算給別的類使用或重復(fù)使用,僅限于類內(nèi)部使用或使用一次,所以就不需要類名了,不過因?yàn)闆]有類名匿名內(nèi)部類也就沒有構(gòu)造函數(shù)了。
在方法里面定義的局部內(nèi)部類(不管是否匿名),它可無條件訪問外部類的成員變量,但要訪問方法的局部變量或參數(shù),就要加final修飾符。
代碼
public class Test {
int c=18;
public Super getInstance(){
int a=5;
final int b=6;
return new Super(){
public void print() {
//局部內(nèi)部類中訪問本方法的局部變量
System.out.println(a);//編譯錯(cuò)誤: 從內(nèi)部類中訪問局部變量 a;需要被聲明為final
System.out.println(b);//正常
System.out.println(c);//正常
}
};
}
public static void main(String[] args) {
Super s=new Test().getInstance();
s.print();
}
}
聯(lián)系客服