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(){}
            }
          }

          主站蜘蛛池模板: 华阴市| 长岛县| 宜川县| 隆尧县| 左贡县| 和田市| 柘荣县| 赫章县| 麦盖提县| 淮安市| 云南省| 平武县| 汉中市| 定结县| 仲巴县| 石柱| 宁陕县| 象州县| 盐亭县| 曲阜市| 福清市| 金秀| 汉寿县| 金山区| 德江县| 许昌县| 濉溪县| 斗六市| 和平县| 开鲁县| 宣威市| 宁国市| 苍梧县| 如皋市| 湖南省| 宁海县| 古田县| 沅陵县| 米林县| 马关县| 彩票|