您的位置 首页 java

Java中的抽象修饰符

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

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

抽象方法

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

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

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

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

与 Abstract 的非法组合

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

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

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

抽象类的一些关键要点:

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

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

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

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

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

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

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

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

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

文章来源:智云一二三科技

文章标题:Java中的抽象修饰符

文章地址:https://www.zhihuclub.com/177111.shtml

关于作者: 智云科技

热门文章

网站地图