今天在装VS2008,实在是太墨迹了,顺便看了下JAVA基础,想到了几种JAVA创建对象的方式,对于其中内存的分配方式感到疑惑,于是就百度了下,下面做下总结:
a)首先,我们应该要知道,在创建一个对象的时候,JAVA会用到内存里面的3个东西,
堆:存放所用new出来的对象
栈:存放对象的引用(也就是地址),基本数据类型产生的变量
常量池:(这个比较特殊)是用来存放String常量,如“abc”
注意:堆比栈的速度要慢很多,
b)下面,分析下下面几种创建对象的方式:
String a = "123";
这是声明一个字符串常量,首先在常量池(如果是int或者其他基本类型,则是在堆中)
中查找有没有这个“abcdef”,如果没有,在池中产生一个“123”,然后把引用赋值给栈中的a
String a = new String("123");
因为有new,调用了String类的构造,在堆中产生了一个对象,值为“abcdef”,然后
在栈中声明一个引用a,把产生的对象的引用赋值给a
c)还有一个疑问:
SomeClass a=new SomeClass();
a=new SomeClass();
new SomeClass();
他们三者之间有什么区别和联系呢?
SomeClass a=new SomeClass();
1,SomeClass:栈中产生一个a对象,
2,new SomeClass() 堆中产生一个对象
3."="将new出来的对象地址赋给a
a=new SomeClass();
1.new SomeClass();重新开辟一个对象
2,“=”,将新对象地址赋给a
new SomeClass();
直接在堆中产生一个对象,但是没有传给栈中的一个引用(根据JAVA的垃圾回收机制,长时间不用,JVM会调用
System.gc()方法析构掉这个对象)。
很多都是网上拜读出来的,感觉很有用,就发出来了