比如: 一个类 class Student
       然后我创建对象:
      Student a=new Student();
    这句话的过程我是知道的,就是声明一个叫 a的引用,a放在栈中,a中存储的是 存储在堆中的Student对象的地址,请问我的理解是否正确。
  我主要的问题是,这句话有没有在堆中为刚才所说的Student对象开辟内存空间
  谢谢高手回答,我是个刚学JAVA  1天的初学者

解决方案 »

  1.   

    new 就开了空间
      

  2.   

    开空间了
    new 关键字的意思就是 “给我一个新的对象”;
    既然对象已经产生,当然在栈上就产生对象的引用,在堆上产生了新的对象
      

  3.   

    答:刚学JAVA  1天,就能理解到这一步,确实不错。我学JAVA第一天,真的完全是摸不着头脑。楼主大有可为。
    补充说明:“就是声明一个叫 a的引用,a放在栈中,”,a不一定就在栈中。要看a是在何处定义的。
      

  4.   

    那您的意思是 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]应该是引用嘛?如果是的话它存在内存中的哪里呢?
    谢谢!
      

  5.   

    答:第一句的的声明  a 是在栈中吧?不一定
    例如:
    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才是在栈中。}
      

  6.   

    谢谢高手指导,原来如此。也就是说我要定义的那个引用变量是在哪里定义的,如果那个引用在对象中定义,那他就存在堆中,以为对象存在堆中。如果那个引用在
    栈中定义,也就存放在栈中。刚才您说了方法中定义那个a引用,我想如果这个f()方发是类Exp里面的一个方法,如果再创建一个Exp对象,并且用到这个f()方法的话,那么a引用会是在堆中。请问我的理解对吗?
      

  7.   

    问:我想如果这个f()方发是类Exp里面的一个方法,如果再创建一个Exp对象,并且用到这个f()方法的话,那么a引用会是在堆中。请问我的理解对吗?
    答:不是的。只要a是在f()方法中定义的[局部变量],则a就是在栈中。如果再创建一个Exp对象,并且用到这个f()方法的话,那么a引用还是在栈中。局部变量是在栈中。
    因此:定义的位置[是对象的数据成员,还是方法中的局部变量]决定它们的空间的位置。
      

  8.   

    String s = "Hello world!";许多人都做过这样的事情,但是,我们到底声明了什么?回答通常是:一个String,内容是“Hello world!”。这样模糊的回答通常是概念不清的根源。如果要准确的回答,一半的人大概会回答错误。
    这个语句声明的是一个指向对象的引用,名为“s”,可以指向类型为String的任何对象,目前指向"Hello world!"这个String类型的对象。这就是真正发生的事情。我们并没有声明一个String对象,我们只是声明了一个只能指向String对象的引用变量。所以,如果在刚才那句语句后面,如果再运行一句:String string = s;我们是声明了另外一个只能指向String对象的引用,名为string,并没有第二个对象产生,string还是指向原来那个对象,也就是,和s指向同一个对象。
      

  9.   

    String是一个常量(存在string pool中),相同的内容只会有一份的
    所以楼上的两个引用是指向同一个位置的.....
      

  10.   

    兄弟这copy的也太明显了吧,呵呵,不管怎么样谢谢你!!呵呵
      

  11.   

    谢谢,我终于明白了,呵呵。以后可以举一反三了。多谢高手的指教,我才刚学习编程,以后的路长着呢,在这条路上能得到高手的指教是我的荣幸,谢谢师傅。
    我还有最后一个问题哦,(*^__^*) 嘻嘻……
     就是new那个Exp类来创建对象的话,请问方法f()这个对象成员函数会一起同那些对象成员变量被new到堆中来占据一片堆内存吗?
      

  12.   

    答:方法f()的代码是专门放在方法区中,不占据Exp类的对象的内存空间。
      

  13.   

    而且我今天学习到我这个帖子开头的答案了,好开心。
    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可以证明引用变量可存在堆可存在栈,关键看它是在哪里定义的。
        
      

  14.   

    确实感觉jiangnaisong很牛逼呢……例子和解释新手拈来,我糊里糊涂的搞了几年java了,现在才注意这个。
    不得不说楼主也挺牛逼,第一天就搞这个了,不过那个什么来着,这方面是搞C那些人注意得多吧……