当前位置: 首页 > 面试题库 >

Java中基类和派生类实例之间的物理内存如何组织?

马天逸
2023-03-14
问题内容

C实例化一个子类时,已知其超类的构造函数(例如ABBextends A))将比实例化C。这是否意味着:

  1. 是否为A的实例,B的实例和C的实例分配了单独的内存?
  2. 对于subclass 实例,除了它自己的字段之外,是否还为CB和继承的字段分配了所有物理内存A
  3. 也是如此B的实例有从继承等领域的物理内存A,除了其自身的?

问题答案:

…已知其超类的构造函数(例如A和B(B扩展了A))将被实例化…

类被实例化。构造函数被 调用

(在编辑中建议应为“实例化对象”;但是,从技术上讲,这是不正确的。根据下面链接的同一JLS部分:“在评估类实例创建表达式时显式创建了新的类实例。导致实例化一个类。”即,您实例化一个类以获得一个对象。一个对象是一个实例。您不实例化对象。)

1)是否为A的实例,B的实例和C的实例分配了单独的内存?

不,有 一个 实例。即一块内存。

2)对于子类C的实例,除了它自己的字段之外,是否还为从B和A继承的字段分配了所有物理内存?

是的:“无论何时创建新的类实例,都会为其分配存储空间,并为该类类型中声明的所有实例变量和该类类型的每个超类中声明的所有实例变量(包括可能隐藏。”

3),那么B的实例除了它自己的实例之外,还具有从A继承的字段的物理内存吗?

从1开始,在这种情况下没有“ B的实例”。只有一个实例。

资料来源:12.5。创建新的类实例,JLS
7



 类似资料:
  • 假设我有一个没有数据的类: 和派生类 Empty类的对象的大小为1。派生类的空部分的大小通常为0。据我所知,编译器看到基Empty类没有数据,因此它可以优化Empty的大小,以防它“在”Derived中,但标准并不要求这样做。 所以问题是: 我能在编译时确定Derived类的Empty部分并没有占用内存吗。 我知道我可以像一样进行检查...但它太冗长了,并且有几个类,如派生。有没有更优雅的解决方案

  • 一个类的对象经常会是另一个类的对象。例如,矩形当然是四边形(正方形、平行四边形和梯形也是这样),因此可以说矩形类 Rectangle 是从四边形类 Quadrilateral 继承而来的。在本例中,类 Quadrilateral 叫做基类,类 Rectangle 称为派生类。矩形是四边形的一种特殊类型,但是要说四边形是矩形则是不正确的。图 9.1 示例了几个简单的继承例子。 基类 派生类 stud

  • 从已有的对象类型出发建立一种新的对象类型,使它部分或全部继承原对象的特点和功能,这是面向对象设计方法中的基本特性之一。继承不仅简化了程序设计方法,显著提高了软件的重用性,而且还使得软件更加容易维护。派生则是继承的直接产物,它通过继承已有的一个或多个类来产生一个新的类,通过派生可以创建一种类族。   继承 基本概念 在定义一个类A时,若它使用了一个已定义类B的部分或全部成员,则称类A继承了类B,并称

  • 我有一个应用程序,它由一个服务器组成,该服务器可以有多个两种类型的客户端,即用户客户端和设备客户端。为此,我有一个客户端基类的向量,我将在其中添加新客户端,因为它们连接到服务器。这是我所拥有的简化版本: 我有下面的UML表示: 我怀疑这张图是否代表了正确的意图。也许我对UML不是很有经验,这就足够了,但是我认为这个图没有清楚地描述服务器中的向量将包含用户和设备而不是客户端的事实。我不知道我是否需要

  • 问题内容: 我在派生类中创建了基类的实例,并尝试访问受保护的成员。 我可以直接访问派生类中的受保护成员,而无需实例化基类。 基类: 同一包中的派生类- 不同包中的派生类- 当派生类也位于同一包中,而派生类位于不同包中时,如何使用基类的实例访问派生类中基类的受保护成员呢? 如果我将受保护的成员标记为“静态”,则可以使用驻留在不同包中的派生类中的基类实例来访问基类的受保护成员。 问题答案: 没错,您是