2016-07-20 36 views
-5

我想了解Java匿名類。Java匿名類 - 最小的例子

尋找這裏: https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

在這裏: http://docstore.mik.ua/orelly/java-ent/jnut/ch03_12.htm

我理解的基本語法,但是這些例子不小。

什麼是在Java中定義匿名類的絕對最低要求?

編輯>>>

本質上這:

public class MyClass { 

    InnerClass instance = new InnerClass(); 

    public class InnerClass{ 

     public void print(){ 
      System.out.println("First Call"); 
     } 
    }; 


    public void redefineInstance(){ 

     instance = new InnerClass(){ 

      public void print(){ 
       System.out.println("Second Call"); 
      } 

     }; 
    } 

    public static void main(String[] args) throws Exception{  

     MyClass myobject = new MyClass(); 
     myobject.instance.print(); 
     myobject.redefineInstance(); 
     myobject.instance.print(); 

    } 

} 
+0

「FileNameFilter」的示例如何,其中content只是'return s.endsWith(「。java」);'* over-complicated *? – Andreas

+1

*「定義匿名類的絕對最低要求」*:一個接口或一個非最終類。 – Andreas

+0

@Andreas因爲代碼實例化了一個完全的其他類文件,這大概是Java庫的一部分。整個示例寫入文件實例的.list()方法中。匿名類不需要File或File.list(),所以這個例子並不是最小的。 – bigcodeszzer

回答

1

我想「絕對最低要求」,以創建一個匿名類是在你的代碼的地方,需要一個非final類或接口某種的一個實例。

意義,如果我有MyClass的方法:

public static void gimmeMyObject(MyObject c) 

我可以定義,只要MyObject擴展MyObject匿名類是不final

//Somewhere in a method 
MyClass.gimmeMyObject(new MyObject() { 
     public String myMethod() { 
      return "I'm anonymous"; 
     } 
}); 

匿名的類將是作爲MyObject傳入。

但是,如果方法需要StringInteger,例如因爲那些是final類,我不能這樣做。

對於上面的例子中,非匿名類將轉換爲:

public class MyAnonObject extends MyObject { //In actuality, an anonymous class doesn't have a name, though. 

    public String myMethod() { 
      return "I'm anonymous"; 
    } 
} 
+0

你是最有幫助的。謝謝 – bigcodeszzer

0

怎麼樣這個例子嗎?

//interface 
interface Message{ 
    String greet(); 
} 

消息是在該實施例中一個匿名類, 映入眼簾()是這個匿名類中的唯一方法。

//Passing an anonymous inner class as an argument 
     obj.displayMessage(new Message(){ 
     public String greet(){ 
      return "Hello";    
     } 
     }); 
2

最最小例如:

interface Foo {} 
public static void main (String[] args) 
{ 
    Foo foo = new Foo() {}; 
} 

字面上的接口的聲明,然後使用作爲沒有附加聲明一個匿名類。

實際上,它什麼都不做。然而,當我們添加位時:

interface Foo { 
    public void bar(); 
} 
public static void main (String[] args) throws java.lang.Exception 
{ 
    Foo foo = new Foo() { 
     public void bar() { 
      System.out.println("Hello"); 
     } 
    }; 
} 

它成爲我們方法的一個完整的輔助類。

早期/中期編程最常見的用法是重寫Listener來執行特定的操作。我們知道監聽器正在監聽某些內容,並且我們希望監聽器做一些事情,因此我們製作監聽器並說「當您被觸發時執行此操作。」

這裏是一個非常複雜的ActionListener教程的例子:https://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html

但通常情況下,如果它的東西,是世俗的,如「運行點擊的方法」,你會使用匿名在網上申報,只是調用方法給你。

+0

你應該移除'拋出java.lang.Exception'。如果像[使用'File'](http://stackoverflow.com/questions/38490376/java-anonymous-class-minimal-example?noredirect=1#comment64382701_38490376)對於OP來說過於複雜,那麼可能有異常不知所云。但是,啓動簡單的+1。 – Andreas

+0

@Andreas是啊,它是從ideone遺留下來的,我沒有注意到它,擦了擦。 – Compass

0

羅盤已經表示,絕對最低是沒有用的。

下面是一個「有用」的內部類的一個實例:那麼,而不必定義一個內部類或一個ActionListener你只使用一次,輔助類的

JButton ok = new JButton(); 
    ok.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("abc"); 

     } 
    }); 

,你可以把它作爲一個內聯或匿名類來消除混亂並提高可讀性。

0

您可以將匿名類視爲基本上創建對象的新實例的實例部分。你基本上不會聲明它,並給它一個名字。這通常會傳遞到方法參數中,如下所示。

Object someObj;是一個對象聲明。 someObj = new Objct(parm a,...)是對象的實例化。

//example of anonymous classes: 
    public void foo(Bar barObj){// takes a Bar object parameter 
     //does stuff 
    } 

    //you can call the foo method in this way 
    Bar barObject= new Bar(); 
    foo(barObject){} 
    // or you can call the Bar anonymously 
    foo(new Bar()){} 

在匿名的例子中,你實例化方法的參數裏面一個新的吧。當你只需要本地的東西而不需要在任何地方使用它時,你可以做到這一點,但在該方法調用中。它還會讓您訪問匿名類中的可訪問方法。所以你可以做點像

foo(new Bar().barMethod){}。它只是取決於你正在處理的事情。