美文网首页Java
Java 匿名内部类 (Anonymous Classes)

Java 匿名内部类 (Anonymous Classes)

作者: Tinyspot | 来源:发表于2023-08-27 12:45 被阅读0次

1. 匿名内部类(Anonymous Classes)

  • 没有类名的局部内部类 (一切特征都与局部内部类相同)
  • 必须继承一个父类或者实现一个接口 (用来创建接口或抽象类的实例)

1.1 语法

语法: new 父类() { 子类内容 };
匿名类是一个表达式,所以用分号;结束

1.2 创建匿名类

必须继承一个父类或者实现一个接口
方式一:继承类

Thread thread = new Thread() {
    @Override
    public void run() {  }
};

方式二:实现接口

Runnable runnable = new Runnable() {
    @Override
    public void run() {  }
};

编译后

image.png

2. 接口回调

匿名内部类是唯一一种没有构造器的类,大部分匿名内部类用于接口回调

@Test
public void test() {
    BizProcess bizProcess = new BizProcess();
    // 设置
    bizProcess.setBizService(new BizService() {
        @Override
        public String execute(String business) {
            return "execute " + business;
        }
    });
    // 回调
    bizProcess.execute("process");
}
public interface BizService {
    String execute(String business);
}
public class BizProcess {
    private BizService bizService;

    public void setBizService(BizService bizService) {
        this.bizService = bizService;
    }

    public void execute(String business) {
        String result = bizService.execute(business);
        System.out.println(result);
    }
}

3. 局部内部类改为匿名内部类

public static void main(String[] args) {
    // 局部内部类(定义在方法中的类)
    class Mouse implements Usb {
        @Override
        public void service() {
            System.out.println("Mouse run....");
        }
    }
    Usb usb = new Mouse();
    usb.service();
}

局部内部类使用一次后就不再使用,优化方式:改为匿名内部类

public static void main(String[] args) {
    // 相当于创建了一个局部内部类
    Usb usb = new Usb() {
        @Override
        public void service() {
            System.out.println("run...");
        }
    };
    usb.service();
}

4. 其他

4.1 为什么局部变量需要 final修饰

public static void main(String[] args) {
    int num = 0; // JDK1.7前,必须加上 final
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            System.out.println(num++); // 报错,num 不能操作
        }
    };
}

因为局部变量和匿名内部类的生命周期不同
匿名内部类是创建后是存储在堆中的,而方法中的局部变量是存储在Java栈中,当方法执行完毕后,就进行退栈,同时局部变量也会消失

4.2 其他示例

public class Demo {
    public static void main(String[] args) {
        // 匿名内部类  Demo$1
        List<String> list = new ArrayList<String>() {{
                add("111");
                add("222");
        }};
    }
}

4.3 匿名类的实例作为参数传递

public void test() {
    // 创建接口实例
    Comparator<Integer> comparator = new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            return Integer.compare(o1, o2);
        }
    };
    // 匿名类的实例作为参数传递  TreeSet(Comparator<? super E> comparator) {}
    TreeSet<Integer> ts = new TreeSet<>(comparator);

  // 或者
  TreeSet<Integer> ts = new TreeSet<>(new Comparator<Integer>() {
      @Override
      public int compare(Integer o1, Integer o2) {
          return Integer.compare(o1, o2);
      }
  });
}

相关文章

网友评论

    本文标题:Java 匿名内部类 (Anonymous Classes)

    本文链接:https://www.haomeiwen.com/subject/drkwmdtx.html