1. 程式人生 > 程式設計 >詳細分析Java內部類——區域性內部類

詳細分析Java內部類——區域性內部類

  今天介紹第二種內部類——區域性內部類。

  區域性內部類是什麼?顧名思義,那就是定義在區域性內部的類(逃)。開玩笑的,區域性內部類就是定義在程式碼塊、方法體內、作用域(使用花括號“{}”括起來的一段程式碼)內的類。區域性內部類有以下特性:

  1. 區域性內部類只能在程式碼程式碼塊、方法體內和作用域中使用。
  2. 區域性內部類同樣可以無限制呼叫外部類的方法和屬性。
  3. 可以使用abstract修飾,宣告為抽象類。

  舉個栗子:

public class Outer2 {
  public void print(){
    class Inner2{
      public void test(){
        System.out.println("Inner.print()");
      }
    }
    Inner2 inner2 = new Inner2();
    inner2.test();
  }
}
public class Test {
  public static void main(String[] args) {
    Outer2 outer2 = new Outer2();
    outer2.print();
  }
}

  這裡的Inner2類僅僅在Outer2的print方法中被使用,有效範圍也僅在print函式之內。

  通過這段玩具程式碼,可能無法理解為什麼java中要出現這樣限制這麼多而且挺複雜的東西。讓我們來看看之前的栗子:Java中的回撥

  這裡把程式碼複製過來:

public class TimePrinter implements ActionListener {
  @Override
  public void actionPerformed(ActionEvent e) {
    Date now = new Date();
    System.out.println("Time is " + now + " now.");
  }
}
public class Test {
  public static void main(String[] args) {
    ActionListener listener = new TimePrinter();
    Timer t = new Timer(1000,listener);
    t.start();
    JOptionPane.showMessageDialog(null,"Quit program?");//彈出對話方塊,防止主執行緒結束導致時鐘結束
    System.exit(0);
  }
}

  在這裡,我們想要建立一個Timer時,需要往裡面傳入一個實現了ActionListener介面的物件,而這個物件僅僅在該方法中使用了一次,這時候內部類的優勢就體現出來了,把類封裝在方法中,不向外界提供任何冗餘資訊:

public class Test {
  public static void main(String[] args) {
    class InnerTimePrinter implements ActionListener {
      @Override
      public void actionPerformed(ActionEvent e) {
        Date now = new Date();
        System.out.println("Time is " + now + " now.");
      }
    }
    ActionListener listener = new InnerTimePrinter();
    Timer t = new Timer(1000,"Quit?");
    System.exit(0);
  }
}

  你也許會覺得,這樣好像只是把類簡單的挪到了另一個類裡面,並沒有什麼luan用。

  表面上,確實如此,但事實上,還是有很多luan用的。

  在《Think in java》中有這樣一句話:使用內部類最吸引人的原因是:每個內部類都能獨立地繼承一個(介面的)實現,所以無論外圍類是否已經繼承了某個(介面的)實現,對於內部類都沒有影響。

  我們都知道,java中是不能實現多繼承的,介面也正是為了對多繼承的補充完善給出的方案。而我們程式設計中有時候會存在一些使用介面很難解決的問題,這個時候我們可以利用內部類提供的、可以繼承多個具體的或者抽象的類的能力來解決這些程式設計問題。可以說,介面只是解決了部分問題,而內部類使得多重繼承的解決方案變得更加完整。

  據個人經驗,區域性內部類確實用的不多,但不常用不代表沒有用,知道有這樣一個神奇的內部類存在,瞭解過它的特性之後,可以為你日後的需求提供更多的方案。

  至此,本篇講解完畢,歡迎大家繼續關注!

以上就是詳細分析Java內部類——區域性內部類的詳細內容,更多關於Java 區域性內部類的資料請關注我們其它相關文章!