为什么在子类对象中为超类变量存储或分配内存?

为什么在子类对象中为超类变量存储或分配内存?,第1张

为什么在子类对象中为超类变量存储或分配内存?

首先 :作为一般规则,如果类定义了子类可以访问的字段,则子类 不应 重新定义该字段。这真是个坏主意。首先,您所看到的是使 私有
字段正常工作。重新定义子类中的非私有字段要求受到伤害。(当然,如果Joe编写

Mammal
而Mary编写
Zebra
并且Joe在某个时候添加了一个字段,
Mammal
而该字段恰好与Mary所使用的字段冲突
Zebra
,则Mary对此无能为力。这是将所有字段设为私有的原因之一。)

但是,即使在隐藏的情况下,为什么子类对象也存储超类变量的值。

这里的关键是要记住,字段不是多态的,只是方法。因此,对象中 必须 有两个

name
字段(一个来自from
Mammal
,一个来自from
Zebra
),因为使用A
Mammal
型引用的代码需要查看
Mammal
name
,而使用
Zebra
A型引用的代码需要查看
Zebra

name


这就是为什么您的代码显示“ Furry bray”,然后显示“ stripes bray”的原因。你可以通过获得“毛茸茸的叫声”

m
,因为访问
name
m
(一个
Mammal
-typed变量)访问
Mammal
name
(不是多态),让您‘毛茸茸’。但是随后您
makeNoise
使用
m
并返回
"bray"
了方法,因为调用的方法是on
Zebra
(多态的)方法。然后,您再次使用
z
Zebra
类型参考)进行 *** 作,并看到“ stripes
bray”,因为
z
访问
Zebra
的是
name
,而不是
Mammal


您可能遇到的下一个问题是:如果我们将

makeNoise
两个类都更改为:

String makeNoise() {     return this.name;}

为什么要

ZooKeeper
编码

  Mammal m = new Zebra();  System.out.println(m.name + m.makeNoise());  Zebra z = new Zebra();  System.out.println(z.name + z.makeNoise());

从给我们“毛茸茸条纹”

m
stripes stripes
z

这是相同的原因,只是它的表示形式不同。从类型引用

m.name
访问,因此看到的(不是多态的)。调用
方法(多态),以及里面的,有型,即使我们把它称为从-typed
(等用途的)。在那里使用Zebra的事实以及在代码中键入内容的事实都是Java多态性的关键。
name``Mammal``Mammal``name``m.makeNoise

Zebra

makeNoise``Zebra``makeNoise``this``Zebra``Mammal``m``this.name``Zebra``name``makeNoise``this``Zebra``Zebra

让我们更进一步:如果

Zebra
根本没有定义
makeNoise
怎么办?

class Mammal {    String name = "furry ";    String makeNoise() {         return this.name;    }}class Zebra extends Mammal {    String name = "stripes ";}

现在,我们从中获得“毛茸茸”

m
和“条纹毛茸”
z
。其原因与上述相同:引用的类型确定使用哪个字段,并且在
Mammal
代码(
makeNoise
)中
this
具有类型
Mammal
。因此,即使我们调用
makeNoise
using
z
,由于
Zebra
没有
makeNoise
,也
Mammal
被称为,所以查找的引用
name
具有类型
Mammal

有什么用吗?

这是 至关重要的
正常工作,特别是在私人领域的情况下类。

Mammal
代码不必担心子类会出现并重新定义其字段。您可能有一个10级深的类层次结构,每个类都定义了自己的
name
,这很好,每个级别的代码都可以使用
name
它定义的。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5500210.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存