2013-12-10 56 views
0
package innerclasstest; 

interface Demo { 
} 

class Bar { 

    public void call() { 
    Foo f = new Foo(); 

    f.doStuff(new Demo() { 

     public void fall() { 
      System.out.println("In method args..."); 
     } 

    }); 
} 

} 

class Foo { 

public void doStuff(Demo demo) { 

System.out.println("In stuff"); 
} 
} 

public class ClassArg { 

public static void main(String[] args) { 
    Bar b = new Bar(); 

    b.call(); 

} 

} 

在上面的示例中,我們如何調用匿名類方法Fall。有什麼辦法可以調用這個方法。我不知道我應該選擇哪種方法來調用這個方法。如何在Java中調用匿名類方法

+1

使用接口 – SLaks

+0

您已經發現匿名類應該是IMO的幾個原因之一,「被認爲是有害的」。它們不能被重用,並且通常會導致大量的複製和粘貼代碼。因人而異。 – user949300

回答

2

如果您想用不同的東西您需要將它分配給一個變量,因爲該類不可重用。

喜歡的東西:

Demo extendedDemo = new Demo() { 

    public void fall() { 
     System.out.println("In method args..."); 
    } 

}; 

你可以使用它,然後你的來電:

f.doStuff(extendedDemo); 

您可以在聲明調用內部的方法,如果doStuff後即可執行:

Demo extendedDemo = new Demo() { 

    public void fall() { 
     System.out.println("In method args..."); 
    } 

}.fall(); 

如果以後不能調用doStuff,則可以使用反射調用內部方法:

Method m = extendedDemo.getClass().getMethod("fall", new Class[]{}); 
m.invoke(extendedDemo, new Class[]{}); 
4

你不能寫

demo.fall(); 

的唯一原因是,你並沒有宣佈在接口方法。改變它:

interface Demo { 
    void fall(); 
} 

然後它的工作原理。

0

在您的情況:

public void doStuff(Demo demo) { 

System.out.println("In stuff"); 
} 
在調用此方法 demo.fall()如果演示接口提供 fall()方法聲明

+0

問題是'Demo'接口沒有聲明'fall()'方法。 –

+0

對呀,我在編輯答案 –

1

匿名類不能被引用到他們已被聲明的地方以外的任何地方。要調用該方法,必須先在界面中聲明該方法。這是您與接口完整列表,調整了一下,以便使用的方法:

interface Demo { 
    public void fall(); 
} 

class Bar { 
    public void call() { 
     Foo f = new Foo(); 
     f.doStuff(new Demo() { 
      public void fall() { 
       System.out.println("In method args..."); 
      } 
     }); 
    } 
} 

class Foo { 
    public void doStuff(Demo demo) { 
     System.out.println("In stuff"); 
     demo.fall(); 
    } 
} 

public class ClassArg { 
    public static void main(String[] args) { 
     Bar b = new Bar(); 
     b.call(); 
    } 
} 

輸出將是:

在東西
在方法ARGS ...

請參閱http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

+0

我明白了你的觀點:) – Vishesh