Java多态性中对象的字段访问和内存分配

Java多态性中对象的字段访问和内存分配,java,memory,polymorphism,allocation,Java,Memory,Polymorphism,Allocation,我有以下示例代码解释示例多态性概念-重写 class Super { public int number = 1; public char superText='a'; public String getColor() { return "red"; } } class Sub extends Super { public int number

我有以下示例代码解释示例多态性概念-重写

class Super { public int number = 1; public char superText='a'; public String getColor() { return "red"; } } class Sub extends Super { public int number = 2; public char subText='b'; public String getColor() { return "blue"; } } public class Sample2 { public static void main(String[] args) { Super supersub = new Sub(); System.out.println( supersub.getColor() + supersub.number + supersub.superText ); } } 超级班 { 公共整数=1; 公共字符superText='a'; 公共字符串getColor() { 返回“红色”; } } 类Sub扩展了Super { 公共整数=2; 公共字符潜文本='b'; 公共字符串getColor() { 返回“蓝色”; } } 公共类样本2 { 公共静态void main(字符串[]args) { Super supersub=新的Sub(); System.out.println(supersub.getColor()+supersub.number+supersub.superText); } } 输出为蓝色1

问题1:

派生类getColor()中的方法被重写,并显示超类的字段

有人能解释为什么派生类中的数字字段不被调用吗?i、 例如,输出为蓝色2


问题2:*关于内存分配*

对于下面的对象实例化, Sub subobj = new Sub(); Sub subobj=新的Sub(); 字段“number”的内存在堆中分配,并指定number变量的地址 被指定给对象参照子对象

考虑下面的情况, Super supersub = new Sub(); Super supersub=新的Sub()

(a)这里创建了派生类“Sub”中变量“number和subText”的内存,变量的地址放在supersub对象中

当我访问supersub.subText时,我得到一个错误,子文本无法解析

因此,请解释上述点(a),即派生类变量的内存分配

谢谢,
Cyborgz

很简单,因为您无法覆盖字段。方法是唯一可以重写的东西。

很简单,因为您不能重写字段。方法是唯一可以重写的内容。

Java中的字段不会被调用,也不会受到动态调度/运行时多态性的影响。在您的例子中,实际上有两个单独的字段恰好具有相同的名称:
Super#number
Sub#number
Sub
类继承了
Super#number
,因此它同时具有,访问哪一个取决于访问它的变量的静态编译时类型。这解释了为什么
subobj
访问其中一个,而
superobj
访问另一个。

Java中的字段不会被调用,也不会受到动态调度/运行时多态性的影响。在您的例子中,实际上有两个单独的字段恰好具有相同的名称:
Super#number
Sub#number
Sub
类继承了
Super#number
,因此它同时具有,访问哪一个取决于访问它的变量的静态编译时类型。这就解释了为什么
subobj
访问其中一个,而
superobj
访问另一个

有人能解释为什么派生类中的数字字段不被调用吗

这是因为
字段
不是多态的。在访问特定引用上的字段时,您可以访问引用类型中定义的字段,并且决策不基于实际的对象类型

字段“number”的内存在堆中分配,并且 编号变量已指定给对象引用subobj

No
number
是基元类型
int
,并且基元不在堆上分配。它们存储在文本池中。原语和包装类是两种不同的东西。如果您使用的是
Integer
而不是
int
,那么如果值不在
Java
文本池缓存的范围内,您将在
上创建对象

supersub.subText我得到一个错误,子文本无法解析

这可以从你对第一个疑问的解释中推断出来。因为字段访问是基于引用类型而不是实际对象类型来解析的。因此,显然您无法访问
Super
引用中的
子文本,因为该字段不是该类的一部分,而是子类的一部分

有人能解释为什么派生类中的数字字段不被调用吗

这是因为
字段
不是多态的。在访问特定引用上的字段时,您可以访问引用类型中定义的字段,并且决策不基于实际的对象类型

字段“number”的内存在堆中分配,并且 编号变量已指定给对象引用subobj

No
number
是基元类型
int
,并且基元不在堆上分配。它们存储在文本池中。原语和包装类是两种不同的东西。如果您使用的是
Integer
而不是
int
,那么如果值不在
Java
文本池缓存的范围内,您将在
上创建对象

supersub.subText我得到一个错误,子文本无法解析


这可以从你对第一个疑问的解释中推断出来。因为字段访问是基于引用类型而不是实际对象类型来解析的。因此,显然您不能在
Super
引用上访问
子文本,因为该字段不是该类的一部分,而是子类的一部分。

在Java中不重写类变量:而是隐藏它们。重写是指实例方法。

在Java中不重写类变量:而是隐藏它们。重写的是实例方法

问题1:

显示派生类的方法,并显示超类的字段 显示

有人能解释为什么派生类中的数字字段不被调用吗? i、 例如,输出为蓝色2