Java 为什么可以';我们不是在声明局部变量之前初始化它吗?

Java 为什么可以';我们不是在声明局部变量之前初始化它吗?,java,Java,为什么在代码1中声明之前不能初始化i,但它可以在代码2中: class Code1 { void methodOfCode1() { // System.out.println(i); can't use a local field before it is defined // i = 10; can't initialize a local field before it is defined

为什么在代码1中声明之前不能初始化
i
,但它可以在代码2中:

    class Code1 {

        void methodOfCode1() {
        //    System.out.println(i); can't use a local field before it is defined
        //    i = 10;                can't initialize a local field before it is defined
              int i;
        }
    }



class Code2{
    static
    {
        i = 10;   //A field can be initialized before it is defined.
    }


    static int i;
}

在Java中,必须先声明变量的类型,然后才能使用它

例如:

System.out.println(i); // for this statement i is unknown/undefined...
i = 10;  // same for above...
编辑:

第一个内部
类代码1

您在使用变量之前并没有声明它,这违反了Java标准API,所以编译器显然会抱怨

当进入
类别代码2
情况时

您已经声明了
实例
的“静态”

因此,它不需要任何实例来加载它。
(深入回顾静态概念会让你找到正确的方向)

Java是强类型的,你不能使用你不知道它是什么的东西。例如,如果一个方法接收到一个
字符串
,或者如果它接收到一个
int
,则该方法是不同的,因此编译器必须能够知道调用哪个方法是正确的

例如,这是有效的:

public void dealWithIt(int val){
   val++
   System.out.println(val);
}

public void dealWithIt(String val){
    System.out.println(val);
}

在知道变量的类型之前,编译器不能给变量赋值。

这是变量的范围&在使用之前缺少类型:您还需要定义
i
。必须先定义变量才能使用:

int i = 0; 
System.out.println(i); // works
System.out.println(j); // will not work
byte j;

Java语言规范提供了详细信息。

初始化变量时,会根据数据类型分配一定量的内存


除非分配内存,否则无法初始化值。

答案是执行顺序

代码按顺序执行,您必须在使用它之前定义它是什么。因此,在方法中,必须在使用变量之前声明它


在Java中,编译器可以多次运行
。它首先运行并声明所有静态成员,然后为所有静态成员设置默认值。所有这些都发生在任何方法(静态或非静态)执行之前。

因为编译器必须知道这个变量存储在哪里以及它必须使用多少字节。如果我在初始化之前告诉计算机var=97,它就不知道这个“var”变量存储在哪里。另外,若“var”是char,计算机需要一个字节来存储在RAM中。但是,它也可以是4字节的整数(取决于不同的系统)。因此,系统会出现不明确的情况。编译器合理地不允许这样做。

因为编译器在初始化变量时不会识别它。查看详细信息。Java是一种强类型语言,这意味着在为每个变量赋值之前,它必须知道每个变量将包含什么类型的值。那么为什么我可以在下面的情况下进行初始化?请详细说明一下(我对Java不熟悉)公共类A{{i=20;//但是,可以初始化}int i;}@smssam您对这个问题的评论与您对这个问题的提问不同。。。请先澄清您的问题,我们将为您提供清晰的答案。我已编辑了问题。为什么我不能在代码1中声明i之前初始化i,但在代码2中也可以这样做。@smssam请在我的存在答案中查看我编辑的部分。谢谢@vishal,这确实很有帮助。解释得很好!!非常感谢。