关于Java的final关键字问题
public class ThreadPre {
public static void main(String[] args) throws IOException {
ServerSocket socket = new ServerSocket(80);
while(true){
final Socket connection = socket.accept();
Runnable task = new Runnable() {
@Override
public void run() {
handle(connection);
}
};
new Thread(task).start();
}
}
}
这是我在《Java并发编程实践》看到的例子,我的疑问是socket用final声明虽然是基本语法要求的,因为不声明final的话,匿名类的函数没法直接引用该局部变量。但是accept每次收到一个连接请求都会返回一个新的socket,那么声明成final的话,接受完第一个请求,返回第一个socket后,就不能改变这个引用了,怎么接受新的socket呢 --------------------编程问答-------------------- 不能改变引用。但是,你上面程序里并没有改变这个引用而是每次循环都创建了一个新的引用Socket connection。 --------------------编程问答-------------------- final修饰只是说明connection的指向是不能改变的 --------------------编程问答-------------------- 既然不能改变引用,那怎么接受每次循环都创建了一个新的引用Socket connection --------------------编程问答-------------------- final Socket connection = socket.accept();是在循环之内,表明每次都是创建的新个连接。而connection这个变量已经不是上个循环的变量了 --------------------编程问答-------------------- 就像你分10次去超市买棒棒糖。难道这10叫棒棒糖的东西是一个吗? --------------------编程问答-------------------- 你的意思是说每次循环都声明了一个final Socket connection 吗? --------------------编程问答-------------------- 谢谢了,还是基础不扎实,这都没想到
补充:Java , Java SE