在书上看到有这样的说法
对一个类创建不同的对象时计算机只给对象的所有的属性分配了内存,而并没有给方法分配内存。方法只有一个,是属于所有的对象的,所以无论创建了多少个对象,计算机只会为一个方法分配一块内存。       第一次看到这样的说法,吃不准,有没有人给个肯定的答复,或者可以通过程序调试能证明出来的。因为自己在教java,怕误导了学生
谢谢

解决方案 »

  1.   

    关注中,
    在java中为避免对象属性的bug,
    当计算机为一个类创建不同的对象时,会默认的为每个对象的每个属性付初始值,
    所以给对象的所有的属性分配了内存.
    我用JB调试时可以看到的确是这样的.
    但是我不能证明"计算机只会为一个方法分配一块内存"
    本人理解是:
    这里的"一个方法"应理解为类的每一种方法,即:
    假设classA有f()和k()两种方法,并且产生了c1,c2,c3三个对象,
    但是计算机为f()分配了一块内存,入口地址为pf,为k()也分配了一块内存,入口地址为pk
    对象c1,c2,c3在调用f()时,都将数据发向地址pf.
    所以说"无论创建了多少个对象,计算机只会为一个方法分配一块内存"
    我觉得原因是方法是处理数据的过程,一个类产生的对象的处理方法是一样的,
    所以就只需要一块内存了.
      

  2.   

    我看了这么多书都是说每个对象都有自己的属性。只有static的属性和static方法才是只在计算机分配一块内存。不是static的方法是不是在内存中只产生一块内存就一直没留意。希望有高人指点迷津
      

  3.   

    方法具体保存在内存中的什么地方?代码块中?看java编程思想里把内存分了几个部分,代码块具体在什么地方??
      

  4.   

    这个问题也不是绝对的,因为跟java编译器的实现有关.一般来说,大部分编译器对于对象属性(非静态),每个对象的属性都回分配空间.而类属性(静态属性),对于所有对象只分配一个空间.而对于方法,比如class A的 returnType f(args){this.b=args}方法,应该只分配一个空间,在内存中的应该是如下的样子, returnType f(A obj,args){obj.b=args}(假设b是A的一个属性),而且在调用的时候(A的一个对象a),例如要调用a.f(args),应该是f(a,args){a.b=args},这就是为什么只有为方法分配一个空间,而对不同的对象有不同表现的原因.(关于方法这部分,大部分c++编译器都是这么实现的,而对于java来说,我猜,可能也是这样.
      

  5.   

    reflection的方式调用一个类的方法就是类似上面的方法调用的.
      

  6.   

    reflection调用一个类的方法就是类似上面的方法调用的.
      

  7.   

    如果想深入了结的话,去买本 深入java虚拟机 看吧!
      

  8.   

    很难讲清楚啊,毕竟java是禁止程序员直接控制内存的
    我觉得要是讲给学生不用讲那么深,
    太深了很容易迷惑的