关于内部类引用局部变量的一些注意事项
程序员文章站
2022-06-13 23:38:00
内部类变量的生命周期匿名内部类的生命周期为整个方法,而局部变量的生命周期却不一定是整个方法。所以匿名内部类引用的局部变量默认由关键字final修饰。在Java8之后出现了Effectively final,意思就是,假如这个局部变量我们在使用过程中都不会出现改变引用的情况,那么我们不需要加final,默认是final。 @Test public void test2(){ /*final 可加可不加*/ List listFinal = ne...
内部类变量的生命周期
匿名内部类的生命周期为整个方法,而局部变量的生命周期却不一定是整个方法。所以匿名内部类引用的外部变量默认由关键字final修饰。在Java8之后出现了Effectively final,意思就是,假如这个局部变量我们在使用过程中都不会出现改变引用的情况,那么我们不需要加final,默认是final。
@Test
public void test2(){
/*final 可加可不加*/ List<String> listFinal = new ArrayList<>();
List<String> listLocal= new ArrayList<>(Arrays.asList("hello", "world", "java"));
listLocal.stream().forEach(item -> {
listFinal.add(item);
});
/*
* 会出现报错,将null赋值给listFinal,
* 会把listFinal的引用值改变,不符合final的定义
* */
//listFinal = null;
}
内部类创建新的对象
解释都写在了代码里面的注释里面了。
package pers.luoyanze.datasource.springjdbc;
import org.junit.Test;
import org.springframework.jdbc.core.JdbcTemplate;
import pers.luoyanze.datasource.druid.JDBCUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class JDBCTemplateDemo02 {
@Test
public void test() {
/*
* 这是我在学习jdbc时候写的代码。
* 没有太多时间,就没有重写测试代码了。
* */
JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
List<Map<String, Object>> mapList = template.queryForList("select * from job;");
ArrayList<Job> jobList = new ArrayList<>();
Job[] job = new Job[1];
//Job job = null;
mapList.stream().forEach((mapMember)->{
int id = (int)mapMember.get("id");
String name = (String)mapMember.get("jname");
String desc = (String)mapMember.get("description");
/*
* 如果创建的是job对象而不是数组,在内部类里面重新new Job(id, name, desc)
* 将会修改job对象的引用值,从而违背了final关键字的规则。
* 如果创建一个size为1的job数组,当我们在内部类里面修改job[0]的引用,
* 使0号索引指向一个新的job对象,这样可以不影响job的引用。
* */
//job = new Job(id, name, desc);
//jobList.add(job);
job[0] = new Job(id, name, desc);
jobList.add(job[0]);
});
jobList.stream().forEach(System.out::println);
}
}
Job 类代码
package pers.luoyanze.datasource.springjdbc;
import java.util.Map;
public class Job {
private int id;
private String jname;
private String description;
public Job(int id, String jname, String description) {
this.id = id;
this.jname = jname;
this.description = description;
}
public Job() {
}
@Override
public String toString() {
return "Job{" +
"id=" + id +
", jname='" + jname + '\'' +
", description='" + description + '\'' +
'}';
}
}
本文地址:https://blog.csdn.net/m0_43445777/article/details/107369863
推荐阅读