静态声明和非静态声明之间的区别

时间:2012-07-12 18:24:48

标签: java

静态变量:类变量是不是为类的每个对象单独创建的 实例变量:也是类变量,但是分别为每个对象创建 以上定义仅供参考。

请解释为什么我在这个类声明中遇到错误。我知道这只是因为我没有初始化x。

class non_static{
public static void main(String args[])
{
int x;
System.out.println(x);

}
}

但这个班级宣言完全没问题。

class static_example{
static int x;
public static void main(String args[])
{
System.out.println(x);
}

}

此程序的输出为0.

请解释我为什么静态成员使用默认值初始化,而局部变量不是。

4 个答案:

答案 0 :(得分:5)

它与静态声明和实例声明无关。它是本地声明,没有默认值,并且在未初始化时使用会导致错误。

public class Example {
    private static int stattic;
    private int instancee;

    public void someMethod() {
        System.out.println("I am static and 0: " + stattic);
        System.out.println("I am not static and 0: " + instancee);

        int locall;

        System.out.println("I am causing an error because I have not been initialized: " + locall);
    }
}

答案 1 :(得分:2)

如果你想知道Java为什么会这样说的背景,那么它必须具备静态代码分析的极限。从堆栈分配的内存(这是本地变量所在的位置)可以由编译器确认,以便在使用前进行初始化。堆分配存储(静态变量,实例变量)不是这样。这就是为什么JLS要求实现在暴露指向它之前始终将任何堆存储清零的原因。

答案 2 :(得分:1)

必须始终使用值初始化局部变量。对于非局部变量(即实例或静态变量),默认值定义为相应类型的空值(null,零或false)。

答案 3 :(得分:0)

在java中, Instance Variables (即类变量)初始化为默认值。局部变量(即方法变量)不能在没有初始化的情况下使用......

class static_example{
static int x;
public static void main(String args[])
{
System.out.println(x);
}

}

在上面的例子中,x在Class范围内声明...所以它已经初始化为默认值0,所以它没有给出任何错误..