我已经读过其他答案,在初始化后,内存被分配给参考变量 ,这与在声明时正确分配内存的原语相反,即使它们没有被初始化!
示例:
public class Testing {
public static void main(String[] args) {
String name; // no memory allocation
String name2 = null; // memory allocated
int num; // memory allocated
}
}
这到底有多大?
答案 0 :(得分:1)
这些是局部变量,因此在堆栈上分配。甚至引用也只是堆栈中4字节指针到堆(或元空间)中的区域。
由于它们是在堆栈上分配的,因此在调用函数时会同时为所有局部变量分配内存。这里没有对参考文献或原语的特殊处理。
至于何时初始化它们的值,简短的答案是编译器可能不会在它必须之前初始化它们,但可以自由地重新排序语句。
我们可以通过查看编译器使用'javac Testing.java&&amp ;;生成的字节码来验证这一点。 javap -c测试'
public class Testing {
public static void main(String[] args) {
int n;
String name = "name";
n = 1;
System.out.println(name + n);
}
}
public static void main(java.lang.String[]);
Code:
0: ldc #2 // load constant "name"
2: astore_2 // initialize name to "name"
3: iconst_1 // load constant 1
4: istore_1 // initialize n to 1
/** do println stuff */
注意,即使它是第一个语句,也没有与int n声明相对应的指令。
答案 1 :(得分:0)
对于原始数据类型,它确定分配固定的内存量 在link中你可以阅读更多内容 作为参考,它只分配32位,可以保存对象示例的地址
字符串名称;
仅分配32位来保存字符串对象的地址 稍后当对象被实例化时,jvm为对象分配内存并将地址保存在引用变量
中