Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当我们使用多态性时,内存是如何工作的?_Java_Oop_Inheritance_Memory_Polymorphism - Fatal编程技术网

Java 当我们使用多态性时,内存是如何工作的?

Java 当我们使用多态性时,内存是如何工作的?,java,oop,inheritance,memory,polymorphism,Java,Oop,Inheritance,Memory,Polymorphism,有一个类似的博客,但我从不同的角度感兴趣 以这两类为例 public class Parent { int x; public Parent(int x) { this.x = x; } } 主要方法 Parent obj = new Child(1, 2); Child childObj = (Child) obj; System.out.println(childObj.x + " &quo

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

以这两类为例

public class Parent {
    int x;

    public Parent(int x) {
        this.x = x;
    }
}
主要方法

        Parent obj = new Child(1, 2);
        Child childObj = (Child) obj;
        System.out.println(childObj.x + " " + childObj.y);
如果我们看这个,我们可以得到我们的
x
y
,即使我们从
Parent
开始,它根本不能存储
y
(正如您所看到的,它只有
x
字段)

当我们用
父对象
创建
子对象
时,额外变量
y
去了哪里(因为
父对象
只能存储变量
x

据我所知,堆栈中有一个
父级
,引用堆中的
子级
,它保存
x
y
以及调用
的类


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

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

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


当以后访问
parent.x
时,JVM读取引用并找到相应的对象,然后继续读取其
x
。为了简化此过程,大多数虚拟机将
x
字段保留在
Parent
的所有子类型的相同位置,因此虚拟机可以以相同的方式读取该字段,而不考虑对象的实际类型。

到目前为止,您的假设是正确的:只有堆栈上的引用具有类型Parent,这意味着它可以指向内存中实现该父类型的接口/约定的所有对象。它并不真正关心堆中子对象的其他字段-简而言之:被视为
父项
,但实际上是
子项
。谢谢。你能描述一下这些类在内存中的存储方式吗?这正是我在问题中描述的方式吗?我在网上搜索过这个,但没有找到任何有用的东西。
        Parent obj = new Child(1, 2);
        Child childObj = (Child) obj;
        System.out.println(childObj.x + " " + childObj.y);