java扩展类有两种类型

2024-01-11

在java中我有以下内容:

ClassA obj = new ClassB();

where ClassB extends ClassA。 是类型的对象ClassA or ClassB或两者?

如果我们有:

ClassB obj = new ClassB();

看来很清楚obj属于类型ClassB但所有ClassB are ClassA他们也是,不是吗?类型也是如此ClassA and ClassB?

如果我们添加以下内容:

ClassA [] objects = new ClassA[3];
ClassA obj = new ClassB();
objects[0] = obj;

看起来obj属于类型ClassA。所以我们可以将它添加到对象中,即使 obj 是一个new ClassB();

这是我的困惑,假设我们有一个被覆盖的方法ClassB from ClassA,我可以调用该方法并从中获得预期的输出ClassB覆盖方法。但是,如果我只有一个ClassB方法也未包含在ClassA我无法调用它,而且我似乎无法将其向上转换为ClassB。等一下,obj属于类型ClassA所以我们不能将它投射到ClassB因为所有ClassA的不是ClassB's.

所以 obj 是类型ClassA但我们将其设置为new ClassB()。那到底是什么?是吗ClassA or ClassB, 我很困惑。为什么我们可以访问到被覆盖的方法ClassB但不是非覆盖方法?这就是多态性的工作方式吗?


您的问题与这种情况相同:

你看到麦克斯,他是一只贵宾犬。你问:那么,这是怎么回事?麦克斯是贵宾犬、狗还是动物?还是三个同时进行?

答案或多或少是“这个问题掩盖了我们对生物分类方式的误解”。如果您必须从有限的选项中进行选择,那么“都是 3”比任何其他选项都更正确。但这意味着你可以创造一只贵宾犬,它也是一种动物,但not狗,这是错误的结论:任何贵宾犬都是一定也是一只狗.

这还取决于上下文。如果我问麦克斯是哪种生物,而这种情况只需要一个答案,你总是会得到“贵宾犬”。因为这是最有用的答案 - 知道 max 是贵宾犬就足以确定 max 因此必然也是一只狗,也是一种动物,因为根据定义,all贵宾犬是。你不可能拥有一个非狗但仍然是贵宾犬的生物.

Hence:

  • Animal a = new Poodle();是完全合法的。贵宾犬是动物,因此,如果您的工作需要任何动物,贵宾犬就可以。吉娃娃也是如此。

  • Java 通过引用完成所有事情。Animal a;就像宣告存在一个名为a这是包含adress一些动物居住的地方。地址甚至可以留空(null)。您可以保证,如果这张便利贴上有实际地址,它会确实导致某种动物(它不会导致,比如说,一棵橡树,语言和运行时保证这)。在这种情况下,事实上,它会导致一只贵宾犬。这很好用:毕竟所有贵宾犬都是动物。事实上,你的地址贴上写着“我可能会导致任何动物”并不会神奇地将麦克斯变成驴,甚至变成“通用动物” - 麦克斯仍然是贵宾犬:

Poodle max = new Poodle();
Animal a = max;
System.out.println(a.getClass()); // prints 'Poodle'.

