Java中没有指针,但存在“引用”的概念;下面从内存分配的角度,分析一下java中的变量。以下的程序都比较简单,各位慢慢看,,
【程序一】
class main
{
public static void main(String[] args)
{
String s1="Hello world1";
String s2=s1;
System.out.println("s1=" + s1);
System.out.println("s2=" + s2);
s2="abcdef";
System.out.println("s1=" + s1);
System.out.println("s2=" + s2);
}
}
程序输出结果如下:
---------- 运行 ----------
s1=Hello world1
s2=Hello world1
s1=Hello world1
s2=abcdef
Normal Termination
输出完成(耗时 1 秒)。
程序分析:
String s2=s1; 从java的角度理解,应该是s2和s1共同指向了"Hello world1" 字符串所占用的内存空间;
下面的赋值s2="abcdef";又将变量s2执行了"abcdef"字符串所占用的内存空间,此时s1,s2分别指向了不同的内存空间。
【程序二】
class main
{
public static void main(String[] args)
{
String s="Hello world1";
System.out.println("s=" + s);
s="Hello world2";
System.out.println("s=" + s);
s="Hello world3";
System.out.println("s=" + s);
}
}
程序输出结果如下:
---------- 运行 ----------
s=Hello world1
s=Hello world2
s=Hello world3
Normal Termination
输出完成(耗时 0 秒)。
程序分析:
这例程序和上例不同之处是只使用了一个变量s。
String s="Hello world1"; 定义了一个字符串的引用s,并将其指向"Hello world1"字符串所占用的内存空间;
s="Hello world2"; 使s指向了"Hello world2" 字符串所占用的内存空间;
这是"Hello world1"所占用的空间没有变量使用,会被jvm的垃圾回收机制回收。
s="Hello world3"; 也是同样的道理。
总结:
定义java变量的时候,实际上只是产生了一个指向该类型的引用(它也占用内存空间),对这个“引用”进行赋值,是将其指向某个内存空间;多次对“引用”进行赋值,jvm会产生多个内存空间,同时回收以前不用的内存空间。
有鉴于此,可知,java在使用内存方面是毫不吝惜的,变量定义与赋值时,会尽可能多的产生内存空间,不用的内存空间交给jvm的垃圾回收机制。
posted on 2006-12-22 09:26
comchyi 阅读(418)
评论(1) 编辑 收藏