2009-01-26 12 views

回答

10

它們允許您從父類中取出邏輯並將其對象化。這將功能從它不屬於的地方移除,並將其放入它自己的類中。但是如果這個新對象只需要很短的時間,只需要一段代碼的時間呢?那麼,這就是本地課程適合的地方。

+2

這不是對象實例的持續時間,而是它的範圍。 如果該類只需要對父類可見,那麼使其成爲本地將阻止它在其他地方使用。此外,本地班級可以看到父母的私人成員 - 非本地班級無法做到這一點。 – belugabob 2009-01-26 08:27:55

+7

@belugabob:1.本地類只能在定義它們的方法或構造函數內使用。他們甚至對封閉的班級都不可見。 2.嵌套/內部類也可以看到封閉類的私有變量。 – 2009-01-26 15:33:53

24

下面是一個如何在程序中存在匿名內部類,本地內部類和常規內部類的示例。該示例查看MyClass類中存在的myMethod方法和InnerClass類。爲了討論的方便,這些類都將實施Runnable接口:

public class MyClass 
{ 
    public void myMethod() 
    { 
     // Anonymous inner class   
     Runnable r = new Runnable() { 
      public void run() {} 
     }; 

     // Local inner class 
     class LocalClass implements Runnable 
     { 
      public void run() {} 
     } 
    } 

    // ... // 

    // Inner class 
    class InnerClass implements Runnable 
    { 
     public void run() {} 
    } 
} 

匿名內部類可用於單純爲了實現Runnable一類,而不必實際寫出來的類命名它,並且如他的帖子中提到的krosenvold,它被用作Java中的「窮人封閉」。

例如,一個非常非常簡單的方法來使用匿名內部類將是啓動一個Thread

new Thread(new Runnable() { 
    public void run() 
    { 
     // do stuff 
    } 
}).start(); 

一種本地內部類可以用來使一個類是本地範圍內 - 將不能通過myMethod以外的其他方法訪問。

如果有另一種方法,我們試圖使位於該myMethod方法裏面LocalClass的一個實例,我們將不能夠這樣做:

public void anotherMethod() 
{ 
    // LocalClass is out of scope, so it won't be found, 
    // therefore can't instantiate. 
    new Thread(new LocalClass()).start(); 
} 

內部類是內部類所在類的一部分。因此,例如,內部類InnerClass可以通過MyClass.InnerClass從其他類訪問。當然,這也意味着MyClass中的另一種方法也可以實例化一個內部類。

public void anotherMethod() 
{ 
    // InnerClass is part of this MyClass. Perfectly instantiable. 
    new Thread(new InnerClass()).start(); 
} 

關於匿名內部類和局部內部類的另一件事情是,這將能夠訪問它們在myMethod聲明final變量:

public void myMethod() 
{ 
    // Variable to access from anonymous and local inner classes. 
    final int myNumber = 42; 

    // Anonymous inner class   
    Runnable r = new Runnable() { 
     public void run() 
     { 
      System.out.println(myNumber); // Works 
     } 
    }; 

    // Local inner class 
    class LocalClass implements Runnable 
    { 
     public void run() 
     { 
      System.out.println(myNumber); // Works 
     } 
    } 

    // ... // 

那麼,有哪些優勢?使用匿名內部類和本地內部類而不是單獨成熟的內部類或類將允許前者在聲明它們的方法中訪問final變量,並且同時這些類是局部的該方法本身,所以它不能從同一個類中的外部類和其他方法訪問。

12

你可以用本地類來做很多事情,但是你不會用匿名內部類獲得。

  • 因爲類型有一個名字,你可以更有效地添加成員不會在超
  • 給定的名稱可以使堆棧跟蹤更容易理解(特別是鎖定的對象)
  • 亞型多個基請在多個地方
  • 結構,以及多個構造

在另一方面,他們做出一些令人髮指的詳細的語法甚至混亂。