一直没能解决的java问题

有人知道,为什么新new的线程里的方法体中可以访问main的局部变量s吗?

img

注意一下,这里的s已经不是变量了,是final的常量了,这里lambda表达式其实是一个内部类,内部类里面的方法不能用外面的变量,只能用常量,jdk8以后对于这种情况会自动加上final,如果你用jdk7就会报错。

因为线程在函数内定义的啊

因为线程和定义变量都是在main函数内部定义的,所以可以调用。就如同你方法内声明变量,你在方法内调用其他方法时,可以将定义的变量传进去

这不是同一个方法体内的吗

因为你new线程的时候,你传入的是一个Runnable,这个Runnable参数是你从main方法里面传进入的,所以它可以访问。
有点类似你在main方法里面调用其他方法,给其他方法传参,这个参数肯定能够使用main的局部变量