最近在看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