后台开发笔记

Java 匿名内部类

2021-03-11  本文已影响0人  Figo_OU

匿名内部类是什么?可能我们用得很多,只是不知道她的芳名。

List<Integer> nums= Arrays.asList(1, 2, 3);

Collections.sort(nums, new Comparator<Integer>() {
  @Override
  public int compare(Integer o1, Integer o2) {
    return o1 - o2;}
  });

使用的Comparator就是一个匿名内部类。new 出来的对象就是一个匿名对象。

  1. 既然是匿名类,所以你无法在别的地方使用这个类(实例化,调用它的静态方法之类的), 只能使用一次。
  2. 调用其他包的protected方法
    2.1 场景:要调用不同包中一个类的protected 方法 且 你不想多写一个类去继承。
    2.2 实现:
package com.bds.models;
public class InnerTestInOtherClass {
    protected void test(){
        System.out.println("这是一个保护方法");
    }
}
package com.bds.ozxTest;
public class InnerTestMainClass {
    public static void main(String[] args) {

//        InnerTestInOtherClass innerTestInOtherClass = new InnerTestInOtherClass();
//        innerTestInOtherClass.test(); //无法访问该方法
        new InnerTestInOtherClass(){
            void superTest(){
                super.test();
            }
        }.superTest();
    }
}

当然你可以写个类继承这个类,就能调用父类的protected方法。匿名类更方便,你的目的只是调用这个方法而已 。

image.png

想复用WebMvcConfigurationSupport的getMessageConverter方法,但是定义为protected方法,所以使用匿名类来调用

Lambda 替代匿名内部类

过去给方法传动态参数的唯一方法是使用内部类。比如

1.Runnable 接口

new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("The runable now is using!");
            }
}).start();
//用lambda
new Thread(() -> System.out.println("It's a lambda function!")).start();

2.Comperator 接口

List<Integer> strings = Arrays.asList(1, 2, 3);

Collections.sort(strings, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
    return o1 - o2;}
});

//Lambda
Collections.sort(strings, (Integer o1, Integer o2) -> o1 - o2);
//分解开
Comparator<Integer> comperator = (Integer o1, Integer o2) -> o1 - o2;
Collections.sort(strings, comperator);

3.Listener 接口

JButton button = new JButton();
button.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
   e.getItem();
}
});
//lambda
button.addItemListener(e -> e.getItem());

参考:https://www.zhihu.com/question/49330534

上一篇下一篇

猜你喜欢

热点阅读