默认值 - Java澄清

RDP*_*DPD 1 java

为什么没有分配给变量的默认值,这些变量尚未在具有main函数的Class中初始化?

class Test {
    public static void main(String[] args) {

        int x;// x has no default value
        String y;// y has no default value
        System.out.println("x is " + );
        System.out.println("y is " + );
    }
}
Run Code Online (Sandbox Code Playgroud)

而如果变量在没有任何主函数的类中保持未初始化,则会分配默认值.

class Student {
    String name; // name has default value null
    int age; // age has default value 0
    boolean isScienceMajor; // isScienceMajor has default value false
    char gender; // c has default value '\u0000'
    int x;
    String y;
}
Run Code Online (Sandbox Code Playgroud)

Ósc*_*pez 5

请注意,问题中的代码代表不同的情况.在第一种情况下,变量是局部的并且存在于main()方法内部.在第二种情况下,您要声明实例属性,而不是局部变量.

在Java中,只使用默认值自动初始化属性.在所有方法中,即使在main()方法中,也必须为方法内部声明的变量显式提供初始化值.

这在Java语言规范的第4.12.5节中进行了解释:

每个类变量,实例变量或数组组件在创建时都使用默认值进行初始化(§15.9,§15.10)

每个方法参数(第8.4.1节)初始化为方法调用者提供的相应参数值(第15.12节)

每个构造函数参数(第8.8.1节)初始化为类实例创建表达式(第15.9节)或显式构造函数调用(第8.8.7节)提供的相应参数值

异常参数(§14.20)初始化为表示异常的抛出对象(§11.3,§14.18)

局部变量(§14.4,§14.14)必须在使用之前通过初始化(第14.4节)或赋值(第15.26节)以可以使用明确赋值规则验证的方式显式赋予值(§14.4,§14.14) 16)

看到几个原因为什么局部变量不会被自动初始化,请看一看这个以前的问题.