匿名内部类是如何在Java中使用的?

匿名内部类是如何在Java中使用的?

在Java中匿名类的用途是什么?我们可以说使用匿名类是Java的优势之一吗?



一只斗牛犬
浏览 1696回答 4
4回答

千万里不及你

匿名内部类实际上是闭包,因此可以用来模拟lambda表达式或“委托”。例如,以这个接口为例:public interface F<A, B> {    B f(A a);}您可以使用此匿名创建一级函数在爪哇。假设您有以下方法,它返回比给定列表中的我大的第一个数字,或者如果没有更大的数字,则返回我:public static int larger(final List<Integer> ns, final int i) {   for (Integer n : ns)      if (n > i)         return n;   return i;}然后,有另一个方法返回比给定列表中的我小的第一个数字,或者,如果没有更小的数字,则返回I:public static int smaller(final List<Integer> ns, final int i) {    for (Integer n : ns)       if (n < i)          return n;    return i;}这些方法几乎是相同的。使用第一类函数类型F,我们可以将它们重写为一个方法,如下所示:public static <T> T firstMatch(final List<T> ts, final F<T, Boolean> f, T z) {    for (T t : ts)       if (f.f(t))          return t;    return z;}您可以使用匿名类来使用FirstMatch方法:F<Integer, Boolean> greaterThanTen = new F<Integer, Boolean> {    Boolean f(final Integer n) {       return n > 10;    }};int moreThanMyFingersCanCount = firstMatch(xs, greaterThanTen, x);这是一个精心设计的例子,但很容易看出,能够像传递值一样传递函数是一个非常有用的特性。

摇曳的蔷薇

匿名内部类用于以下场景:1.)用于重写(子类),当类定义除当前情况外不可用时:class&nbsp;A{ &nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;methodA()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("methodA"); &nbsp;&nbsp;&nbsp;&nbsp;}}class&nbsp;B{ &nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;a&nbsp;=&nbsp;new&nbsp;A()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;methodA()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("anonymous&nbsp;methodA"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;};}2.为实现接口,如果只需要在当前情况下实现接口:interface&nbsp;interfaceA{ &nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;methodA();}class&nbsp;B{ &nbsp;&nbsp;&nbsp;interfaceA&nbsp;a&nbsp;=&nbsp;new&nbsp;interfaceA()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;methodA()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("anonymous&nbsp;methodA&nbsp;implementer"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;};}3.定义匿名内部类的参数:&nbsp;interface&nbsp;Foo&nbsp;{ &nbsp;&nbsp;&nbsp;void&nbsp;methodFoo(); &nbsp;} &nbsp;class&nbsp;B{ &nbsp;&nbsp;void&nbsp;do(Foo&nbsp;f)&nbsp;{&nbsp;}}class&nbsp;A{ &nbsp;&nbsp;&nbsp;void&nbsp;methodA()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B&nbsp;b&nbsp;=&nbsp;new&nbsp;B(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.do(new&nbsp;Foo()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;methodFoo()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("methodFoo"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;}

慕标5832272

我有时将它们用作Map实例化的语法黑客:Map&nbsp;map&nbsp;=&nbsp;new&nbsp;HashMap()&nbsp;{{ &nbsp;&nbsp;&nbsp;put("key",&nbsp;"value");}};VSMap&nbsp;map&nbsp;=&nbsp;new&nbsp;HashMap();map.put("key",&nbsp;"value");它在执行大量PUT语句时节省了一些冗余。但是,当外部类需要通过远程处理序列化时,我也遇到了一些问题。
打开App,查看更多内容
随时随地看视频慕课网APP