学了这么久java其实我对object的reference一直好像是似懂非懂的.只是觉得reference应该是指的一个内存地址,跟C的指针差不多,用来控制object的,不过要受编译器的限制也不能进行指针运算,也算是一个安全的指针吧.但让我模糊的是 reference前面的类型究竟有什么作用.比如我定义一个类叫p,那么 p a=new p(); 类型究竟有什么作用,在内存(也就是堆栈中)中是怎么分配.因为用new p()可以在堆中建立一个对象的实例,a 是在statc中生成一个指向new p(),但a 交朋友的对象真的没起多大作用.请大家指点一下..

解决方案 »

  1.   

    不在前面放个类型那岂不是跟 JavaScript 一样?
      

  2.   

    p a=new p(); p的作用是描述了p这个类的信息.如同int i 告诉编译器 i是32bit的整形,short s 告诉编译器 s是16bit的短整形a的作用是根据p的描述信息分配创建一个引用实例.
      

  3.   

    最好能说说他们在内存中是怎么存的,用基本类型不能完全说明这个问题.比如 int a=3;
    他是存在statc中的,这好像能说明一些.
    那么说明为a分配了一个内存地址,内存地址是4bit的内存空间,并且内存空间存的数据是3;
    (也不知道我说得对不对,以前真还仔细考虑这个问题,请大家多多发言,把这个问题探讨清楚.)p a=new p();到底是怎么操作的.a中肯定也是存的内存地址,但是什么,是和p 有关系还是p()有关系.最好结合多态中的upcasting来说明一下.
      

  4.   

    这是我曾经写过的一篇关于JAVA reference的帖子,浅薄的说了一下reference,并就reference作为参数的传递给出了实际的例子,楼主不妨看看。
    http://community.csdn.net/Expert/topic/3993/3993622.xml?temp=.2393@.@||~
      

  5.   

    p a=new p();到底是怎么操作的.a中肯定也是存的内存地址,但是什么,是和p 有关系还是p()有关系.a中就是村的地址,类对象p的在堆内存中的地址。前面的修饰p,应该是和后面的p()一起结合起来
    告诉a,它所指的就是类p的对象new p()的地址。应该是这样的,I think.
      

  6.   

    P是一个地址,四个字节大吧。而对象是在堆中分配的,那个P就指向堆中的对象。你可以通过P来操作这个对象。
    对象在内存中分配的形式是:成员变量(就是Field),是顺序存放的。而里面的方法不放在对象中,而是放在一个存放函数的地方,里面只是有这个函数的地址而已。至于虚方法,则有一个虚方法表。指向这个虚方法表的指针放在对象的最开始位置。
    用P,是因为,每个对象都不一样,里面的成员也不一样,用P就是认编译器知道那块内存多大范围是这个对象的,里面有什么方法。
    这就是为什么据有的对象都能用Object引用,但是子类引用父类就会出现错误。
    唉。有点说乱了。
      

  7.   

    简单的说就是在堆栈中分配一个空间new p(),接着将这个空间的地址告诉a即 p a = new p().
      

  8.   

    p a=new p()中a是存的首地址吗?我好像有点领悟了,new p()是在heap里申请一个空间建立一个实例,object reference的位置由它确定.p a还是确定,reference的位置.结合upcasting.
    就好像这样. bird a=new glede();
    这定义一个鸟的类型,但是可以存一个老鹰的实例.一样可以调用base class的各个函数.不知道我的理解对不对?
      

  9.   

    p a=new p()中a是存的首地址吗?  指向的就是首地址,在多态中会根据计算公式动态执行堆里对象的方法(java是强类型语言,还可以检查方法的参数,返回类型等)在java中,万物皆是对象(基本类型例外),对象都是通过reference来调用。jvm是根据这种映射来确定是否清除堆里对象的内存。参考:
    java编程思想 第一章 对象