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(明确赋值))进行验证
鉴于你的问题是:
是否分配内存将在运行时根据执行上下文确定,是否需要将值推送到堆栈帧上以进行方法调用,是否有未使用的CPU寄存器可用,等等。简单的JVM实现可能总是分配内存,但这会很慢,因此,我希望大多数现实世界的JVM尝试更优化的东西。如果将
x
声明放在main之外(并使其成为静态),它将编译,而x仍将未初始化。它应该打印0。如果程序一开始没有编译,您如何理解程序将如何在内存中分配变量?如果它是局部变量,您必须初始化它。如果它不是局部变量,那么如果您没有指定,它将自动初始化为0。但内存被预留的问题是相关的,因为如果在以后的方法中,您在访问变量之前为该变量赋值,它将通过编译。值得指出的是:即使代码编译,JVM也不需要分配内存。如果一个原语变量总是本地的,并且有一个空闲寄存器,那么一个高效的JVM根本不会分配任何东西。@当然,如果程序编译了,关于为int
分配内存的问题是相关的。