本文用到名詞說明:
內(nèi)部類:Inner Class
嵌套類:Static Nested Class (與標(biāo)題上的嵌套的類不同,此處是專有名詞)
靜態(tài)內(nèi)部類:同嵌套類一個(gè)意思,一物兩個(gè)名字而已。
在下面,我們看到對(duì)于B類來說他的嵌套層次是:AcessMethod-
〉
A-
〉
B
,
那么訪問方法如下:
class
B {
void h() {
System.out.println("h()");
g();
f();
}
AcessMethod
和
A
來說對(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’
語法產(chǎn)生了正確的作用域。
疑問:下面我們來看一下在
B.h()
中怎樣調(diào)用
A1.g()
方法?
下面我們來看是否可以在
B
中調(diào)用
A1.g()
方法,在
B.h()
方法中原則上可以這樣調(diào)用
A1.g()
但是
A1
沒有實(shí)例化,所以這樣是錯(cuò)誤的,也就是在
B
中無法調(diào)用
A1
中的非靜態(tài)方法了。
假設(shè):如果
A1.g()
為
static
類型,那么在
B
中可以這樣調(diào)用
A1
種的方法:
A1.this.g()
;
但是這是不可能的,因?yàn)樵?/span>
A1.g()
不可能定義為
static
類型,詳細(xì)看下面的問題
1
(
問題1:在什么情況下可以定義static 方法),這是一個(gè)缺點(diǎn)吧,但是可以使用嵌套類來解決了。
/**
*
從多層嵌套類中訪問外部類的成員
.
“
.new
“語法產(chǎn)生了正確的作用域
*/
public class AcessMethod {
private void f() {
System.out.println("f()");
}
class A1 {
private void g() {
System.out.println("A
}
}
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()
問題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(){}
}
}
聯(lián)系客服