关于String和内存分配的问题

前两天在百度知道上看到一个问题:
请详细说明一下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.上课的时候唐老师只讲到堆内存、栈内存和代码区,没有提到什么字符串常量区...

转载于:https://www.cnblogs.com/zoeinchina/archive/2009/01/27/1381079.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值