何时使用抽象类作为类型

2023-12-06

因此,在尝试理解抽象类时,我仍然对一件事感到困惑。你什么时候想要声明其抽象类的对象类型。例如

public abstract class GameObject
{
 public abstract void draw();
 public static void main(String[] args)
 {
 GameObject player = new Player();
 Menu menu = new Menu();
 }

}
public class Player extends GameObject
{
 override 
 public void draw()
 {
 // Something
 }

}
public class Menu extends GameObject
{
 override 
 public void draw()
 {
 // Something
 }
}

通常,我只会实例化玩家类型的玩家对象。但是,我见过抽象类用作新对象的变量类型。你什么时候会选择这样做?谢谢!


每次需要变量成为抽象类的实例时,您都会这样做,但并不真正关心具体类型是什么(并且不希望代码的其余部分假设使用了特定的子类) 。例如:

GameObject[] gameObjects = new GameObject[] {new Menu(), new Player()};
drawAll(gameObjects);

...

private void drawAll(GameObject[] gameObjects) {
    for (GameObject gameObject : gameObjects) {
        gameObject.draw();
    }
}

抽象类型通常用作返回类型(因为您不希望调用者知道返回的具体类型:它可能稍后更改,或者可能根据配置的参数而变化)。

它也经常用作方法参数类型,以便该方法可以接受抽象类型的任何子类的参数并多态地使用它。

当然,作为数组/集合类型,能够将多个子类的实例存储在唯一的集合中。

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

