首先 :作为一般规则,如果类定义了子类可以访问的字段,则子类 不应 重新定义该字段。这真是个坏主意。首先,您所看到的是使 私有
字段正常工作。重新定义子类中的非私有字段要求受到伤害。(当然,如果Joe编写
Mammal而Mary编写
Zebra并且Joe在某个时候添加了一个字段,
Mammal而该字段恰好与Mary所使用的字段冲突
Zebra,则Mary对此无能为力。这是将所有字段设为私有的原因之一。)
但是,即使在隐藏的情况下,为什么子类对象也存储超类变量的值。
这里的关键是要记住,字段不是多态的,只是方法。因此,对象中 必须 有两个
name字段(一个来自from
Mammal,一个来自from
Zebra),因为使用A
Mammal型引用的代码需要查看
Mammal
name,而使用
ZebraA型引用的代码需要查看
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。因此,即使我们调用
makeNoiseusing
z,由于
Zebra没有
makeNoise,也
Mammal被称为,所以查找的引用
name具有类型
Mammal。
有什么用吗?
这是 至关重要的
正常工作,特别是在私人领域的情况下类。
Mammal代码不必担心子类会出现并重新定义其字段。您可能有一个10级深的类层次结构,每个类都定义了自己的
name,这很好,每个级别的代码都可以使用
name它定义的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)