JAVA 闭包

本文探讨了闭包的概念,引用了SICP中的观点,并阐述了在JAVA中如何通过接口和内部类来实现闭包。内部类能够访问其所在对象,使得在其他类中可以通过传递内部类实例调用自身的函数,如同一个钩子,可以随时被激活。同时,文章也提及了C语言中的指针概念,以帮助理解闭包中的变量与指针的相似性。

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

最近在看SICP,cool …
有点离题,其实不然,在SICP 的视频里,一个教授讲到(原话)—一个我最喜欢的术语 闭包 ,我认为闭包就是你系统中的组合方式,那些你需要组合起来使用的东西,就像我们构建的pair,你可以相同的组合不断构建pair,因此,我不仅可以构建a pair of number,还可以构建 a pair of pairs,再比如说,在Fortran中的array(数组)并不具有闭包的性质,因为 我可以拥有an array of numbers,但是不能 an array of arrays。

很强的感觉,所以 ,我就看了下JAVA 实现闭包的方法。在JAVA 中的闭包 是由接口 + 内部类的 组合方式 实现,
内部类 可以访问 该对象

   public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    private String name;

    public GetTestClosur(String name) {
        this.name = name;
    }

    private class Inner implements SaySomeThing {
       // String name="sdds";
        @Override
        public void say() {
          //  name="sdasda";
            System.out.println(name+"///"+GetTestClosur.this.hashCode()+""+GetTestClosur.this.name);

        }
        }
       public void hh(){
        new Listerr().sayVoid(new Inner());
     }
     public void cc(){
      
    }
    }

 public static void main(String[] args) {
        GetTestClosur a=new GetTestClosur("a");
        Inner inner=a.new Inner();
        GetTestClosur b=new GetTestClosur("b");
        Inner inner1=b.new Inner();
        System.out.println(a.hashCode());
        inner.say();
        System.out.println(b.hashCode());
        inner1.say();

    }

结果如下:
通过这里 可以看出 内部类 可以 获取 该对象

189568618
a///189568618a
511754216
b///511754216b

接下来 重点看下 h函数,调用了 Listerr 类,
关键是 传递了什么 (该类的内部类)意味着用将可以将自己 传进去。可以 在别的类中 再次 调用自己的func。再次获得自己。

     public void hh(){
        new Listerr().sayVoid(new Inner());
     }
public class Listerr {
    public void sayVoid(SaySomeThing saySomeThing){
        saySomeThing.say();
    }

 public static void main(String[] args) {
        GetTestClosur a=new GetTestClosur("a");
        Inner inner=a.new Inner();
        GetTestClosur b=new GetTestClosur("b");
        Inner inner1=b.new Inner();
        System.out.println(a.hashCode());
       // inner.say();
        a.hh();
        System.out.println(b.hashCode());
        b.hh();
        //inner1.say();

    }
    
    结果如下:----------
   189568618
a///189568618a
1721931908
b///1721931908b

看到这里 是不是 觉得 内部类 就像是 放在 其他类的 钩子,随时可以调用自己的起来。。

好的,接下来 。。可能 还要联想到 C 里面的指针,这个指针 ,这种地址指向,指向可以变化,但是 变量始终 是这个指针啊。
int * p;
int a=11;
p=&a;
&a 的值 可以变化,但是 始终是 a 的指针。 end

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值