文章目录
总结
一、静态闭包变量
1、执行普通闭包变量
2、执行静态闭包变量
二、 在闭包中定义闭包
三、 完整代码示例
总结
在闭包中 , 打印 this , owner , delegate , 打印结果都是创建闭包时所在的类 ;
如果在类中创建闭包 , 则打印结果是类 ;
如果在实例对象中创建闭包 , 则打印结果是实例对象 ;
如果在闭包 A 中创建 闭包 B , this 是最外层闭包 A 之外的类 , owner , delegate 是上一层闭包 B ;
一、静态闭包变量
1、执行普通闭包变量
在类中定义闭包变量 , 在闭包中打印 this、owner、delegate 值 ,
class Test2 { def closure = { println "this : " + this println "owner : " + owner println "delegate : " + delegate } }
执行上述 Test2 类中的闭包 ,
new Test2().closure()
打印结果如下 : 打印的值都是 Test2 实例对象 ;
this : Test2@5082d622 owner : Test2@5082d622 delegate : Test2@5082d622
2、执行静态闭包变量
如果将闭包声明为静态变量 ,
class Test2 { def static closure = { println "this : " + this println "owner : " + owner println "delegate : " + delegate } }
直接使用闭包所在类直接调用闭包 , 不再使用闭包所在类对象调用闭包 ;
Test2.closure()
执行结果为 : 打印的值都是 Test2 类 ;
this : class Test2 owner : class Test2 delegate : class Test2
还是上述静态闭包变量 , 使用 Test2 实例对象调用 ,
new Test2().closure()
打印的结果是创建闭包时所在的类 ;
this : class Test2 owner : class Test2 delegate : class Test2
二、 在闭包中定义闭包
在 Test2 类中定义 闭包变量 closure2 , 在 closure2 闭包中定义 closure3 闭包 ,
class Test2 { def closure2 = { def closure3 = { println "this : " + this println "owner : " + owner println "delegate : " + delegate } closure3() } }
打印结果如下 :
this : Test2@291a7e3c owner : Test2$_closure1@4ae9cfc1 delegate : Test2$_closure1@4ae9cfc1
this 值为 外部的 Test2 实例对象 ;
owner 和 delegate 是 Test2 中定义的 closure2 闭包 ;
创建 closure2 闭包时 , this、owner、delegate 都是 Test2 实例对象 ;
但是创建 closure3 闭包时 , this 的值还是设置 closure2 的 this 值 , owner、delegate 值设置成 closure2 闭包 ;
// 创建内层闭包时 , 传入的 this 是 外层闭包的 this.getThisObject()
// 创建内层闭包时 , 传入的 this 是 外层闭包的 this.getThisObject() // 因此 this 值仍是 Test2 实例对象 // owner、delegate 变为外层的 Closure 闭包 ; Object closure3 = new _closure2(this, this.getThisObject());