Java 局部变量的初始化

Java 局部变量的初始化,java,Java,声明未初始化的final变量和将final变量设置为null有什么区别 void A(String pizza) { String retVal = null; if (StringUtils.isBlank(pizza)) { retVal = "blank" } else { retVal = computeString(pizza); } } void A(String pizza) { final String re

声明未初始化的final变量和将final变量设置为null有什么区别

void A(String pizza) {
    String retVal = null;

    if (StringUtils.isBlank(pizza)) {
       retVal = "blank"
    } else {
       retVal = computeString(pizza);
    }
}

void A(String pizza) {
    final String retVal;

    if(StringUtils.isBlank(pizza)) {
       retVal = "blank"
    } else {
       retVal = computeString(pizza);
    }
}

也许我不明白,但在第二个示例中,您将无法在
if-else
块之后重新分配
retVal

只能分配给一次。声明变量final可以作为 有用的文档,其值不会改变,可以帮助避免 编程错误


如果您已将
final
变量设置为
null
,您将无法在
If
块中重新分配它。

也许我不明白,但在第二个示例中,您将无法在
If else
块之后重新分配
retVal

只能分配给一次。声明变量final可以作为 有用的文档,其值不会改变,可以帮助避免 编程错误


如果将
final
变量设置为
null
,则无法在
If
块中重新分配它。

如果将final变量设置为null,则无法为其分配任何其他内容。。。
最终变量(自身)永远不会更改。

如果将最终变量设置为null,则永远无法为其分配任何其他内容。。。
最终变量(自身)永远不会改变。

区别在于最终变量永远不会改变为具有另一个值。

区别在于最终变量永远不会改变为具有另一个值。

在这个变量中,
retVal=null
没有任何作用。你给它一个null值。您从来没有使用该值的代码。然后根据是执行if-Then还是else部分,给它另一个值

在我添加注释的代码中,可以使用或更改
retVal
的值

  void A(String pizza) {
      String retVal = null;
      ... code in here could use it or give it a new value ...
      if(StringUtils.isBlank(pizza) {
         retVal = "blank"
      } else {
         retVal = computeString(pizza);
      }
      ... additional code here might change it (and can use it's value) ...
   }
在本例中,每次调用该方法时都需要给
retVal
一个值。您的if-then-else代码就是这样做的。给定值后,该值永远不能更改

一个区别是编译器会在给它赋值之前告诉您是否使用了
retVal
。它会合理地告诉您变量还没有值

   void A(String pizza) {
      final String retVal;
      ... code in here cannot use it or give it a value, too ...
      if(StringUtils.isBlank(pizza) {
         retVal = "blank"
      } else {
         retVal = computeString(pizza);
      }
      ... additional code here cannot change it but can use it's value ...
   }

在本例中,
retVal=null
不起任何作用。你给它一个null值。您从来没有使用该值的代码。然后根据是执行if-Then还是else部分,给它另一个值

在我添加注释的代码中,可以使用或更改
retVal
的值

  void A(String pizza) {
      String retVal = null;
      ... code in here could use it or give it a new value ...
      if(StringUtils.isBlank(pizza) {
         retVal = "blank"
      } else {
         retVal = computeString(pizza);
      }
      ... additional code here might change it (and can use it's value) ...
   }
在本例中,每次调用该方法时都需要给
retVal
一个值。您的if-then-else代码就是这样做的。给定值后,该值永远不能更改

一个区别是编译器会在给它赋值之前告诉您是否使用了
retVal
。它会合理地告诉您变量还没有值

   void A(String pizza) {
      final String retVal;
      ... code in here cannot use it or give it a value, too ...
      if(StringUtils.isBlank(pizza) {
         retVal = "blank"
      } else {
         retVal = computeString(pizza);
      }
      ... additional code here cannot change it but can use it's value ...
   }

final
表示:

  • 必须分配某些内容(即使为空)
  • 之后,您不能将引用更改为任何其他内容(当然,您可以修改 引用的对象)
其含义是高度语义化的,确保您不会意外忘记指定什么,并且您可以在确保值不会意外更改的情况下编写代码

省略此修饰符只会删除该保证,而不会删除其他内容。

final
表示:

  • 必须分配某些内容(即使为空)
  • 之后,您不能将引用更改为任何其他内容(当然,您可以修改 引用的对象)
其含义是高度语义化的,确保您不会意外忘记指定什么,并且您可以在确保值不会意外更改的情况下编写代码

省略此修饰符只会删除该保证,而不会删除任何其他内容。

您的意思是在第一个a上有一个
final
吗?您的意思是在第一个a上有一个
final