- 论坛徽章:
- 0
|
冒个泡:
我是初学者,对大家的高谈阔论粗略的看了下!我只提下个人的小小看法!
分析楼主提供的这个程序的内存运行情况就OK了!
分析前搞清楚下面一些定义,然后找个画图工具画画就OK了!
1、变量:
按被声明的位置划分:成员变量和局部变量
按所属的数据类型划分:基本数据类型变量和引用数据类型变量
2、内存四大块:
heap:堆内存---所有new 出来的东西都在这里
stack:栈内存---局部变量
data segment :静态变量和字符串常量会存储在这里
code segment: 代码段存放在这里
3、stack 内的局部变量在程序段运行结束后,就会消失;heap内的对象没有被任何引用指向它的时候会被垃
圾回收机制处理!
补充:
1、分析楼主的题目:
package think;
public class Think_1 {
public Think_1(int i) {
}
public static void change(String str)
{
str ="new";
}
public static void main(String[] args) {
String str = "old"; // 在stack 里为变量str分配一内存空间,在data segment
//分配内存空间,内容为“old”;str内容指向“old”
System.out.println(str);//结果是"old"
change(str); //调用change(),这个str在方法内声明,所以属于局部变量,
//因此在statck里分配为str分配一内存空间,然后这个change()的str也指向
//data segment 里的“old”;接下来在data segment里分配一内存,内容
//为"new",然后让change()的str指向这个“new”。change()运行结束,局
//部变量str(change()的str)从stack里消失。只省下成员变量str指向"old"
System.out.println(str); //"old"
}
}
2、字符串:
所有字符串都是String类的实例来实现;这个java文档里有注名;不同的是,用关键子new出来的实例放在堆内存heap;字符串常量则是放在data segment内存区域,这块区域java的编译器对它进行了优化(同一内容只有一份拷贝),所以才会有字符串的“==”和“equals()”的细节问题!好点的java书对这个部分讲的比较细;引用《java核心技术I卷》中的一小段话:
“如果虚拟机总是将相同的字符串共享,就可以使用 == 运算符检测是否相等。但实际上只有字符串常量是共享的,而 + 或 subString等操作产生的结果都不是共享的。因此,永远不要使用 == 运算符测试字符串的相等性,否则在程序中会出现糟糕的bug,从表面上看很象随机产生的间歇性错误。”
其实只要分析下内存模型,以及对JVM的运行简单了解下就会对String有个深刻的认识!
3、传值还是传递对象的应用?
分析了内存模型就很容易理解这个问题了!传递的是值,但是这个值并没有包含对象本身,而是一个引用!这也就是斑竹说的不矛盾的所在吧?呵呵!一定要认识到:对象变量并没有实际包含一个对象,而是引用一个对象!在java中,任何对象变量的值都是对存储在另外一处的一个对象的引用,new操作符返回的也是一个引用!
仅供交流,不对之处,还望海涵!
[ 本帖最后由 hotdll 于 2007-2-15 00:07 编辑 ] |
|