【已解决】 【每日面试题】Java中为什么匿名内部类使用到外部变量要用final修饰?
Java中为什么匿名内部类使用到外部变量要用final修饰?
比如说你在快速给一个回调方法实现的时候,使用到外部的变量,为什么这个变量要加final才可以使用呢?
private void initEvent() {
final int test = 10;//加final修饰,为什么呢?
mIndicatorAdapter.setOnIndicatorTapClickListener(new IndicatorAdapter.OnIndicatorTapClickListener() {
@Override
public void onTabClick(int index) {
LogUtil.d(TAG,"click index is -- > " + index + " test == > " + test);
if(mContentPager != null) {
mContentPager.setCurrentItem(index,false);
}
}
});
}
实际上 这个问题也不一定要加final修饰。如果你的jdk版本1.8 是不用加final的。
final的作用是确保内存中变量指向的内存地址不变,也就是说final修饰的变量不能再修改或者指向另一个对象了。这样就能确保匿名内部类在执行代码的时候变量所代表的是同一个东西。如果不是一个东西的话就会导致程序运行的结果与预期不同。
但是有的时候我们希望点击事件里面修改外部变量的值,比如我希望点击这个按钮的时候,这个时候他就会建议你用数组。数组是同一个,但是数据里面的变量是可以修改的。还有一个方法就是把例题中的test设置为全局变量。
另外jdk1.8可以不加final的原因是编译器底层加了final