【问题标题】:In Java, why do certain variables need initialization at first and others only need declaration?在Java中,为什么某些变量首先需要初始化而其他变量只需要声明?
【发布时间】:2012-04-09 02:12:11
【问题描述】:

如果我在理解 Java 何时需要初始化变量而不是简单声明时遗漏了一些东西,我会尝试更深入地理解。在下面的代码中,变量 'row' 不需要被赋值来编译和运行,但是,变量 'column' 需要。

注意:该程序没有任何用处 - 它已被修剪为仅显示此问题所需的内容,以免浪费人们宝贵的时间。

这里是sn-p的代码:

int row;      //row doesn't need initialization
int column=0; //column does need initialization
for (row=0; row<2; row++){
    for (column=0; column<2; column++){
    }
}
System.out.print("Col:" + column + " row:" + row);

为什么row在顶部编译时没有初始化,而Java认为column“可能没有被初始化”?

【问题讨论】:

  • 正如 Crozin 下面提到的,两个变量都需要初始化。您恰好在第 3 行初始化行,但如果您不在第 2 行进行初始化,则可能永远不会(根据编译器)初始化列。

标签: java variables initialization declaration


【解决方案1】:

表达式row = 0(来自外循环)保证会被计算,因此row变量在使用前总是会被初始化。当且仅当外部循环至少迭代一次时,column 变量才会被初始化。换句话说,表达式column = 0(来自内部循环)保证会被评估。

【讨论】:

    【解决方案2】:

    rowcolumn 变量在System.out.println 中使用之前,需要对其进行初始化。 row 是在外循环中初始化的,所以没问题,但列是在内循环中初始化的,编译器不会假设它会运行(即使它在实践中会运行)。

    【讨论】:

      【解决方案3】:

      Java 编译器无法遵循您的代码。它看到column 在外部for 循环的主体内被初始化,但无法确定该代码是否会运行。因此,无法确定您的变量在调用print 之前是否始终被初始化。

      另一方面,它知道外部for循环的初始化语句无论如何都保证运行。所以可以保证row会被初始化。

      【讨论】:

      • 这似乎倒退了。编译器可以跟随你的代码,它可以看到在某些情况下column不会被初始化。
      • 在这个特定的示例中,column 将始终被初始化。我想说的是编译器不知道这一点。
      • 我现在明白你的意思了。
      猜你喜欢
      • 1970-01-01
      • 2021-07-13
      • 2014-05-30
      • 2015-08-29
      • 2020-12-24
      • 1970-01-01
      • 2014-06-20
      • 2018-06-11
      • 1970-01-01
      相关资源
      最近更新 更多