为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

匿名内部类是如何在Java中使用的?在Java中匿名类的用途是什么?我们可以说使用匿名类是Java的优势之一吗?
查看完整描述

4 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

匿名内部类实际上是闭包,因此可以用来模拟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);

这是一个精心设计的例子,但很容易看出,能够像传递值一样传递函数是一个非常有用的特性。

查看完整回答
反对 回复 2019-05-30
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

匿名内部类用于以下场景:

1.)用于重写(子类),当类定义除当前情况外不可用时:

class A{
   public void methodA() {
      System.out.println("methodA");
    }}class B{
    A a = new A() {
     public void methodA() {
        System.out.println("anonymous methodA");
     }
   };}

2.为实现接口,如果只需要在当前情况下实现接口:

interface interfaceA{
   public void methodA();}class B{
   interfaceA a = new interfaceA() {
     public void methodA() {
        System.out.println("anonymous methodA implementer");
     }
   };}

3.定义匿名内部类的参数:

 interface Foo {
   void methodFoo();
 }
 class B{
  void do(Foo f) { }}class A{
   void methodA() {
     B b = new B();
     b.do(new Foo() {
       public void methodFoo() {
         System.out.println("methodFoo");
       } 
     });
   } 
 }


查看完整回答
反对 回复 2019-05-30
?
慕标5832272

TA贡献1966条经验 获得超4个赞

我有时将它们用作Map实例化的语法黑客:

Map map = new HashMap() {{
   put("key", "value");}};

VS

Map map = new HashMap();map.put("key", "value");

它在执行大量PUT语句时节省了一些冗余。但是,当外部类需要通过远程处理序列化时,我也遇到了一些问题。


查看完整回答
反对 回复 2019-05-30
  • 4 回答
  • 0 关注
  • 1694 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信