• 细谈 Java 匿名内部类 【分别 使用 接口 和 抽象类实现】


    1.前言

      匿名内部类是什么东西?

    没有名字的内部类就是匿名内部类。

      什么场景使用?

    匿名内部类适合创建那种只需要一次使用的类。

      这是个很有用的东西,可想而知,如果不使用匿名内部类,哪些只需要使用一次的类岂不是需要单独做个文件存放?文件多起来,连名字都不好起,

    这算是 给 起名字困难人群 巨大的福利啊!!!直接不要名字啦,哈哈哈哈哈

      匿名内部类的使用需要接口或抽象类的使用,而使用抽象类又有点像Java多态知识点用法,当然区别还是有的。

    2.操作

    (1)使用接口实现匿名内部类

    创建一个接口

    package com.example.javabaisc.anonymous;
    
     public interface InterFood {
         public void eat();
         public void count();
    }

    创建一个测试类

    package com.example.javabaisc.anonymous;
    
    import org.junit.jupiter.api.Test;
    
    public class AnoTest {
    
        /**
         * 使用接口实现匿名内部类
         */
        @Test
        public void t1(){
            //方法一:实例接口后直接配置内部方法来实现逻辑
            InterFood interFood = new InterFood() {
                @Override
                public void eat() {
                    System.out.println("吃苹果");
                }
    
                @Override
                public void count() {
                    System.out.println("100个");
                }
            };
            interFood.eat();
            interFood.count();
    //=================================
            System.out.println("==============================================");
            //方法二:以接口实现的匿名内部类作为对象参数,直接传入方法内使用
            AnoTest anoTest = new AnoTest();
            anoTest.ano(new InterFood() {
                @Override
                public void eat() {
                    System.out.println("这次要吃桃子。");
                }
    
                @Override
                public void count() {
                    System.out.println("500个桃子够吗");
                }
            });
    
    
        }
    
        public void ano(InterFood interFood){
            interFood.eat();
            interFood.count();
        }
    
    
    }
    View Code

    打印结果

    【注意:

    使用接口实现匿名内部类有个明显的缺点,无法传入参数,只能在内部类里面定义死,

    但是可以 引入外部的常量,jdk8以下的需要使用final 

    package com.example.javabaisc.anonymous;
    
    import org.junit.jupiter.api.Test;
    
    public class AnoTest {
    
        /**
         * 使用接口实现匿名内部类
         */
        @Test
        public void t1(){
            //jdk8以下的需要使用final
    //       final int kk = 666;
             int kk = 666;
    
            //方法一:实例接口后直接配置内部方法来实现逻辑
            InterFood interFood = new InterFood() {
                @Override
                public void eat() {
                    System.out.println("吃苹果");
                }
    
                @Override
                public void count() {
                    System.out.println("100个");
                }
            };
            interFood.eat();
            interFood.count();
    //=================================
            System.out.println("==============================================");
            //方法二:以接口实现的匿名内部类作为对象参数,直接传入方法内使用
            AnoTest anoTest = new AnoTest();
            anoTest.ano(new InterFood() {
                @Override
                public void eat() {
                    System.out.println("这次要吃桃子。"+kk);
                }
    
                @Override
                public void count() {
                    System.out.println("500个桃子够吗");
                }
            });
    
    
        }
    
        public void ano(InterFood interFood){
            interFood.eat();
            interFood.count();
        }
    
    
    }
    View Code

    打印结果

     (2)使用抽象类实现匿名内部类

    创建一个抽象类

    package com.example.javabaisc.anonymous;
    
    //抽象类
    abstract public class AbstractFood {
        //抽象方法
        abstract void getCount();
    
        //无参构造函数方法
        public AbstractFood() {
        }
    
        //有参构造函数方法
        public AbstractFood(String name) {
            this.name = name;
        }
    
        //变量属性
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    View Code

    测试类

    package com.example.javabaisc.anonymous;
    
    import org.junit.jupiter.api.Test;
    
    public class AnoTest {
    
        /**
         * 使用抽象类实现匿名内部类
         */
        @Test
        public void t2() {
            //方法一:传入参数
            AbstractFood abstractFood = new AbstractFood("苹果") {
                // 初始化块
                {
                    System.out.println("匿名内部类的初始化块...");
                }
                @Override
                void getCount() {
                    System.out.println("200个");
                }
            };
            System.out.println(abstractFood.getName());
            abstractFood.getCount();
            System.out.println("==============================================");
            //
            //方法二: 引用外部参数变量
            String mname = "樱桃";
            AbstractFood abstractFood2 = new AbstractFood() {
                // 初始化块
                {
                    System.out.println("匿名内部类的初始化块...");
                }
                @Override
                void getCount() {
                    System.out.println("50个");
                }
                //即便不是抽象方法,也可以覆写类里面的普通方法
                @Override
                public String getName() {
                    return mname;
                }
            };
            System.out.println(abstractFood2.getName());
            abstractFood2.getCount();
            System.out.println("==============================================");
            //
            //方法三:匿名内部类作为参数传入方法中
            AnoTest anoTest = new AnoTest();
            anoTest.abs(new AbstractFood("火龙果") {
                // 初始化块
                {
                    System.out.println("匿名内部类的初始化块...");
                }
                @Override
                void getCount() {
                    System.out.println("10个");
                }
            });
        }
    
        public void abs(AbstractFood abstractFood) {
            System.out.println(abstractFood.getName());
            abstractFood.getCount();
        }
        
    }
    View Code

     打印结果

  • 相关阅读:
    团队总结-文艺复兴
    文艺复兴-冲刺总结
    文艺复习-测试博客
    文艺复习-冲刺集合
    冲刺第一天
    凡事预则立
    2020软件工程作业05
    2020软件工程作业04
    前端怎么去学
    十、Kernel_3.0.35版本和Kernel_4.1.15版本在SPI驱动实现机制的差异
  • 原文地址:https://www.cnblogs.com/c2g5201314/p/13114676.html
Copyright © 2020-2023  润新知