如题  算是问题一吧。
2。如下代码
  class A{
     A fun(){return this;}     public static void main(String[] args){
         A a=new A();
         a.fun().fun()....;
     }
  }
不明白的地方  a.fun()返回一个引用(地址)存放在哪里呢 
我想是不是有个临时内存什么的 存放方法返回的东西 然后再
通过那个临时内存中的地址继续调用fun()呢 
高人指点下。。

解决方案 »

  1.   

    a.fun()返回一个对象的引用,存放在栈中
      

  2.   

    a.fun() 如果返回的是其他类型的对象 那不把原来的对象丢了吗
      

  3.   

    所有的类都是在对其第一次引用的时候动态加载到jvm中的,一旦一个类的Class对象被加载到内存中,那么着各类的所有对象都由这个Class对象产生。当程序创建第一个对某个类的引用的时候,就会动态加载这个类,这个证明构造方法也是静态的方法,虽然他前面没有static关键字。实际上每一个new产生的对象都可以看做是对最开始的那个静态类的一次引用。
      

  4.   

    a.fun().fun()
    个人理解:
    前面的a.fun()返回的是对象a 自身的引用,然后把这个引用赋值给指向A类型对象的栈内存变量,这个变量也是指向a的。再由这个变量第二次调用fun(),返回引用......
      

  5.   

      A fun(){return this;} 可以这样理解和c++中的
    A fun(){
           A *this = new A;
    return this;} c中的
    A fun(){
           A *this = malloc(sizeof(A));
           return this;
    }
    或者A中增加一个字段叫 A *this;
    c中可以 struct A{
        struct A *this;
        ......其他字段
    }初始化的时候为
    struct A a = {this=&a};
    下面的A fun(){
           A *this = malloc(sizeof(A));
           return this;
    }
    通过编译器的暗地操作为
    A fun(struct A a){
        return a->this;
    }
    就是一个自引用,new A()的时候都是在堆上分配的,this只是指向堆上分配的那个地址而已
      

  6.   


    1)先不考虑内部类,,因为内部类对象中确实含有一个对象成员,指向外部类的对象(即:指向外部类对象的那个this)。
    2)若不是内部类,则类中根本不存在所谓的数据成员this.
    3)A fun(){return this;}
    编译时其实是按如下生成代码的:(会向方法自动传输一个隐含的形式参数:这个就是this)
    A  fun(A this,你的其它参数) 
    {return this;}
    4)调用时:a.fun();其实是这样:fun(a);//这个a其实传输给了那个所谓的this.
    5)a.fun().fun();其实是:
    A temp=a.fun();
    temp.fun();
      

  7.   

    [A  fun(A this,你的其它参数)
    {return this;}
    4)调用时:a.fun();其实是这样:fun(a);//这个a其实传输给了那个所谓的this.
    5)a.fun().fun();其实是:
    A temp=a.fun();
    temp.fun();
     引用上面的。其实 面向对象的方法调用 就是给方法发送信息。例如:a.fun()其实就是给fun函数发送信息
    java内部会帮我们转为这样子fun(a)调用fun(),地址告诉fun方法是 那个对象调用。其中a存储的就是对象的地址。至于函数返回值 ,在x86平台函数的返回值都是存储在eax寄存器的。j我估计java也使用。因为所有的语言都最后都是机器代码。
      

  8.   

    如果说JAVA中不谈指针,那空指针异常,你怎么读的 ????NullPointerException
      

  9.   

    返回值是作为一个临时的变量存放在stack中的,当调用完之后就自动消失了,不需要垃圾回收机制来回收!
      

  10.   

     模糊的看了一下 时间也太晚啦 从你的代码看,我想到 API中的StringBuffer这个类的append(参数)方法!! 一样的吧
    1.存放在哪里呢?
     肯定是内存,不过内存是有规律,什么东西放在什么地方 !(好像分那么几块吧,自己去查下!内存的分配)
    2.存放方法返回的东西?
    对 是一个东西 不过是一个16进制的内存地址,类似移动服务员的员工编号名字!(找人要靠名字,生成一个对象放到内存中,那你找它就相当于找员工用编号,而java中是内存的地址,一样的)
    3.然后再 通过那个临时内存中的地址继续调用fun()呢 ?
     不是那个地址,是那个地址所引用的对象! 太晚啦  不知道写些什么!!
      

  11.   

    再补补  x86上,一般整数类型的返回值放在 eax, float 类型的防在浮点数寄存器里。如果返回的对象比较大,放在堆栈里。
      

  12.   

    记得在读jvm的书说的 java是有指针的。对象的引用在内部就是用指针实现的