程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> 從Java嵌套類中訪問外部類成員

從Java嵌套類中訪問外部類成員

編輯:JAVA編程入門知識

  在下面,我們看到對於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(){}
   }
  }
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved