内部类_为什么需要内部类 1.闭包与回调(笔记)

本文介绍Java中内部类的使用方式,并通过一个具体的示例展示了如何利用内部类实现类似C语言指针的回调功能。通过闭包类实现对外部类状态的访问,使得回调机制更加安全和灵活。

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

内部类_为什么需要内部类
1.闭包与回调

当需要类似c语言的指针操作,返回一个指针时,Java内部类的闭包操作可以实现类似功能,且更为安全。
代码敲完,实现通过内部闭包类,实现类似指针的回调功能。

interface Incrementable {//接口
    void increment();//“增长”
}

//第一个被调用的类,采用直接实现接口
class Callee1 implements Incrementable {
    private int i = 0;
    //实现接口的方法
    public void increment() {
        i++;
        System.out.println("c1 i: " + i);
    }
}

//先写个自己的基类
class MyIncrement {
    public void increment() {
        System.out.println("其他操作");
    }
    //写个供外面调用的方法
    static void f (MyIncrement mi) {
        //mi可能是该类的对象或者是子类的实例,子类实例的话调用的increment是子类的实现方法
        mi.increment();
    }
}

//第二个被调用的类,采用继承
class Callee2 extends MyIncrement {
    private int i = 0;
    public void increment() {
        //先用super执行一次父类的increment()
        super.increment();
        i++;
        System.out.println(i);
    }
    //增加一个内部类,闭包类
    private class Closure implements Incrementable {
        public void increment() {
            //调用外围类的方法
            Callee2.this.increment();
        }
    }
    //要通过外面的方法,拿到闭包类的东西
    //获取回调引用的方法
    Incrementable getCallbackReference() {
        return new Closure();
    }
}

//呼叫
class Caller {
    private Incrementable callbackReference;
    //构造器
    Caller (Incrementable cbh) {
        callbackReference = cbh;
    }
    void go() {
        callbackReference.increment();
    }
}

public class Callbacks {
    public static void main(String[] args) {
        Callee1 c1 = new Callee1();
        Callee2 c2 = new Callee2();
        MyIncrement.f(c2);
//      output:
//      其他操作
//      1

        Caller caller1 = new Caller(c1);
        //Callee2由于没有直接实现接口,要通过拿到闭包的回调对象的引用
        Caller caller2 = new Caller(c2.getCallbackReference());

        caller1.go();
        caller1.go();
//      output:
//          c1 i: 1
//          c1 i: 2

        caller2.go();
        caller2.go();
//      output:
//          其他操作
//          2
//          其他操作
//          3
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

源计划猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值