为什么局部变量在if-else构造中启动而在if-else-if构造中不启动?

SER*_*ich 5 java if-statement initialization

所以我们知道必须初始化局部变量才能在if-else-if构造中使用.例如,以下代码将无法编译.

public class Test {
    public static void main (String...args){
      double price= 11;
      String model ;
      if (price>10)
        {model ="smartphone";}
      else if  (price<=11) 
        {model="not smart phone";}
      System.out.println(model);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您将局部变量String模型更改else if (price<=11)else或初始化为某个随机值,则代码将成功编译.我在这个案例中的问题是"为什么?"

现在,这是一本书的问题,解释是:

"只声明局部变量模型,而不是初始化.变量模型的初始化放在if和else-if结构中.如果在if或else-if结构中初始化变量,编译器无法确定这些条件是否会被评估为真,导致没有初始化局部变量."

即使经过解释,我仍然不明白两件事,

  1. 我不确定为什么变量模型会混淆编译器,因为无论模型是什么,双倍价格都是11.
  2. 当你把else放在最后时,它如何神奇地初始化局部变量?

Era*_*ran 11

model必须在System.out.println(model);语句之前初始化,以便代码通过编译.

  1. 编译器不分析if-else-if语句的条件以确定是否总是满足其中一个,因此无法确定if或else-if块是否总是被执行,因此它无法确定是否model会在println声明之前初始化.

  2. 当您使用if-else结构时,将执行if或else块,因此,由于它们都初始化model,因此保证在println语句之前初始化.