Java:对变量初始化概念感到困惑

Java:对变量初始化概念感到困惑,java,variables,compiler-errors,initialization,declaration,Java,Variables,Compiler Errors,Initialization,Declaration,我是Java新手,在理解声明的概念和变量的初始化方面有点困难 例如,当我这样做时: public class Foo { public static void main (String[] args) { int x, y; for (x = 0 ; x < 10 ; x++) { y = x + 1; } System.out.println(x); System.out.pri

我是Java新手,在理解声明的概念和变量的初始化方面有点困难

例如,当我这样做时:

public class Foo {
    public static void main (String[] args) {
        int x, y;
        for (x = 0 ; x < 10 ; x++) {
           y = x + 1;
        }
        System.out.println(x);
        System.out.println(y);
    }
}

编辑2:

如果我真的为else部分提供了另一个条件,那么它看起来会给我同样的错误:

if (x == 0) {
    y = 1;
}
else if (x == 1) {
    y = 2;
}

所以我猜另一个例子是有效的,因为y在if和else部分都被初始化了,这意味着无论给定的条件是什么,y都会被初始化。现在我真的明白了。谢谢

局部变量没有默认值,您需要初始化它们。您当然正在设置x的值(
x=0
),但编译器不会检查是否实际输入了循环体。因此,将
y
的值设为
0

这是错误的:

   public class Foo {
        public static void main (String[] args) {
            int = x, y; // Wrong
            for (x = 0 ; x < 10 ; x++) {
               y = x + 1;
            }
            System.out.println(x);
            System.out.println(y);
        }
    }
这也是正确的:

public class Foo {
    public static void main (String[] args) {
        int x = 1, y = 10; // Declaration + initialization

'希望这有帮助…

x在for循环中初始化(第一个参数)

如果您查看代码;在for循环中将x初始化为0,然后用x++将其递增。但您正在初始化Y内部循环,该循环可能在运行时执行,也可能不执行(与编译时无关)。在Java中,在使用局部变量之前必须初始化它,如果不这样做,编译器将提示错误。这就是为什么打印x而不是Y的原因。考虑一下如果你的循环是

for (x = 0 ; x < someOtherVariable ; x++) {
(x=0;x{
someOtherVariable
的值恰好为零。循环根本不会运行,因此
y
永远不会被初始化

当然,您编写的循环将始终运行十次,因为下限和上限都是硬编码的,但是编译器(显然)没有对代码进行足够的分析来证明这一点。它看到一个变量仅在循环中初始化,并且遵循循环可能根本不会运行的一般规则,它抱怨该变量可能没有初始化


顺便说一句,
int=x,y;
不是有效的Java语法:等号不属于那里。

直到运行时才能确定
for
循环是否会运行一次。因此初始化不起作用(即编译器不能依赖它,因此它会出错)


在运行时之前,无法确定这两个子句中的哪一个将被激发,
if
else
子句将被激发。但是,在编译时,我们知道其中一个或另一个将被激发,因此如果在这两个子句中都初始化,编译错误将消失。

这取决于两件事:

  • 无论发生什么都执行(此处为“x”)
  • 基于某些约束执行(此处为“y”)

编译器在任何情况下都会排除歧义,因此在有条件执行的块中见证变量初始化时会抛出错误。

我假设声明中的
=
是typo@Bozho是的,那是一个打字错误。我修正了它。谢谢!是的!这是一件很简单的事情,但我还是感到困惑。谢谢。@Dennis很乐意帮忙。在Java中,在大多数情况下,错误消息会告诉你一切。这很好,在其他语言中不是这样。这解释了很多。因为我认为如果我没有初始化每个基本数据类型,就会给它一个默认值,但现在我知道局部变量没有给它一个默认值。谢谢!!只有当它是类变量,但局部变量不是
public class Foo {
    public static void main (String[] args) {
        int x = 1, y = 10; // Declaration + initialization
for (x = 0 ; x < someOtherVariable ; x++) {