2013-12-10 54 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