gpt4 book ai didi

java - 传承的微妙之处

转载 作者:行者123 更新时间:2023-12-01 18:36:02 27 4
gpt4 key购买 nike

假设SListTailList父类(super class)

如果我执行以下代码,

SList s;
TailList t = new TailList();
s = t;

这与 SList s = new TailList(); 相同吗?

现在,t的静态类型还是TailList吗?

最佳答案

当您执行SList s = new TailList();时,会发生以下情况:

  1. new TailList() 被调用,创建一个新对象,并为其运行 TailList 的构造函数。当构造函数完成时,将返回一个匿名 TailList 引用。
  2. 匿名 TailList 引用被分配给 s

由于TailList继承自SList,因此您也可以通过它来引用它。对对象的引用不会更改对象本身。

想象一下,我在某处放置了一个垃圾桶,然后告诉不知道该物体是垃圾桶的人我在该位置放置了一个“容器”。垃圾桶确实是一个容器,但那个人只知道它是一个容器。这并没有改变它是一个垃圾桶的事实,但另一个人不能安全地假设他可以把垃圾放在那里,或者它被安排在任何时候被清空,因此他不知道调用他所指的“容器”上的此功能。

例如,假设我们有以下代码:

String s = "Hello there";
Object o = s;

o 现在引用一个 String 对象,但将其视为“对象”,它不知道它有长度,也不知道它包含字符,即使它知道.

另一方面,

s 虽然仍然引用 o 所引用的同一个对象,但知道该对象是一个 String ,并且可以在该对象上使用String功能。

如果我们愿意,我们可以通过称为“转换”的机制假设 o 是一个 String:

String s2 = (String)o;

我们现在将 o 引用的对象称为 String。所有这些对对象本身没有任何改变,这只是引用的改变。对于前面的类比,好像被告知神秘“容器”的人会假设该容器更具体地说是一个“垃圾桶”。我们也可能做出错误的假设,认为容器是包装容器

Integer i = (Integer)o; // throws ClassCastException

幸运的是,当我们在 Java 中假设错误时,我们会得到一个 ClassCastException,这与现实生活中的情况不同,在现实生活中,如果您将元素放入垃圾箱,同时将其称为包装容器,那么您的元素将被扔进垃圾箱。

也许,让您感到困惑的是第一个作业。好吧,SList s = new TailList();new TailList() 部分本身就是对 TailList 构造函数的静态调用,并且它将始终返回 TailList 引用。随后的赋值仍将引用由调用构造的 TailList 对象。

<小时/>

TL;博士

是的,这是同一件事。

关于java - 传承的微妙之处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21966501/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com