從多層內部類/嵌套的類中訪問外部類的成員
本文用到名詞說明:
內部類:Inner Class
嵌套類:Static Nested Class (與標題上的嵌套的類不同,此處是專有名詞)
靜態內部類:同嵌套類一個意思,一物兩個名字而已。
在下面,我們看到對于B類來說他的嵌套層次是:AcessMethod-
〉
A-
〉
B
,
那么訪問方法如下:
class
B {
void h() {
System.out.println("h()");
g();
f();
}
AcessMethod
和
A
來說對B,都是透明的,直接調用。
嵌套類實例化的順序:有外到里!
AcessMethod-
〉
A-
〉
B
調用代碼如下:
AcessMethod am =
new
AcessMethod();
AcessMethod.A a = am.new A();
AcessMethod.A.B b = a.new B();
b.h();
這里很有意思的一點,
’.new’
語法產生了正確的作用域。
疑問:下面我們來看一下在
B.h()
中怎樣調用
A1.g()
方法?
下面我們來看是否可以在
B
中調用
A1.g()
方法,在
B.h()
方法中原則上可以這樣調用
A1.g()
但是
A1
沒有實例化,所以這樣是錯誤的,也就是在
B
中無法調用
A1
中的非靜態方法了。
假設:如果
A1.g()
為
static
類型,那么在
B
中可以這樣調用
A1
種的方法:
A1.this.g()
;
但是這是不可能的,因為在
A1.g()
不可能定義為
static
類型,詳細看下面的問題
1
(
問題1:在什么情況下可以定義static 方法),這是一個缺點吧,但是可以使用嵌套類來解決了。
/**
*
從多層嵌套類中訪問外部類的成員
.
“
.new
“語法產生了正確的作用域
*/
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();
}
}
運行結果:
h()
g()
f()
問題1:在什么情況下可以定義static 方法?
只有在頂層類中定義,或者在靜態內部類中定義,看下面的例子
public class
Test {
static void t(){}
class T2{
//!
錯誤,
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(){}
}
}