1.  静态方法在堆上分配内存,实例方法在堆栈上。事实上所有的方法都不可能在堆或者堆栈上分配内存,方法作为代码是被加载到特殊的代码内存区域,这个内存区域是不可写的。
From:http://www.cnblogs.com/Ivony/archive/2006/06/30/439377.html我的问题是:这里说的堆和栈 和 数据结构中所讲的堆和栈有什么区别,应该怎样理解静态方法和实例方法所指的堆和栈呢?2.为什么在Console程序中,main函数不能够直接调用非静态方法?3.为什么静态方法也不能直接调用实例方法?

解决方案 »

  1.   

    注意main()函数自身就是静态方法.
      

  2.   

    “静态方法在堆上分配内存,实例方法在堆栈上”
    方法无所谓分不分配内存,方法是代码段的东西,就是一堆汇编指令
    但事实上,执行指令的时候似乎不会区分这个,可以在堆上动态开辟一片区域,然后写入汇编指令,然后在执行中跳转到那个地址去,同样能够正常执行,进程(代码)注入向来都是这么做的什么静态方法、实例方法只不过是语言级别上的东西,在生成汇编指令后,静态方法和实例方法没什么不同,都是代码段的函数(类似于原来的全局函数的概念),其中编译器会在实例方法前加上一个默认的this指针作为参数。
    如:
    class1 c = new class1();
    c.Test();
    就等同(假设是C语言用struct1模拟class1)
    struct1 *c = malloc(sizeof(struct1));
    Test(c);
    或者把Test这个方法的指针放到struct1中,就写成这样了
    struct1 *c = malloc(sizeof(struct1));
    c.pTest = Test;
    c.pTest(c);
    然后编译器将参数给省略,并将this关键字代表省略的参数,就成了现在的实例方法了数据结构里说的堆、栈是描述处理数据的一种方式,对于应用程序执行时说的堆、栈是指实际的内存(将数据结构中的理论用于了实践)。
    对于堆、栈来数,一般指的数据(对象),其实对于对象,有成员变量和成员方法,严格来说,说该对象存在于栈区或者堆区是指成员变量的位置,成员方法实际是机器指令,一般是不变的,存在于代码段。
      

  3.   

    1.不太会.
    2。Main方法调用非静态方法:对象名.方法名();
    3.和2一样。