前两天在百度知道上看到一个问题:
请详细说明一下String分别作为成员变量与局部变量时
分配在堆内存,栈内存还是字符串常量区
以及当String做为形参传递时,内存的详细情况
http://zhidao.baidu.com/question/83355645.html
然后google到下面资料:
※局部变量与成员变量
生命周期
局部变量的生存期就是其所在方法或语句块单次执行的期间
成员变量的生存期与其所属的对象相同,随着对象的创建而创建、随对象的销毁而销毁。
初始化
成员变量可以在类中的任何地方定义,也可不必初始化,java给其默认值。(boolean为false、引用类型为null)
局部变量必须先定义后使用,必须初始化,java不会给其默认值。
※内存调用机制简要
基本类型的变量和对象的引用变量都在函数的栈内存中分配。
1)当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间。
2)当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间。
堆内存用来存放由new创建的对象和数组。
1)在堆中分配的内存,由GC来管理。
2)栈内存速度快,堆内存速度慢
HEAP — NEW的东西、成员变量
STACK — 局部变量
DATA — 静态变量、字符串常量
CODE — 存放代码
1.那String定义在方法外面,类的里面就是作为成员变量的?也就是全局变量?
2.
public class Test(){
String s1=new String;
public static void main(String[] args){
String s2=new String;
......
}
我现在有两种想法,哪个是对的?
a.因为String是引用类型,所以不论它是作为成员变量还是局部变量,系统为s1,s2分配的空间都是栈区里,它指向的对象都是分配在堆区里。
b.系统给s2分配的是在栈区里,指向堆区的new的String。因为s1是成员变量,所以他被分配在堆区里。
3.当String作为形参传递时,只是将栈区里指向引用的地址做了副本传递给方法的,没有涉及到堆区,对不?
4.上课的时候唐老师只讲到堆内存、栈内存和代码区,没有提到什么字符串常量区...