JAVA基础问题求解【创建对象的具体过程在内存中是怎么进行的?】

来源:百度知道 编辑:UC知道 时间:2024/09/22 04:22:23
比如:
String a=new String("abcdef");

String a="abcdef";他们分别是在内存中怎么进行的呢?

还有个问题就是:
SomeClass a=new SomeClass();
a=new SomeClass();
new SomeClass();
他们三者之间有什么区别和联系呢?

谢谢!

我的理解是:
首先来了解java程序中内存的结构:
堆:存放所用new出来的对象
栈:存放对象的引用(也就是地址),基本数据类型产生的变量
常量池:(这个比较特殊)是用来存放String常量,如“abc”

你的例子:
String a = new String("abcdef");
因为有new,调用了String类的构造,在堆中产生了一个对象,值为“abcdef”,
然后在栈中声明一个引用a,把产生的对象的引用赋值给a;
String a = "abcdef";
这是声明一个字符串常量,首先在池中查找有没有这个“abcdef”,如果没有,在池中产生一个“abcdef”,然后把引用赋值给栈中的a

你的第二个问题
SomeClass a=new SomeClass();
这个就是在堆中构造一个对象,然后把引用传给栈中的a
a=new SomeClass();
这个语法是错误的,因为a没有声明
new SomeClass();
直接在堆中产生一个对象,但是没有传给栈中的一个引用(根据JAVA的垃圾回收机制,长时间不用,JVM会调用System.gc()方法析构掉这个对象)。
总结一下,你的第一种和第三种方法都可以产生一个对象,如果你只想产生一个对象然后只运行一次,可以用第3个,不过因为没有引用指向它,以后想使用这个对象而找不到;第一种是常见的方法,产生一个对象,并且声明栈中的一个引用指向它,以后可以用这个引用随时使用这个对象。
(其实有些不是绝对的,比如除了用new,反射机制也可以产生对象;而有时对象会放在栈中,这些你不用管)
说的有点啰嗦,大概就是这些。

这个问题我回答你。 

学过汇编语言的人都知道。 

一个应用程序一般分为3个部分。 

1.数据段 

2.栈段 

3.代码段 

有关上面的具体含义,解释起来用的文字较多。