何时使用抽象类作为类型 的相关文章

  • 从文件中读取文本并将每行中的每个单词存储到单独的变量中

    我有一个包含以下内容的 txt 文件 1 1111 47 2 2222 92 3 3333 81 我想逐行读取并将每个单词存储到不同的变量中 例如 当我读取第一行 1 1111 47 时 我想将第一个单词 1 存储到var 1 1111 进
  • Mockito 匹配器和基元数组

    有了 Mockito 我想verify 方法调用byte 在它的参数列表中 但我没有找到如何写这个 myMethod byte 我只想要类似的东西anyByteArray 如何使用 Mockito 做到这一点 我会尝试any byte cl
  • 为什么 Java 中需要 String[] args?

    我知道 String args 是作为参数传递到 main 的字符串数组 java Print Hello World class Print public static void main String args System out p
  • 用Java截取网页的屏幕截图[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有一个免费的工具可以读取给定的网页并截取它的屏幕截图 我使用 VirtualFramebuffer 和 Firefox Binary
  • Vaadin框架播放视频

    我可以使用 Vaadin Framewotk 播放视频吗 主要思想是从本地驱动器加载 flv 或 avi 格式的视频文件 并使用 vaadin 框架在网络上播放 谢谢 Sampler中有一个示例 http demo vaadin com s
  • 如何使用 Selenium WebDriver 和 Java 滚动特定的 DIV?

    WebDriver 无法识别某些 WebElement WebDriver 无法找到浏览器可见区域中不可见的元素 In order to make the WebElement viewable by WebDriver We need t
  • 原型组件的 Spring 事件处理

    假设我有两个组件 X 和 Y 其中 X 是单例 而 Y 不是 当我发布XUpdateEvent时 没有问题 我可以捕获该事件 但是 对于 YUpdateEvent 我无法捕获事件 Spring 为每个触发的事件创建新实例 而不是使用已经创建
  • Java RCP/SWT - Eclipse RCP 中的“Android Toast like”对话框

    有谁知道是否存在某些弹出窗口的实现 例如 Android TOAST 通知是以下内容的一部分迈林公共区 https projects eclipse org projects mylyn commons 要集成它们 请添加Mylyn Com
  • 如何在 TestNG 报告中包含 Log4j2 消息

    我希望在所有测试用例的 TestNG 报告中提供 Log4j2 日志记录信息 TestNG 使用一个名为 Reporter java 的特殊记录器类来跟踪日志输出并将其保存在其结果 XML 中 在 log4j 中 可以简单地创建一个路由到
  • Java 线程 JavaDoc

    我编写了一个只能在特定线程上调用的方法 是否应该将标准注释或注释添加到方法的 javadoc 中来表示这一点 不知道有任何这样的标准注释 Java 并发实践 http www javaconcurrencyinpractice com 在第
  • Java Swing 组件的命名约定(前缀)

    在 Java 中使用 Swing 进行编程时 我想到的一个问题是 它是 Swing 组件的推荐还是 官方 最常用的命名约定 前缀 例如 尽管其他人可能更喜欢其他命名约定 但这就是我当前正在使用的 JTextField 的 txt JButt
  • Eclipse:对 Java 1.7 的失望(未绑定库)

    我在全新安装的 Eclipse 中处理全新项目时遇到问题 重现步骤 下载此版本的 Eclipse http www eclipse org downloads packages eclipse ide java developers hel
  • Eclipse 错误:“设置构建路径”遇到错误

    我正在使用一个名为 jtwitter 的 API 它有一个 jar 文件 jtwitter jar 我一直在使用它并使用 git 维护它 我把代码托管在github上 有些天 我没有碰过它的代码 今天 当我克隆我的 git repo 时 实
  • 在 Java 类型参数中, 仅意味着严格的子类型?或者 E 也足够了吗?

    在 Java 类型参数中 是否仅意味着严格的子类型 或者 E 也足够了吗 这并不严格 E就足够了
  • Guice 字段注入不起作用(返回 null)

    我在使用 Guice 时遇到空值问题 接下来我将向您展示一个类似场景的示例 我知道字段注入是一种不好的做法 但我希望它在演示中像这样工作 我有一个名为B 这是我要注入的 class B Inject public B public void
  • 通过命令行增加Java中的MaxPermSize内存

    您能否解释一下如何增加此 PermSpace 大小 我正在使用 Gate 应用程序并加载大量数据和大量插件 不幸的是每次运行后都会出现有关内存不足 maxPermSpace 的错误 我到处搜索 但我找不到如何通过命令行增加这个大小 或者可能
  • 术语“可序列化”是什么意思? [复制]

    这个问题在这里已经有答案了 不太确定我读过的定义可序列化实际上做了什么 import java io Serializable import java text StringCharacterIterator import java uti
  • C中使用JNI从对象获取对象

    public class Student private People people private Result result private int amount 这是 Java 中类的示例 在C中 我试图获取 学生 中的 人 但失败了
  • 来自 Janino 和 Commons-Compiler 的 Spark java.lang.NoSuchMethodError

    我正在构建一个使用 Spark 进行基于随机森林分类的 应用程序 当尝试运行该程序时 我从该行收到异常 StringIndexerModel labelIndexer new StringIndexer setInputCol label
  • 所有语言中特殊字符的 Java 正则表达式

    在我的用户输入字段中 我想允许某些特殊字符 字母和数字的组合 我应该确保正则表达式模式在输入时允许此设置任何语言 基本上我构建的这个正则表达式也应该支持 unicode 表示 如何使用 Java 中的 Pattern 类来实现这一点 这里给

随机推荐

  • 升级到 Worklight 6.2

    我在升级到 Worklight 6 2 时遇到问题 请找出下面的错误 ERROR transport error 202 bind failed Address already in use ERROR JDWP Transport dt
  • PHP:将字符串拆分为数组,就像不带分隔符的爆炸一样

    我有一个字符串 例如 0123456789 我需要分开each字符放入数组中 我 为了它 尝试了 explode 123545789 但它给了我明显的信息 警告 爆炸中未定义分隔符 我怎么会遇到这个 我看不到任何方法 尤其是一个函数 arr
  • 在 C# 中生成随机小数

    如何获得随机的 System Decimal System Random不直接支持 编辑 删除旧版本 这与 Daniel 的版本类似 但会给出完整的范围 它还引入了一种新的扩展方法来获取随机的 任何整数 值 我认为这很方便 注意这里小数的分
  • 用于 C++ 的基于行的线程安全 std::cerr

    创建自己的最简单方法是什么std cerr这样它是逐行线程安全的 我最好寻找代码来做到这一点 我需要的是这样a line of output 终止于std endl 由一个线程生成as a line of output当我实际在控制台上看到
  • python3导入语句的变化

    我不明白以下内容pep 0404 在 Python 3 中 包内的隐式相对导入不再 可用 只有绝对导入和显式相对导入 支持的 此外 星号导入 例如 from x import 仅 允许在模块级代码中使用 什么是相对进口 python2中还有
  • C/C++,你可以将文件#include 到字符串中吗? [复制]

    这个问题在这里已经有答案了 我有一个 C 源文件和一个 Python 源文件 我希望 C 源文件能够将 Python 源文件的内容用作大字符串文字 我可以做这样的事情 char python code include script py 但
  • Nestjs:猫鼬中子文档数组的正确模式(没有默认_id或重新定义ObjectId)

    我正在使用 Nest js 并尝试使用包含子文档字段数组的装饰器创建一个架构 我在导入 导出架构并将其转换为模型方面没有任何麻烦 直到 我在我的中收到以下错误service file 经过几个小时的谷歌搜索后 我发现真正的原因是array子
  • 为什么同一文件中的全局符号需要重新定位?

    我有一个用于测试的 C 程序 a c int a 0 static int fa local a 78 int b int c int fa global a 7777 fa local int test a 6666 fa global
  • python程序在sublime text 3中执行失败,但在bash中执行成功[重复]

    这个问题在这里已经有答案了 encoding utf 8 from future import absolute import division print function unicode literals text 我们的世界充满了未知
  • Select MAX(field)+1 FROM ... 并发问题

    您好 我担心合作伙伴应用程序的并发性 因为最近几天它在 CRUDS 操作方面遇到了麻烦 尤其是在插入方面 所以我运行 SQL Profiler 并注意到他的插入语句不使用事务 而且他正在使用 INSERT INTO TABLEA VALUE
  • 节点“req 未定义”

    当我尝试启动以下脚本时 var http require http http createServer function request response response writeHead 200 Content Type text p
  • Groovy 调用运算符在类字段上使用时会抛出 MissingMethodException

    我正在尝试使用呼叫操作员 重载 但它不适用于类字段 怎么了 class Foo void call int x println x x class MyCallable Foo foo new Foo Foo foo new Foo foo
  • 迭代器上的限制是否有效

    我在实际生产代码中发现了以下内容 我怀疑它实际上有未定义的行为 但是 我在 cppreference 上找不到相关信息 您能否确认这是 UB 或有效代码以及为什么这是 UB 有效 最好带有标准引用 include
  • 在 PHP 或 MySQL 中查找两个日期之间的差异

    此查询不返回 1 月份的记录 但返回 2 月份的记录 SELECT EventAsstCharged CustomerName EventID EventName EventExpectedCharges EventActuallyChar
  • 通过 PayPal(一次)支付多件商品

    我有一个产品列表 我想在其中添加 立即付款 按钮 以便我可以允许我的客户通过 Paypal 付款 我已经浏览了文档 但找不到如何执行此操作 我可以添加多个项目 但这并不方便 因为我已经有了要处理的项目列表 我还需要结账流程来逐项列出订单 因
  • 如何处理上溢和下溢?

    我是 Matlab 新手 试图弄清楚当答案实际上在范围内时如何处理溢出和下溢算术 例如 x 2e 160 x x x which returns inf an overflow x sqrt x which is in the range
  • 来自 javascript 对象的 js-ctypes

    我正在开发一个 Firefox 扩展 它接收二进制图像数组缓冲区 of uint8 t 在我的扩展中 我加载了一个 dll 文件 该文件具有我需要在收到的图像上使用的函数 该函数需要一个ctype uint8 t ptr参数并返回一个cty
  • Entity Framework 4 SaveChanges 内存不足

    我有一个包含超过 50 万条记录的表 每条记录包含大约 60 个字段 但我们只对其中三个进行更改 我们根据计算和查找对每个实体进行小修改 显然我无法依次更新每个实体然后SaveChanges因为那会花费太长时间 所以在整个过程结束时我调用S
  • 如何覆盖Titan数据库中的顶点ID?

    我正在使用生成对象的框架Node并且他们已经分配了一个 id 现在它们需要转换为具有框架中控制的相同ID的Titan顶点 通过访问node id public long addNode Node node TitanVertex verte
  • 何时使用抽象类作为类型

    因此 在尝试理解抽象类时 我仍然对一件事感到困惑 你什么时候想要声明其抽象类的对象类型 例如 public abstract class GameObject public abstract void draw public static