请纠正我,这非常令人困惑

时间:2014-03-16 18:29:01

标签: java reflection

如果我错了,请纠正我。 我被教过,

  1. 每次加载一个类时,都会在堆内存中创建一个类对象,并且它的名称为Class的引用保存在类区
  2. 每个字段,如字符串,int,无论是什么,都存储在对象中,其引用在创建的类对象中给出
  3. 同样适用于方法,构造函数等
  4. 现在还有一个问题,是否为每个对象存储了所有这些内容,或者只创建了一个对象以了解信息

    另外请告诉我这个Field类实际上有什么?比如像

    class b
    {
    String s="sdnla";
    }
    

    并且有两个b类,b1和b2对象,Field类对象有什么?

4 个答案:

答案 0 :(得分:2)

在正常情况下,每个类只有一个Class对象。不是每个对象。如果Java为每个对象创建了所有结构,那么它将使用大量内存;远远超过实际需要。

如果要在应用程序中创建多个类加载器,那么每个类最终可能会有多个Class对象 - 每个类加载器都有一个Class对象。但是我们中很少有人做过这样的事情。如果您正在编写应用程序服务器或类似的东西,则可以执行此操作。

答案 1 :(得分:0)

为每个对象初始化类中的变量 为它分配单独的空间 但是对于构造函数和方法,只分配了一个公共空间 并且该类的所有对象都引用了这个

答案 2 :(得分:0)

如果我理解你的问题。请考虑那种情况下的字符串池。我认为无论你创建多少个对象,两个引用都可能指向字符串池中的相同引用。

  

字符串池是Java堆中的一个特殊存储区域,主要位于   PerGen空间,用于存储字符串文字,例如" abc"。当Java程序   使用String文字创建一个新的String,JVM检查该String   在池中,如果字符串文字已经存在于池中,则相同   返回object而不是创建一个全新的对象。字符串池   只有当你创建String作为文字时,才会执行检查   使用new()运算符创建String,新的String对象将是   即使具有相同内容的String在池中可用,也会创建。

答案 3 :(得分:0)

如果您熟悉较旧的块结构语言,则Object实例在概念上是一个结构加上指向该Object的实例的类的指针。 Class提供方法,静态字段以及在其所有实例之间共享的任何其他内容(直接或通过指向相关资源的指针)。 Object携带非静态字段。