非靜態(tài)內(nèi)部類(后面討論的都是非靜態(tài)的)能夠獲取到外部包裹類的私有的字段/方法因為: 1.外部包裹類為了讓內(nèi)部類訪問,會為每個字段創(chuàng)建一個包訪問級別的方法; 2.內(nèi)部類會產(chǎn)生一個外部包裹類的引用字段擂错,并為訪問外部包裹類的字段/方法產(chǎn)生一個靜態(tài)方法,然后通過持有的外部包裹類的引用分別獲取字段和調(diào)用相應(yīng)方法甲献。 例如:
public class OuterClass {
private int id;
public OuterClass() {
}
private void doSomeStuff() {
InnerClass innerObject = new InnerClass();
innerObject.doSomeOtherStuff();
}
private class InnerClass {
private InnerClass() {
}
private void doSomeOtherStuff() {
OuterClass.this.doSomeStuff();
}
}
}
產(chǎn)生的字節(jié)碼為:
class OuterClass {
private int id;
private void doSomeStuff() {
OuterClass$InnerClass innerObject = new OuterClass$InnerClass();
innerObject.doSomeStuff();
}
int access$0() {
return id;
}
}
class InnerClass {
OuterClass this$0;
void doSomeOtherStuff() {
InnerClass.access$100(this$0);
}
static void access$100(OuterClass outerClass) {
outerClass.doSomeStuff();
}
static int access$0(OuterClass outerClass) {
return outerClass.id;
}
}
這將導(dǎo)致訪問速度較慢,將外部包裹類中需要在內(nèi)部類中訪問的字段和方法聲明為包訪問權(quán)限的喊熟,將不會為了內(nèi)部類訪問編譯時生成相應(yīng)的靜態(tài)方法,進(jìn)行有效優(yōu)化。
public class OuterClass {
int id;
void doSomeStuff() {
InnerClass innerObject = new InnerClass();
innerObject.doSomeOtherStuff();
}
private class InnerClass {
private void doSomeOtherStuff() {
OuterClass.this.doSomeStuff();
}
}
}