为什么我们不能在声明它之前初始化局部变量而不像静态变量?

时间:2016-06-01 12:58:47

标签: 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
              int i;
        }
    }



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


    static int i;
}

6 个答案:

答案 0 :(得分:3)

答案是执行顺序。

代码按顺序执行,您必须在使用之前定义某些内容。因此,在使用方法时,必须在使用之前声明变量。

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

答案 1 :(得分:0)

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

例如:

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

已编辑:

首先在class Code1内,

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

进入class Code2案例,

你已宣布'静态' instance以及block

所以它不需要任何实例来加载它。 (深入了解静态概念会让你走向正确的方向)

答案 2 :(得分:0)

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

例如,这是有效的:

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

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

在知道变量的类型之前,编译器无法为变量赋值。

答案 3 :(得分:0)

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

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

Here's Java语言规范为您提供了详细信息。

答案 4 :(得分:0)

在初始化变量期间,会根据数据类型分配一定量的内存。

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

答案 5 :(得分:0)

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