今天看javascript高级用法中的闭包,可以实现隐藏变量,于是想利用java模拟一下。
一共做了3个类:
1. 实体类 User: 包含姓名(Name)和年龄(Age)
2. 测试类 TestDemo: Main函数所在的类
3. 函数式接口 IncreaseAge: 内部只有一个increaseAge方法,用于增加User的年龄
上代码:
User类
package com.fly.domain;
public class User {
private int age;
private String name;
public User() {
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
函数式接口:
package com.fly.domain;
public interface IncreaseAge {
void increaseAge();
}
测试类:
package com.fly.domain;
public class TestDemo {
private IncreaseAge defineUser() {
//函数内部定义一个局部变量user
User user = new User();
user.setName("老王");
user.setAge(66);
//返回一个函数式接口,该接口可以实现增加用户年龄
return () -> {
user.setAge(user.getAge() + 1);
System.out.println(user);
};
}
public static void main(String[] args) {
//实例化TestDemo
TestDemo demo = new TestDemo();
//获取年龄增加器
IncreaseAge increaser = demo.defineUser();
increaser.increaseAge();
increaser.increaseAge();
increaser.increaseAge();
increaser.increaseAge();
}
}
输出结果:
User{age=67, name='老王'}
User{age=68, name='老王'}
User{age=69, name='老王'}
User{age=70, name='老王'}
可见,原本在方法defineUser中定义的局部变量user,跟着匿名内部类被传了出来!!!这个诡异的特性确实奇怪,以后研究下底层式什么情况。