比如: 一个类 class Student
然后我创建对象:
Student a=new Student();
这句话的过程我是知道的,就是声明一个叫 a的引用,a放在栈中,a中存储的是 存储在堆中的Student对象的地址,请问我的理解是否正确。
我主要的问题是,这句话有没有在堆中为刚才所说的Student对象开辟内存空间
谢谢高手回答,我是个刚学JAVA 1天的初学者
然后我创建对象:
Student a=new Student();
这句话的过程我是知道的,就是声明一个叫 a的引用,a放在栈中,a中存储的是 存储在堆中的Student对象的地址,请问我的理解是否正确。
我主要的问题是,这句话有没有在堆中为刚才所说的Student对象开辟内存空间
谢谢高手回答,我是个刚学JAVA 1天的初学者
new 关键字的意思就是 “给我一个新的对象”;
既然对象已经产生,当然在栈上就产生对象的引用,在堆上产生了新的对象
补充说明:“就是声明一个叫 a的引用,a放在栈中,”,a不一定就在栈中。要看a是在何处定义的。
int a[][];
a=new int[3][];
a[0]=new int[3];
a[1]=new int[2];
a[2]=new int[1];
第一句的的声明 a 是在栈中吧?
那啊a[0],a[1],a[3]应该是引用嘛?如果是的话它存在内存中的哪里呢?
谢谢!
例如:
class Exp
{
int a[][]=new int[2][3];
}
Exp p1=new Exp();
那这个p1.a,你说这个a是在栈中吗?当然不是。它是对象中的成员,因而是在堆中。
只有是在方法中(或相当于方法)的局部变量的这个a,才是在栈中。
即,若有
void f()
{
int a[][]=new int[2][3];
//这样的a才是在栈中。}
栈中定义,也就存放在栈中。刚才您说了方法中定义那个a引用,我想如果这个f()方发是类Exp里面的一个方法,如果再创建一个Exp对象,并且用到这个f()方法的话,那么a引用会是在堆中。请问我的理解对吗?
答:不是的。只要a是在f()方法中定义的[局部变量],则a就是在栈中。如果再创建一个Exp对象,并且用到这个f()方法的话,那么a引用还是在栈中。局部变量是在栈中。
因此:定义的位置[是对象的数据成员,还是方法中的局部变量]决定它们的空间的位置。
这个语句声明的是一个指向对象的引用,名为“s”,可以指向类型为String的任何对象,目前指向"Hello world!"这个String类型的对象。这就是真正发生的事情。我们并没有声明一个String对象,我们只是声明了一个只能指向String对象的引用变量。所以,如果在刚才那句语句后面,如果再运行一句:String string = s;我们是声明了另外一个只能指向String对象的引用,名为string,并没有第二个对象产生,string还是指向原来那个对象,也就是,和s指向同一个对象。
所以楼上的两个引用是指向同一个位置的.....
我还有最后一个问题哦,(*^__^*) 嘻嘻……
就是new那个Exp类来创建对象的话,请问方法f()这个对象成员函数会一起同那些对象成员变量被new到堆中来占据一片堆内存吗?
1.String s[]=new String[5];//在栈中定义了一个指向堆中某个首地址的引用变量a。
a[1]="thanks";//在堆中再定义了一个指向“thanks”首地址的引用变量a[1];2.int[][] i=new int[2][2];//在栈中建立了一个指向堆中某个一维数组首地址的引用变量i。
i[0]=new int[]{1,2};//在堆中的上面那个一维数组中又定义了一个指向某个一维数组的首地址的引用i[0]。
综合1,2可以证明引用变量可存在堆可存在栈,关键看它是在哪里定义的。
不得不说楼主也挺牛逼,第一天就搞这个了,不过那个什么来着,这方面是搞C那些人注意得多吧……