有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么我们不能在声明局部变量之前初始化它呢?

为什么i不能在代码1中声明之前初始化,但可以在代码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) 个答案

  1. # 1 楼答案

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

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

  2. # 2 楼答案

    这是变量的范围&;使用前缺少类型:您尚未定义i。必须先定义变量才能使用:

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

    Here's提供详细信息的Java语言规范

  3. # 3 楼答案

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

  4. # 4 楼答案

    答案是执行顺序

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

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

  5. # 5 楼答案

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

    例如,这是有效的:

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

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

  6. # 6 楼答案

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

    例如:

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

    编辑:

    首先在class Code1

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

    class Code2案中

    您同时声明了instanceblock的“static”

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