Java8匿名内部类

本文详细介绍了Java8中的匿名内部类,包括其简化写法、如何实现普通类、接口和抽象类的匿名内部类。同时讨论了匿名内部类与匿名对象的区别,以及它们与Lambda表达式的关联,强调了Java8中Lambda如何简化匿名内部类的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:前言:

本篇文章讲解java的匿名内部类,匿名内部类,顾明思意,是一个没有显示名字的内部类,其实质是对内部类的简化写法,匿名内部类会隐式的实现一个接口或者继承一个类。

匿名内部类适合创建只使用一次的类,如果一个类只使用一次的话就无须使用平时常用的方法,如继承或者实现父类后,再去实例化对象,使用匿名内部类可以简化这个编程的过程,并且不会编译生成单独的.class文件。

 

二:匿名内部类的语法:

1:基础语法

new 类名/接口/抽象类(){

};

2:实现普通类的匿名内部类

public class TestAnonymous {

    class FatherClass {
        public void test(){
            System.out.println("");
        }
    }
    FatherClass fatherClass = new FatherClass (){
        @Override
        public void test(){
            System.out.println("1234");
        }
    };
}

3:实现接口的匿名内部类

interface FatherInterface {
        public void test();
    }

    FatherInterface fatherInterface = new FatherInterface() {
        @Override
        public void test() {

        }
    };

4:实现抽象类的匿名内部类

 abstract class FatherAbstract {
        public abstract void test();
    }

    FatherAbstract fatherAbstract = new FatherAbstract(){
        @Override
        public void test() {

        }
    };

 

三:匿名内部类和匿名对象

匿名内部类和匿名对象不是一回事,匿名对象是没有变量名的对象,语法如下所示:

new 类名(参数列表);

四:匿名内部类和Lambda表达式

java8 Lambdade表达式一个重要的功能就是与匿名内部类结合,简化匿名内部类的写法,但是不是所以后的匿名内部类都可以被Lambda所简化,符合要求的匿名内部类要符合函数接口的规定。

*函数式接口:使用@FunctionalInterface标识(非必须,建议使用,编译器会帮忙检查是否服务规范),表示有且只有一个抽象方法,但可以有多个非抽象方法

代码示例:


public class TestAnonymous {

    /*

     */
   public TestAnonymous(TestFunctionInterface testFunctionInterface, String a){
        testFunctionInterface.doIt(a);
    };

    /*
   
     */
    public TestAnonymous(TestFunctionInterface1 testFunctionInterface){
        testFunctionInterface.doIt();
    };


    /*
    java8 匿名内部类和函数接口的写法
     */

    @FunctionalInterface
    interface TestFunctionInterface{
        void doIt(String a);
    }

    @FunctionalInterface
    interface TestFunctionInterface1{
        void doIt();
    }
      /*
    java8 匿名内部类和函数接口的写法
     */
    @FunctionalInterface
    interface TestConsumer1{
        void accept(String a);
    }


    public static void main (String[] args) {

        //使用有参的函数接口
        TestAnonymous testAnonymous = new TestAnonymous(
                (x) -> {
                    System.out.println(x);
                }
        , "fdsfdsf53434334254");

        //使用无参的函数接口
        TestAnonymous testAnonymous1 = new TestAnonymous(
                () -> {
                    System.out.println("");
                });


    }

}

示例中使用@FunctionalInterface标识的为两个函数式接口,main方法中使用两个接口的方式为java8Lambda使用函数接口的匿名内部类的简化写法。不使用java8Lambda的写法参考本文 二:匿名内部类的语法:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值