首页 > 解决方案 > 为什么抽象类“被认为是不完整的”?

问题描述

我们知道一个抽象类是一个不完整的类(它的所有方法都是未实现的-#抽象方法),但抽象类也被称为“一个类被认为是不完整的。那么,CONSIDERED INCOMPLETE的正确含义(定义)是什么,一个类可以同时具有已实现和未实现的方法吗?或其他背景?

请告诉我,非常感谢!

标签: javaabstract-class

解决方案


规范说“抽象类是一个不完整的类,或者被认为是不完整的”,因为您可以拥有一个完全实现的抽象类(参见java.awt.event.MouseAdapter示例)。从技术上讲,它是完整的,但并不意味着以这种方式使用。

如今,人们可能会通过具有默认方法的接口来实现这些抽象适配器类(如果对于这种特殊情况,接口完全适合该目的……)。


适配器类背后的想法是提供特定接口的基本实现,该接口只允许当前用例感兴趣的那些方法。

实现的接口java.awt.event.MouseMotionListener和不太适合说明这种方法的好处,因为它们只有两个或一个方法。此外,该类还实现但不实现该接口的任何方法……</p> java.awt.event.MouseWheelListenerjava.awt.event.MouseAdapterMouseAdapterjava.awt.event.MouseListener

因此,让我们仔细看看java.awt.event.KeyAdapter实现接口的类java.awt.event.KeyListener。根据 的描述java.awt.event.KeyEvent, 的实现KeyListener将为您键入的每个字符接收三个事件(有关确切的详细信息,请参阅 的描述KeyEvent):

  1. KEY_PRESSED – 由处理keyPressed()
  2. KEY_TYPED – 由 处理keyTyped(),但前提是可以生成有效的 Unicode 字符
  3. 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 开始就存在,我认为……就像语言规范中的那些短语!


推荐阅读