java - 为什么抽象类“被认为是不完整的”?
问题描述
我们知道一个抽象类是一个不完整的类(它的所有方法都是未实现的-#抽象方法),但抽象类也被称为“一个类被认为是不完整的”。那么,CONSIDERED INCOMPLETE的正确含义(定义)是什么,一个类可以同时具有已实现和未实现的方法吗?或其他背景?
请告诉我,非常感谢!
解决方案
规范说“抽象类是一个不完整的类,或者被认为是不完整的”,因为您可以拥有一个完全实现的抽象类(参见java.awt.event.MouseAdapter
示例)。从技术上讲,它是完整的,但并不意味着以这种方式使用。
如今,人们可能会通过具有默认方法的接口来实现这些抽象适配器类(如果对于这种特殊情况,接口完全适合该目的……)。
适配器类背后的想法是提供特定接口的基本实现,该接口只允许当前用例感兴趣的那些方法。
实现的接口java.awt.event.MouseMotionListener
和不太适合说明这种方法的好处,因为它们只有两个或一个方法。此外,该类还实现但不实现该接口的任何方法……</p>
java.awt.event.MouseWheelListener
java.awt.event.MouseAdapter
MouseAdapter
java.awt.event.MouseListener
因此,让我们仔细看看java.awt.event.KeyAdapter
实现接口的类java.awt.event.KeyListener
。根据 的描述java.awt.event.KeyEvent
, 的实现KeyListener
将为您键入的每个字符接收三个事件(有关确切的详细信息,请参阅 的描述KeyEvent
):
- KEY_PRESSED – 由处理
keyPressed()
- KEY_TYPED – 由 处理
keyTyped()
,但前提是可以生成有效的 Unicode 字符 - KEY_RELEASED – 由处理
keyReleased()
如果您的程序只想响应文本输入,它只对 KEY_TYPED 事件和实现感兴趣,KeyListener.keyPressed()
并且KeyListener.keyReleased()
可以保持为空(尽管它们必须实现!)。
如果您的程序是某种游戏的实现,您可能对按键更感兴趣;在这种情况下,KeyListener.typed()
可能会保持空白。
接下来,这些监听器接口经常被用作匿名类,像这样:
…
KeyListener listener = new KeyAdapter()
{
@Overwrite
void keyTyped( KeyEvent event )
{
// Do something with the event …
}
}
…
如果不使用适配器类,相同的代码将如下所示:
…
KeyListener listener = new KeyListener()
{
@Overwrite
void keyReleased( KeyEvent event ) { /* Does nothing */ }
@Overwrite
void keyPressed( KeyEvent event ) { /* Does nothing */ }
@Overwrite
void keyTyped( KeyEvent event )
{
// Do something with the event …
}
}
…
额外的行不利于可读性,不是真的。
如前所述,如果接口中的方法将提供一个空的默认实现,那么第二个版本 ( ) 看起来就像第一个。new
Interface()
{…}
这些适配器类只是不包含任何抽象方法的抽象类的一种可能用例。但是我承认它们中的大多数在接口中使用默认方法会更好地工作——因为这些默认方法当然已经进入了 Java!适配器类从 Java 1.1 开始就存在,我认为……就像语言规范中的那些短语!
推荐阅读
- python - 如何在 Python 上生成大量随机数而不会发生冲突?
- c# - 即使在命令中传递,Stryker 也找不到 .csproj 文件
- reactjs - 如何使用或不使用包装箭头函数调用两个函数
- javascript - Vue TypeError:尝试更新对象属性时无法读取未定义的属性“_wrapper”
- python - 连接到多个 ESP32 Ble 服务器会降低数据速率
- html - jQuery - 延迟函数
- c# - 如何在 botframework 中的语言生成文件中换行
- mongodb - mongoose .save() 方法不将数据插入到 MonogoDB
- python - 在 Python 中简单地循环多维数组
- vue.js - 如何在 Element UI 中验证混合输入