從多層內(nèi)部類/嵌套的類中訪問(wèn)外部類的成員
本文用到名詞說(shuō)明:
內(nèi)部類:Inner Class
嵌套類:Static Nested Class (與標(biāo)題上的嵌套的類不同,此處是專有名詞)
靜態(tài)內(nèi)部類:同嵌套類一個(gè)意思,一物兩個(gè)名字而已。
在下面,我們看到對(duì)于B類來(lái)說(shuō)他的嵌套層次是:AcessMethod-〉A-〉B ,
那么訪問(wèn)方法如下:
class B {
void h() {
System.out.println("h()");
g();
f();
}
AcessMethod和A來(lái)說(shuō)對(duì)B,都是透明的,直接調(diào)用。
嵌套類實(shí)例化的順序:有外到里!AcessMethod-〉A-〉B
調(diào)用代碼如下:
AcessMethod am = new AcessMethod();
AcessMethod.A a = am.new A();
AcessMethod.A.B b = a.new B();
b.h();
這里很有意思的一點(diǎn),’.new’語(yǔ)法產(chǎn)生了正確的作用域。
疑問(wèn):下面我們來(lái)看一下在B.h()中怎樣調(diào)用A1.g()方法?
下面我們來(lái)看是否可以在B中調(diào)用A1.g()方法,在B.h()方法中原則上可以這樣調(diào)用A1.g()但是A1沒(méi)有實(shí)例化,所以這樣是錯(cuò)誤的,也就是在B中無(wú)法調(diào)用A1中的非靜態(tài)方法了。
假設(shè):如果A1.g()為static類型,那么在B中可以這樣調(diào)用A1種的方法:A1.this.g();
但是這是不可能的,因?yàn)樵?/span>A1.g()不可能定義為static類型,詳細(xì)看下面的問(wèn)題1(問(wèn)題1:在什么情況下可以定義static 方法),這是一個(gè)缺點(diǎn)吧,但是可以使用嵌套類來(lái)解決了。
/**
* 從多層嵌套類中訪問(wèn)外部類的成員. “.new“語(yǔ)法產(chǎn)生了正確的作用域
*/
public class AcessMethod {
private void f() {
System.out.println("f()");
}
class A1 {
private void g() {
System.out.println("A1 - g()");
}
}
class A {
private void g() {
System.out.println("g()");
}
class B {
void h() {
System.out.println("h()");
g();
f();
}
}
}
public static void main(String[] args) {
AcessMethod am = new AcessMethod();
AcessMethod.A a = am.new A();
AcessMethod.A.B b = a.new B();
b.h();
}
}
運(yùn)行結(jié)果:h()
g()
f()
問(wèn)題1:在什么情況下可以定義static 方法?
只有在頂層類中定義,或者在靜態(tài)內(nèi)部類中定義,看下面的例子
public class Test {
static void t(){}
class T2{
//!錯(cuò)誤,The method a cannot be declared static;
//static methods can only be declared in a static or top level type
//static void a(){}
}
static class T3{
static void a(){}
}
}