这个"s"真的有效吗?

pet*_*rov 5 java

这是一些示例代码(假设Java 8).

while (true){
    Socket s = serverSocket.accept();
    // some code here ... we don't assign anything to s again here ... 
}
Run Code Online (Sandbox Code Playgroud)

s循环内部是否有效?

rge*_*man 5

根据JLS,第4.12.4节定义它,在你的情况下,假设s没有分配超过它的声明,那么是s"有效最终".

某些未声明为final的变量被认为是有效的最终变量:

  • 如果满足以下所有条件,则声明符具有初始值设定项(第14.4.2节)的局部变量实际上是最终的:

    • 它没有被宣布final.

    • 它永远不会出现在赋值表达式中的左侧(第15.26节).(请注意,包含初始值设定项的局部变量声明符不是赋值表达式.)

    • 它永远不会作为前缀或后缀增量或减量运算符的操作数出现(§15.14,§15.15).

  • 如果满足以下所有条件,则声明符缺少初始值设定项的局部变量实际上是最终的:

    • 它没有被宣布为最终版.

    • 每当它在赋值表达式中作为左侧出现时,它肯定是未赋值的,并且在赋值之前没有明确赋值; 也就是说,它绝对是未分配的,并且在赋值表达式的右侧(§16(Definite Assignment))之后没有明确赋值.

    • 它永远不会作为前缀或后缀增量或减量运算符的操作数出现.

您只s在声明时分配,并且作为对象它不能是增量或减量运算符的操作数,因此它实际上是最终的.

它还声明变量在另一种情况下可以是有效的最终,如果它在声明时没有分配,只要它只分配一次,它肯定不会在声明之前分配,并且它在声明之后肯定分配.

此外,在该部分的末尾,它指出:

如果变量是有效的final,则将final修饰符添加到其声明中不会引入任何编译时错误.相反,final如果final删除修饰符,则在有效程序中声明的局部变量或参数将变为有效最终.

您应该能够明确地进行此操作final而不会导致编译器错误.如果是这样,它实际上是最终的.