请记住,点运算符是“按照便利贴上的地址并询问您在那里发现的问题”。.getClass()不“问问题”a,它向 a 所指的事物提出问题。目前,a 指向 max。如果你问麦克斯他是什么(我猜狗会说话),麦克斯会说“我是一只贵宾犬”。麦克斯不会说“我是动物”; max 不知道便利贴的存在,而且确实不知道:可能有 85 个便利贴都带有 max 的地址。可能没有留下任何东西(例如,一旦方法结束,局部变量就不再存在,就像便利贴被遗忘一样)。当向对象提出问题时,他们无法获得“上下文”(您曾经使用过什么路线)find那个对象),因此你知道他们的答案不可能依赖于它。

  • Poodle b = a; is not合法的。这意味着:“将便利贴 a 上的地址复制到便利贴 b 上,该地址受到限制,如果它指向任何东西,则它指向一只贵宾犬。Even ifa 当前指向一只贵宾犬,在编译时编译器不知道这一点,所以它不会让你这样做。并非没有演员阵容:Poodle b = (Poodle) a;很好,因为这是插话:“检查 a 实际上是否指向一只贵宾犬。如果确实如此,那么一切都很好。但如果不是,请停止您正在做的所有事情,并以“ClassCastException”异常退出此过程。

  • 对象总是有很多很多类型。例如,new ArrayList<String> is all这些事情:Serializable, RandomAccess, Iterable<String>, ArrayList<String>, AbstractList<String>, List<String>, AbstractCollection<String>, Collection<String>, Object,也许还有一些我错过了。它不仅仅是类型层次结构(ArrayList 扩展 AbstractList 扩展 AbstractCollection 扩展 Object),它还包括您沿途拾取的所有接口 - 以及所有their超级接口也是如此。这符合现实生活。 max 是一只狮子狗、一只狗、一种动物、一种肉食动物、一种有腿的东西、一种尿源、一种两耳的东西、雄性,等等。全部同时进行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java扩展类有两种类型 的相关文章

  • 具有默认值的 Java JAX-RS 自定义参数

    假设我有这个 这只是一个示例 GET Path value address Produces application json public Response getAddress QueryParam user User user 用户是
  • JavaFX 图像未在舞台中显示

    我尝试了很多次 尝试了很多方法 但都无法让自己的形象在舞台上如我所愿 我认为这可能与java寻找资源的路径有关 但我不确定 因为我刚刚开始使用视觉库 在本例中为JavaFX 这是我的目录结构 MyProject assets img myI
  • jvm 次要版本与编译器次要版本

    当运行使用具有相同主要版本但次要版本高于 JVM 的 JDK 编译的类时 JVM 会抛出异常吗 JDK 版本并不重要 类文件格式版本 http blogs oracle com darcy entry source target class
  • 防止 Spring Boot 注册 Spring Security 过滤器之一

    我想禁用安全链中的 Spring Security 过滤器之一 我已经看到了防止 Spring Boot 注册 servlet 过滤器 https stackoverflow com questions 28421966 prevent s
  • 使用 Java 在 WebDriver 中按 Ctrl+F5 刷新浏览器

    我已经使用 java 刷新了 WebDriver 中的浏览器 代码如下 driver navigate refresh 如何使用 Java 在 WebDriver 中按 Ctrl F5 来做到这一点 我认为您可以使用 WebDriver 和
  • 使用 ChannelExec 的命令未执行 - Jsch

    我正在使用 Jsch 在服务器中创建一个文件并执行一些命令 对于文件创建 它工作正常 但是对于命令执行 则不然 它保持状态 1 仍在处理它 并永远保持该状态 这种情况发生在 shell 执行或我尝试成为 root 时 请按照以下方法操作 p
  • 哪个 Swing 布局管理器可以获得我想要的布局?

    我正在尝试按照这个模型制作一个基本的登录菜单 我决定将整个菜单放入 JPanel 中 以便在连接成功后我可以切换到另一个面板 所以我决定使用 Borderlayout 将标题放在北区 将连接按钮放在南区 我将边框布局的中心本身设置为面板 我
  • 尝试使用 JRI 将 R 与我的 Java 应用程序集成,但出现错误。谁能解释一下原因和解决办法吗?

    我需要将 Java 与 R 集成来运行一些数学命令并使用 R 的功能进行绘图 以下部分代码给出了错误 public static void main String args HelloRWorld r new HelloRWorld r h
  • Java Microsoft Excel API [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • JTable 和 JScrollpane 大小的问题

    我有一个JScrollPane with a JTable在里面 在里面JTable我最初有 3 行 稍后添加行 默认JTable我的 3 行很难看 因为JScrollPane calls getPreferredScrollableVie
  • 容器中的 JVM 计算处理器错误?

    最近我又做了一些研究 偶然发现了这一点 在向 OpenJDK 团队抱怨之前 我想看看是否有其他人观察到这一点 或者不同意我的结论 因此 众所周知 JVM 长期以来忽略了应用于 cgroup 的内存限制 众所周知 现在从 Java 8 更新某
  • 线程“main”中的异常 java.lang.StackOverflowError

    我有一段代码 但我无法弄清楚为什么它在线程 main java lang StackOverflowError 中给出异常 这是问题 Given a positive integer n prints out the sum of the
  • Intellij 中的 Google OR-Tools:UnsatisfiedLinkError

    我正在建立一个应该使用 Google OR Tools 的 java 框架 下面的代码编译成功 但在运行时抛出异常 Exception in thread main java lang UnsatisfiedLinkError com go
  • 异步迭代器

    我有以下代码 while slowIterator hasNext performLengthTask slowIterator next 由于迭代器和任务都很慢 因此将它们放入单独的线程中是有意义的 这是对迭代器包装器的快速而肮脏的尝试
  • Java:java.util.ConcurrentModificationException

    我正在制作 2D 目前正在研究用子弹射击 子弹是一个单独的类 所有项目符号都存储在称为项目符号的数组列表中 当它超出屏幕一侧 Exception in thread main java util ConcurrentModification
  • 如何解决 PDFBox 没有 unicode 映射错误?

    我有一个现有的 PDF 文件 我想使用 python 脚本将其转换为 Excel 文件 目前正在使用PDFBox 但是存在多个类似以下错误 org apache pdfbox pdmodel font PDType0Font toUnico
  • 公共方法与公共 API

    在干净的代码书中 有一个观点是 公共 API 中的 Javadocs 同样 Effective java 一书也有这样的内容 项目 56 为所有公开的 API 元素编写文档注释 所以这就是我的问题 所有公共方法都被视为公共 API 吗 它们
  • 对于当前月份和日期但年份不同的日期,经过的月份计算未给出正确的结果

    我正在尝试计算自特定日期以来经过的月份 该函数工作正常 尽管如果我将今天的日期与过去的不同年份放在一起 它会给我一个月的差异 不到一个月 假设对于所有日期 该函数都运行良好 除了 如果今天是 2014 03 06 YYYY MM DD 并且
  • 摩尔斯电码 至 英语

    我现在的问题是让 摩尔斯电码转英语 正常工作 将英语转换为莫尔斯电码的第一部分工作正常 我知道以前已经有人问过这个问题 但我不知道我做错了什么 我知道我需要在某个地方进行拆分 但我只是不确定将其放在代码中的何处 现在 莫尔斯电码到英语的部分
  • 防止Java实例化的正确方法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi

随机推荐

  • 我应该如何折叠 Python 中的元素? [复制]

    这个问题在这里已经有答案了 例如 l a 1 b 2 a 2 collapsed l dict a 1 2 b 2 如何最好地从l to collapsed l 从某种意义上说 我想要某种方式来概括我正在崩溃的 领域 以及哪个领域 我认为这
  • eslint 禁用扩展覆盖

    如果你有一个覆盖 你想 降级 js解析器 你如何关闭extends来自父母 parserOptions很容易被覆盖 因为它是基于密钥的 extends因为空数组不执行任何操作 因为它尝试将空列表附加到原始数组 如果您将其设置为null 您会
  • Zend Framework notEmpty 验证器 setRequired

    我看过其他的问题 https stackoverflow com questions 3871460 zend form setrequiredtrue or addvalidatornotempty 谷歌搜索这个 我的问题是 当我提交带有
  • std::variant 在 MSVC 和 gcc 中的行为不同

    Update 这是一个 C 标准缺陷 已在 C 20 P0608R3 中修复 另外 VS 2019 16 10 修复了这个错误 std c 20 MSVC 19 28 拒绝以下代码 但 gcc 10 2 接受它并输出true false i
  • 如何以编程方式为 UINavigationController 子类化 UINavigationBar?

    我正在使用自定义的drawRect函数来绘制UINavigationBar在我的 iOS4 应用程序中 它不使用图像 仅使用 CoreGraphics 因为你不能在中实现drawRectUINavigationBariOS5 中的类别 Ap
  • JavaScript 唯一浏览器 ID

    有没有办法在javascript中为浏览器创建一个唯一的ID 我说的不是每次生成时都是随机的 ID 而是生成该 ID 的浏览器所特有的 ID 而且还考虑了运行该 ID 的计算机 Example Windows 7 Chrome 可能会生成
  • Ionic Zip 仅提取特定文件夹

    我有一个案例 我需要使用 C Ionic zip 库提取 Zip 文件 Zip 文件包含多个文件夹 我想提取特定文件夹并将其复制到特定目的地 例如名为 abc zip 的 Zip 文件和目录结构如下 父目录 gt 子目录1 gt 文件a 文
  • 从文档大纲(书签)中获取页码

    我正在使用 itext7 库来操作一些现有的 PDF 由于某种原因 我无法从大纲中获取页码 我想我应该以某种方式从Pdf目的地 http itextsupport com apidocs itext7 latest com itextpdf
  • 每天都会对 Java 8 Stream API 中的实体进行惰性排序吗?

    我有一个很大的 Java 8 Stream Stream
  • 字符串的哈希函数

    我正在用 C 语言研究哈希表 并且正在测试字符串的哈希函数 我尝试的第一个功能是添加 ascii 代码并使用模 100 但我的第一次数据测试结果很差 130 个单词有 40 次碰撞 最终输入数据将包含 8000 个单词 它是存储在文件中的字
  • 如何显示R中两个日期之间发生的事件

    我的问题看起来很简单 我希望如此 我有一个数据框 其中包含疾病诊断日期 指示患者服用哪种药物 或暴露和未暴露组 的二元变量 药物的开始和停止日期以及总体停止日期 ID Diag date Treatment End date Drug st
  • c3p0中的资源无法检出的原因是什么?

    因此 我正在研究 c3p0 API 来调试我们的一个生产问题 该问题导致在检查连接时出现堆栈溢出错误 我发现下面的评论BasicResourcePool班级的checkoutResource method This function rec
  • Vuetify 标准设置(babel/eslint)图像加载失败

    我正在开发一个 VueJS 项目 并尝试在轮播上加载图像 我正在使用标准设置并将图像放在资产文件夹中 我引用图像 URL
  • Storybook 需要导出默认的 Ant Design 组件才能应用样式

    我希望使用 Ant Design 设计一些 React 组件 并将它们记录在 Storybook 中 故事书和组件都编写正确且有效 模态故事 js import React from react import action from sto
  • python中具有相同名称的对象引用不同的id

    在下面的代码片段中 两个对象名为div在第 1 行和第 2 行创建 python如何区分两者div在同一作用域下创建的对象 When id 应用于两个对象 对于相似的命名对象会显示两个不同的地址 为什么会这样呢 def div a b re
  • webclient 方法对我的 Silverlight 应用程序不可用

    尝试用 C 进行基本的 Web 客户端数据拉取 这些方法在 Visualstudio 中不可用 并且代码无法编译 snip WebClient client new WebClient byte resp client DownloadDa
  • Pytorch:交叉熵损失中的权重

    我试图通过一个实际的例子来理解 CrossEntropyLoss 中的权重是如何工作的 所以我首先运行标准 PyTorch 代码 然后手动运行 但损失并不相同 from torch import nn import torch softma
  • Keras:网络不使用 fit_generator() 进行训练

    我在大型数据集上使用 Keras 使用 MagnaTagATune 数据集进行音乐自动标记 所以我尝试将 fit generator 函数与自定义数据生成器一起使用 但损失函数和指标的值在训练过程中不会改变 看起来我的网络根本没有训练 当我
  • 如何在 Ubuntu 上修复 Nokogiri?

    我在我的工作站上运行 Ubuntu 13 04 并使用 ruby 2 0 0 它是通过 RVM 安装的 aptitude 显示 libxml2 Package libxml2 State installed Automatically in
  • java扩展类有两种类型

    在java中我有以下内容 ClassA obj new ClassB where ClassB extends ClassA 是类型的对象ClassA or ClassB或两者 如果我们有 ClassB obj new ClassB 看来很