在下面,我們看到對於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(){}
}
}