【问题标题】:How does the Memory work when we use Polymorphism?当我们使用多态时,内存是如何工作的?
【发布时间】:2021-07-22 18:50:12
【问题描述】:

有一个类似的博客,但我从不同的角度感兴趣。

考虑这两个类

public class Parent {
    int x;

    public Parent(int x) {
        this.x = x;
    }
}
public class Child extends Parent {
    int y;

    public Child(int x, int y) {
        super(x);
        this.y = y;
    }
}

在main方法中

        Parent obj = new Child(1, 2);
        Child childObj = (Child) obj;
        System.out.println(childObj.x + " " + childObj.y);

如果我们查看这个,我们可以找回我们的 xy,即使我们以 Parent 开始所有内容,它根本无法存储 y(它只有 x 字段,因为你可以见)。

当我们用Parent 创建一个Child 对象时,额外的变量y 去哪里(因为Parent 只能存储变量x)?

据我所知,堆栈中有一个Parent 引用堆中的Child,它保存了xy 和调用new 的类。

你能验证、否认、扩展我的想法吗?

【问题讨论】:

  • 到目前为止,您的假设是正确的:只有堆栈上的引用具有 Parent 类型,这意味着它可以指向内存中满足该 Parent 类型的接口/合同的所有对象。它并不真正关心堆中 Child 对象的其他字段。
  • Parent obj = new Child(1, 2); - 很快:被视为Parent,但实际上是Child

标签: java oop inheritance memory polymorphism


【解决方案1】:

Java 只为引用类型提供多态性。也就是说,Parent 类型的变量仅包含对位于别处的对象的引用。随着时间的推移,同一个引用可以引用不同的对象,这些对象可能具有不同的子类型和大小。

也就是说,当您执行Parent obj = new Child(1,2) 时,会创建一个Child 类型的对象,除了它自己声明的字段(y)之外,它还存储它从其超类型(x)继承的字段.

以后访问parent.x时,JVM会读取引用,找到对应的对象,然后继续读取它的x。为了简化此过程,大多数 VM 将 x 字段针对 Parent 的所有子类型保留在同一位置,因此 VM 可以以相同的方式读取该字段,而不管对象的实际类型如何。

【讨论】:

  • 谢谢。你能描述一下类在内存中的存储方式吗?这正是我在问题中描述的方式吗?我在网上搜索过这个,但没有找到任何有用的东西。
猜你喜欢
  • 2021-05-01
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
  • 2015-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多