Java内存分配中的默认原语值?

Java内存分配中的默认原语值?,java,memory,default,default-value,Java,Memory,Default,Default Value,我浏览了互联网,没有找到满意的答案来回答我的问题。在本地化实例中,如果我有以下代码: public static void main (String args[]) { int x; System.out.println(x); } public static void main (String args[]) { int x; } …它不会编译,因为Java编译器会警告我应该初始化x。我明白 我的问题是,Java会为整数x留出4字节的内存吗?如果是这样的话,它会清除

我浏览了互联网,没有找到满意的答案来回答我的问题。在本地化实例中,如果我有以下代码:

public static void main (String args[])
{
    int x;
    System.out.println(x);
}
public static void main (String args[])
{
    int x;
}
…它不会编译,因为Java编译器会警告我应该初始化x。我明白

我的问题是,Java会为整数x留出4字节的内存吗?如果是这样的话,它会清除掉那块内存吗?它是否将其定义为NULL(我不这么认为,因为NULL和int是不兼容的类型)?或者
int x
的内存地址仍然保留上次存储在内存中的值,还是
x
只是没有值

我知道上面的代码在C中工作,在C中,它只会打印出内存块中的任何内容。我想知道Java是如何处理这个问题的

==编辑===

好,好。出于某种原因,我对编程的基本知识已经完全忘却了,因为当一个程序没有编译时,内存分配的问题是无关紧要的,正如发布答案的两位成员所指出的那样。(球杆面掌)

那么,如果我有代码:

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

那么整数
x
在内存中是如何解析的呢?

这不是一个警告;这是一个编译器错误。该代码不会编译,因此不会生成字节码。是否留出内存的问题无关紧要,因为没有可运行的程序

但是,如果
x
变量不是本地变量,那么Java将分配一个默认值
0

国家:

程序中的每个变量在使用其值之前必须有一个值:

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

    • 对于byte类型,默认值为零,即(byte)0的值

    • 对于short类型,默认值为零,即(short)0的值

    • 对于int类型,默认值为零,即0

    • 对于long类型,默认值为零,即0L

    • 对于类型float,默认值为正零,即0.0f

    • 对于double类型,默认值为正零,即0.0d

    • 对于char类型,默认值为空字符,即“\u0000”

    • 对于boolean类型,默认值为false

    • 对于所有参考类型(§4.3),默认值为空

  • 每个方法参数(§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)明确给定一个值,其方式可以使用明确赋值规则(§16(明确赋值))进行验证


鉴于你的问题是:

  • [W] ill Java实际上为整数x留出了4字节的内存
  • 如果是这样的话,它会清除掉那块内存吗
  • 你寻求的答案是:

    局部变量声明语句可能包含初始化变量的表达式。但是,在执行声明局部变量的局部变量声明语句之前,不会初始化具有初始化表达式的局部变量。(明确赋值规则(§16(明确赋值))防止在初始化或以其他方式赋值之前使用局部变量的值。)当块或for语句的执行完成时,局部变量实际上停止存在

    因此,答案是:

  • 也许吧。该值将存储在某个位置
  • 对。JLS不允许使用未初始化的值
  • 局部变量在赋值之前不会发生任何变化。但是,在赋值之前不可能使用该值,因此永远不能使用未初始化的值。在初始化时,必须使用某种存储位置(显然)。但是,JLS并不需要JVM分配内存


    是否分配内存将在运行时根据执行上下文确定,是否需要将值推送到堆栈帧上以进行方法调用,是否有未使用的CPU寄存器可用,等等。简单的JVM实现可能总是分配内存,但这会很慢,因此,我希望大多数现实世界的JVM尝试更优化的东西。

    如果将
    x
    声明放在main之外(并使其成为静态),它将编译,而x仍将未初始化。它应该打印0。如果程序一开始没有编译,您如何理解程序将如何在内存中分配变量?如果它是局部变量,您必须初始化它。如果它不是局部变量,那么如果您没有指定,它将自动初始化为0。但内存被预留的问题是相关的,因为如果在以后的方法中,您在访问变量之前为该变量赋值,它将通过编译。值得指出的是:即使代码编译,JVM也不需要分配内存。如果一个原语变量总是本地的,并且有一个空闲寄存器,那么一个高效的JVM根本不会分配任何东西。@当然,如果程序编译了,关于为
    int
    分配内存的问题是相关的。