Java 匿名内部类

作者: Figo_OU | 来源:发表于2021-03-11 11:22 被阅读0次

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

    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

    相关文章

      网友评论

        本文标题:Java 匿名内部类

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