示例代码(外部类:TaskDAOImpl,匿名内部类对象:new JDBCHelper.QueryCallback(),其函数process中使用了外部类的局部变量task,final Task task = new Task();)
public class TaskDAOImpl implements ITaskDAO {
/**
* 根据主键查询任务
* @param taskid 主键
* @return 任务
*/
public Task findById(long taskid) {
final Task task = new Task();
String sql = "select * from task where task_id=?";
Object[] params = new Object[]{taskid};
JDBCHelper jdbcHelper = JDBCHelper.getInstance();
jdbcHelper.executeQuery(sql, params, new JDBCHelper.QueryCallback() {
@Override
public void process(ResultSet rs) throws Exception {
if(rs.next()) {
long taskid = rs.getLong(1);
String taskName = rs.getString(2);
String createTime = rs.getString(3);
String startTime = rs.getString(4);
String finishTime = rs.getString(5);
String taskType = rs.getString(6);
String taskStatus = rs.getString(7);
String taskParam = rs.getString(8);
task.setTaskid(taskid);
task.setTaskName(taskName);
task.setCreateTime(createTime);
task.setStartTime(startTime);
task.setFinishTime(finishTime);
task.setTaskType(taskType);
task.setTaskStatus(taskStatus);
task.setTaskParam(taskParam);
}
}
});
return task;
}
}
为什么task要声明为final?内部类对象的生命周期会超过局部变量的生命周期。局部变量的生命周期:当该方法被调用时,该方法中的局部变量在栈中被创建,当方法调用结束时,退栈,这些局部变量全部死亡。而内部类对象生命周期与其它类一样:自创建一个匿名内部类对象,系统为该对象分配内存,直到没有引用变量指向分配给该对象的内存,它才会死亡(被JVM垃圾回收)。所以完全可能出现的一种情况是:成员方法已调用结束,局部变量已死亡,但匿名内部类的对象仍然活着。这不被JAVA允许。