java修饰符定义(Java中的抽象修饰符)

在我们继续之前,让我们了解一个抽象词的字典含义。“存在于思想或观念中,但没有物理或具体的存在。”

抽象修饰符仅适用于方法,但不适用于变量。

抽象方法:当方法的实现因子类而异时,我们在父类中将该方法声明为抽象。通过在父类中声明一个抽象方法,我们可以为子类提供指导,以便他们应该强制实现哪些方法。抽象方法声明应该以分号结尾,否则编译器会大喊大叫给你一个编译错误抽象方法不能有主体。

java修饰符定义(Java中的抽象修饰符)(1)

抽象方法

抽象方法从不谈论实现,就像任何修饰符谈论实现一样,那么修饰符将成为抽象的敌人,并且这些修饰符组合对于抽象方法总是非法的。

示例 1:一个方法不能同时是最终的和抽象的。final修饰符限制在子类中重新定义的方法,但抽象方法总是在子类中实现。

示例 2:使用静态方法无法覆盖(它使静态方法隐藏)。如果在类抽象中声明方法,则必须在子类中重写此方法。静态成员是编译时元素,但覆盖发生在运行时(运行时多态性)。因此,抽象方法不能是静态的。

下图显示了带有抽象修饰符的非法组合。

java修饰符定义(Java中的抽象修饰符)(2)

与 abstract 的非法组合

抽象方法:对于任何 java 类,如果我们不允许创建对象,那么我们必须使用用于抽象类实例化的抽象修饰符声明此类类型的类是不可能的。

java修饰符定义(Java中的抽象修饰符)(3)

抽象类和抽象方法有什么区别?

  • 如果一个类包含至少一个抽象方法,则必须使用抽象修饰符声明相应的类。因为类实现不完整(由于其中的抽象方法),因此无法为类创建对象。
  • 即使该类不包含任何抽象方法,我们仍然可以将该类声明为抽象。HttpServlet 类是抽象的,但它不包含任何抽象方法。

抽象类的一些关键要点:

  1. 它不能被实例化。
  2. 它可以有抽象方法和非抽象方法。
  3. 它可以有构造函数、静态方法和最终方法。
  4. 子类一次只能扩展一个抽象类(使用接口来克服这个问题)
  5. 如果一个类扩展了一个抽象类,那么我们必须为父类的每个抽象方法提供一个实现。如果我们不这样做,我们需要将子类声明为抽象并将实现负担传递给它的子类。

注意:与抽象类不同,接口不能有构造函数。为什么?

我将在 Interface 文章中解释这个细节,现在假设 Interface 是类的完整抽象。

但是当我们不能实例化一个对象时,为什么抽象类有一个构造函数呢?

  • 抽象类具有constructors并且在实例化具体子类时始终调用这些构造函数。我们知道,当我们要实例化一个类时,我们总是使用该类的构造函数。现在每个构造函数都通过隐式调用来调用其超类的构造函数super()
  • 我们知道构造函数也用于初始化类的字段。我们还知道抽象类可能包含字段,有时需要使用构造函数以某种方式初始化它们。

如果 final 和 abstract 是非法组合,为什么抽象类可以包含 final 方法?

注意:最终类不能包含抽象方法,而抽象类可以包含最终方法。

当我们尝试将两个修饰符都赋予类或方法时,就会出现“修饰符的非法组合:abstract 和 final” 。在抽象类内部,我们可以有一个 final 方法。抽象类或任何类中的最终方法是完全可以的,直到最终方法不是抽象的。

在另一种情况下,如果该类包含一个导致最终类“非法组合修饰符”的抽象方法,我们就必须使该类抽象。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页