java匿名内部类访问外部变量要用final 修饰

public void insert(User user) {
 	   final String name = user.getName();
 	   final int age = user.getAge().intValue();
 	   jdbcTemplate.update(
 	      "INSERT INTO user (name,age) VALUES(?,?)",
 	      new PreparedStatementSetter() {
 	            public void setValues(PreparedStatement ps) 
 	                                   throws SQLException {
 	               ps.setString(1, name);
 	               ps.setInt(2, age);
 	            }
 	         });
 	}

 

解释:在java中,方法是一种状态,是不能被存储的,对象才是真正被存储在堆内存中的。匿名内部类是在内部,是局部的,它所处的外部环境即方法,在执行完后就不存在了,但是内部类作为一个对象,是有可能被存储下来的。而局部变量也是如此,局部变量时存在于栈内存中的,使用完了就立即被消灭掉了,而匿名内部类访问局部变量,也是对它的一个拷贝而已;那么试想,局部变量都没了,匿名内部类还存在,这个匿名内部类要去哪找这个变量呢???只能让虚拟机报警了(编译失败)。所以就要将这个局部变量变为永久的常量才行。

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页