溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Java中使用內部類

發布時間:2021-05-10 17:53:29 來源:億速云 閱讀:225 作者:Leah 欄目:編程語言

怎么在Java中使用內部類?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

Java是什么

Java是一門面向對象編程語言,可以編寫桌面應用程序、Web應用程序、分布式系統和嵌入式系統應用程序。

一、非靜態內部類

public class OutClass {
  private String name = "outclass";
  public void show() {
    System.out.println(this.name);
  }
  public void innerShow() {
    InnerClass inner = new InnerClass();
    inner.show();
    inner.outShow();
  }
  // 非靜態內部類
  class InnerClass {
    // 2.0非靜態內部類不能有靜態變量的聲明
    // public static int age=0;
    private String name = "innerclass";
    public void show() {
      System.out.println(this.name);
    }
    public void outShow() {
      // 3.0內部類做為外部類的實例成員,可以隨意訪問其他外部類成員
      System.out.println(OutClass.this.name);
    }
  }
  public static void main(String[] args) {
    OutClass out = new OutClass();
    out.show();
    out.innerShow();
    // 1.0下面一行編譯報錯,靜態方法無法訪問this指針
    // 因為等同于this.InnerClass inner=new this.InnerClass();
    // InnerClass inner=new InnerClass();
  }
}

運行結果:

outclass
innerclass
outclass

1.外部類不能直接訪問非靜態內部類,必須在外部類中保存內部類的引用間接訪問。
2.非靜態內部類中不能有靜態屬性。

個人理解:非靜態內部類是外部類的實例成員,它屬于外部類的實例對象所擁有,若內部類有靜態屬性,那么屬性必定屬于內部類所有,即所有的內部類實例對象都共享這個屬性。但是這個內部類已經屬于外部類的實例對象所擁有了,貌似是1:1的關系,除非外部類的對象保存了n多份內部類實例的引用,那這樣內部類的靜態屬性才有存在的必要,可這么做就沒有什么意義了。

3.非靜態內部類可以隨意訪問外部類的成員,因為它們都是外部類的成員,等級一樣。

4.若要得到內部類的實例,可以

OutClass.InnerClass inner=new OutClass().new InnerClass();

二、靜態內部類

public class OutClass {
  private String name = "outclass";
  private static int age = 10;
  // 靜態內部類
  static class InnerClass {
    public void show() {
      // 1.0
      System.out.println(new OutClass().name);
    }
    public void outShow() {
      // 2.0
      System.out.println(age);
    }
  }
  public static void main(String[] args) {
    // 3.0
    OutClass.InnerClass inner = new OutClass.InnerClass();
    inner.outShow();
    inner.show();
  }
}

運行結果:

10
outclass

1.靜態內部類不能隨意訪問外部類的實例成員,必須引用外部類的對象。
2.靜態內部類可以隨意訪問外部類的類成員。
3.若要獲取靜態內部類的實例,則形式如

OutClass.InnerClass inner=new OutClass.InnerClass();

注意與非靜態內部類獲取實例的區別:

OutClass.InnerClass inner=new OutClass().new InnerClass();

三、局部類

1.匿名內部類

interface IDraw {
  void draw();
}
public class OutClass {
  public void createCircle(IDraw obj) {
    obj.draw();
  }
  public static void main(String[] args) {
    OutClass out = new OutClass();
    out.createCircle(new IDraw() {
      public void draw() {
        System.out.println("i'm drawing...");
      }
    });
  }
}

運行結果:

i'm drawing...

在調用多態形式的方法createCircle(IDraw obj)時,參數用到了new IDraw(){ },做為接口來說是不能直接實例化的,這里的new IDraw()并不是直接實例化,而是創建了匿名內部類。

2.閉包與回調

interface IDraw {
  void draw();
}
public class OutClass {
  private String name = "private name";
  public Closure getClosure() {
    return new Closure();
  }
  class Closure implements IDraw {
    public void draw() {
      System.out.println(OutClass.this.name);// name
    }
  }
  public static void main(String[] args) {
    OutClass out = new OutClass();
    out.getClosure().draw();
  }
}

運行結果:

private name

內部類可以像其他類一樣靈活的實現各種接口和繼承,并且可以將外部類的屬性和方法綁定到自身中,形成閉包。而在外部類中提供了方法供外界獲取內部類的引用,因為內部類的方法靈活的訪問了外部類的許多信息,甚至是私有信息,獲得了這個對象后可以反過來調用外部類的方法和函數形成回調。

其實上面只是有閉包的形式,并不算是真正的閉包,閉包的定義里主要是綁定方法里的變量,但是java是無法實現方法里的內部類還能訪問方法變量的,因為無法實現真正的閉包。

java內部類有許多用處,比如利用內部類實現多個接口可以模擬多繼承;比如讓內部類成為輔助外部類的工具類,來幫助外部類實現更好的邏輯與擴展。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女