匿名内部类中使用的外部对象会变成不可变对象!!!
/**
* 匿名内部类中使用了的变量底层会自动编译成final修饰的不可变变量,匿名内部类和外部都不能对其进行赋值操作
*/
public class RememberTest {
public static void main(String[] args) {
int a = 3;
//使用匿名内部类创建对象
Function<String,Integer> fu = new Function<String, Integer>() {
@Override
public Integer apply(String s) {
System.out.println(a);//a会提示错误
return 0;
}
};
a = 5;
}
}
根据编译器的提示得到以下结果:
/**
* 匿名内部类中使用了的变量底层会自动编译成final修饰的不可变变量,匿名内部类和外部都不能对其进行赋值操作
*/
public class RememberTest {
public static void main(String[] args) {
int a = 3;
int finalA = a;//外部重新声明了一个变量进行操作
//使用匿名内部类创建对象
Function<String,Integer> fu = new Function<String, Integer>() {
@Override
public Integer apply(String s) {
System.out.println(finalA);//finalA是不可变的
return 0;
}
};
a = 5;//a没在匿名内部类中操作,a还是可变的
}
}
第一段代码编译后的结果
public class RememberTest {
public RememberTest() {
}
public static void main(String[] args) {
final int a = 3;
/**a使用了final修饰,一旦赋值,不可改变,所以匿名内部类中不能对其进行赋值操作,外部也不能对其进行赋值操作**/
Function var10000 = new Function<String, Integer>() {
public Integer apply(String s) {
System.out.println(a);
return 0;
}
};
}
}
第二段代码编译后的结果:
public class RememberTest {
public RememberTest() {
}
public static void main(String[] args) {
final int a = 3;
Function var10000 = new Function<String, Integer>() {
public Integer apply(String s) {
System.out.println(a);
return 0;
}
};
int a = true;
}
}
第二段代码编译后不能用常规思维分析,但是从第一段代码编译后的结果可以看出在匿名内部类中使用的对象会自动加上final修饰符,对象不可变。