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

 打印结果

原文地址:https://www.cnblogs.com/c2g5201314/p/13114676.html