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);