逻辑结构/参考变量和内存中的对象的细节?

假设我们有一堂课:

class Class1
{
   int i = 1;
}

我们有一个变量:

Class1 ob1 = new Class1();
  • 引用本身存储在变量ob1存储它引用Class1对象的信息?
  • Class1存储的堆的部分是否存储Class1类型的信息?
  • 在逻辑上如何看起来像这样的信息? 它是一个像application1.Class1的字符串或对某些引用类型池的引用?
  • 如果您能推荐这些信息的来源,我将非常感谢您提供该信息,我无法在参考书中找到它。


    引用本身存储在变量ob1中是否存储它引用Class1对象的信息?

    NO 。 引用变量ob1只存储它指向的对象的引用。 并且有关该对象的信息已为应用程序(或JVM)所知。

    Class1存储的堆的部分是否存储Class1类型的信息?

    NO 。 有关正在加载的类的信息存储在方法区域中。 如此链接中所述
    对于它加载的每种类型,Java虚拟机必须在方法区域中存储以下类型的信息:

  • 该类型的完全限定名称
  • 该类型的直接超类的完全限定名(除非该类型是一个接口或类java.lang.Object,它们都没有超类)
  • 类型是类还是接口
  • 类型的修饰符(“公共”,“抽象”,“最终”的一些子集)
  • 任何直接超接口的完全限定名称的有序列表
  • 在逻辑上如何看起来像这样的信息? 它是一个像application1.Class1的字符串或对某些引用类型池的引用?

    在Java类文件和Java虚拟机中,类型名称始终以完全限定名称存储。 例如,包java.lang中的Object类的完全限定名称表示为java / lang / Object。 在方法领域中,完全限定名可以用设计者选择的任何形式和数据结构表示。


    每个java对象引用在运行时都知道它的类; 这个所谓的“运行时类型信息”用于这样的代码中:

    if (obj instanceof class1) {
      // true!
    }
    

    你也可以通过obj.getClass()来访问对象的类。 这将返回类Class<class1>的对象class1.class 。 请参阅Object.getClass方法。

    (请注意,如果您的类被参数化为class1<T> ,则由于“擦除”, T的类型将不会在运行时存储。)

    我不知道班级信息是与指针一起存储还是与数据一起存储; 它可能在jvm中是特定于实现的; 但从实际角度来看,这并不重要。 (所以答案1或2,或者两者都是“是”)。

    对于3的答案是,就Java程序员而言,运行时类型信息被封装在Class的对象中。 在封面之下,JVM可以以这种或那种方式实现这一点。


    回答你的问题:

  • 不,它没有 。 引用只是一个引用,即堆中的某个地址,其中存储了相应的对象。 没有必要在引用本身中存储关于引用类型的重复信息,因为实际上包含引用地址的实变量可以是不同的类类型。

  • 非常奇怪的问题。 当然, 是的,它的确如此 。 而且,这个“堆的一部分”是一个包含这个特定类描述的对象。 任何Class对象都包含该类所描述的全名。

  • 如果你的意思是它的结构,它没有被定义为逻辑上的外观:

  • 2.7对象的表示:

    Java虚拟机不会为对象指定任何特定的内部结构。

    但是如果我们正在谈论有关类类型的信息 - 是的,它只是一个String对象,因为Class对象(它所表示的)的“类型”只是对应类的名称。

    链接地址: http://www.djcxy.com/p/14493.html

    上一篇: logical structure/details of a reference variable and object in the memory?

    下一篇: Window.print Issues