栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/507836.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号