從Java嵌套類中訪問外部類成員
在下面,我們看到對于B類來說他的嵌套層次是:AcessMethod-〉A-〉B,那么訪問方法如下:
AcessMethod和A來說對B,都是透明的,直接調用。嵌套類實例化的順序:有外到里!AcessMethod-〉A-〉B
調用代碼如下:
這里很有意思的一點,’.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 方法),這是一個缺點吧,但是可以使用嵌套類來解決了。
運行結果:h()
問題1:在什么情況下可以定義static 方法?
只有在頂層類中定義,或者在靜態內部類中定義,看下面的例子
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(){} } } |