Asktalk

          天行健,君子以自強不息!
          posts - 21, comments - 79, trackbacks - 0, articles - 2
            BlogJava :: 首頁 ::  :: 聯系 :: 聚合  :: 管理
          從多層內部類/嵌套的類中訪問外部類的成員

          本文用到名詞說明:

          內部類:Inner Class

          嵌套類:Static Nested Class (與標題上的嵌套的類不同,此處是專有名詞)

          靜態內部類:同嵌套類一個意思,一物兩個名字而已。

           

          在下面,我們看到對于B類來說他的嵌套層次是:AcessMethod-A-B ,

          那么訪問方法如下:

          class B {
                void h() {
                  System.out.println("h()");
                  g();
                  f();
                }

          AcessMethodA來說對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(){}
            }
          }

          主站蜘蛛池模板: 会同县| 嘉禾县| 泰州市| 黄大仙区| 大理市| 搜索| 凯里市| 基隆市| 台北市| 咸丰县| 桐柏县| 丰县| 泸西县| 长丰县| 怀柔区| 石首市| 辽中县| 雷山县| 互助| 泰宁县| 百色市| 塔河县| 鹤峰县| 祁连县| 赞皇县| 莆田市| 老河口市| 迁安市| 康保县| 根河市| 朝阳区| 江源县| 新竹县| 肃宁县| 环江| 米林县| 平阴县| 临沭县| 左云县| 加查县| 潍坊市|