java中非静态的方法.也就是类成员方法,在运行时是如何被调用的.它在那里?我见有的人说每个对象中都有一份方法,也就是说同一个类的两个对象中有其成员方法的区域. 
有的人说方法(包括静态,非静态)在一个代码区.在运行Java的运行机制与C++有何不同(C++类的方法都放在代码区)

解决方案 »

  1.   

    首先声明偶不懂c++的但是,java的方法都是放在栈内存里的
      

  2.   

    方法代码只保留一份,通过Class对象可以找到。它们存在方法区内(这是jvm规范对内存区的一个划分),在具体的jvm中说法可能不同,比如在sun的hotspot vm中,这些元数据和字符串常量池放到PermGen这个区域。方法调用采用的是类似与c++的virtual table机制。(跟具体实现相关,但懂vtable的话,这个很容易懂)对象只为数据分配内存。
    比如sun jvm中的对象布局如下:
    对象头(保存hash,锁,垃圾回收标记等信息)
    指向类信息的指针(找到该对象对应类的Class)
    【如果是数组对象,保存长度】
    后面是实际的数据成员
      

  3.   

    代码都在代码段,
    每个对象实例里面只有数据,没有代码,这个跟 C++ 一样的。回刚才那个说 java 的方法都是放在栈内存里的,
    Java 虚拟机的实力里面内存分 代码段和数据段,数据段分堆和栈,
    对象实例都在堆里面,对象实例里面只有对象的数据,也就是 field,
    每个线程有自己的栈,栈里放的是局部变量,可以是 primitive 也可以是 reference代码段里面放的是方法,常量之类的,对象方法调用的时候第一个参数是对象的 index,类似 C++ 的 this 指针,但是 Java 只用 index 不用指针,因为内存的垃圾回收,对象中内存里的位置会变。静态方法不用传对象的 index,Java 里面所有的方法调用和数据调用是用字符串查找的,这点与直接使用内存地址找函数入口的 C++ 不一样。你可以理解为所有的Java class 都是 DLL。Java 的 class 文件里面有一个 constant pool (记不太清楚了), 用来放这些字符串常量。这也是导致 Java 速度慢的一个很大的原因。喜欢这方面的东西的话,就去下 Java 的 vm spec 来看。 
      

  4.   

    其实一个类的非静态方法
    也相当于一个静态方法一样
    跟Class对象捆绑在一起的
    只不过它的方法会有所变化

    class A{
     String name="";
     public void setString(String name){
        this.name=name;
     }
    }
    其实它应该是这样的
     public void setString(A target,String name){
       target.name=name;
     }