• 细谈 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

     打印结果

  • 相关阅读:
    SharePoint 2013 配置基于表单的身份认证
    SharePoint 2013 场解决方案包含第三方程序集
    SharePoint 2010 站点附加数据升级到SP2013
    SharePoint 2013 在母版页中插入WebPart
    SharePoint 2013 搭建负载均衡(NLB)
    SharePoint 部署解决方案Feature ID冲突
    SharePoint 2013 配置基于AD的Form认证
    SharePoint Server 2016 Update
    SharePoint 2013 为用户组自定义EventReceiver
    SharePoint 2013 JavaScript API 记录
  • 原文地址:https://www.cnblogs.com/c2g5201314/p/13114676.html
Copyright © 2020-2023  润新知