【问题标题】:why it is required to add abstract keyword in front of abstract methods为什么需要在抽象方法前添加抽象关键字
【发布时间】:2015-07-10 03:48:52
【问题描述】:

这可能是一个无用的问题,只是出于我的好奇。

为什么我们不需要在abstract classabstract method前面加上关键字abstract interface情况下的关键字?

可能的答案是:
由于抽象类可能是具体方法和抽象方法的混合体, “abstract”关键字用于标识哪些方法是抽象的。
但是
当我们不给任何方法任何主体,并且在声明的末尾使用;,那么如果它被自动视为抽象方法会出现什么问题?

【问题讨论】:

  • 接口中声明的方法默认为public abstract,这就是原因。它们实际上是抽象的。

标签: java oop abstract-class abstract


【解决方案1】:

为什么非要在抽象类的抽象方法前面加上关键字abstract,而在接口的情况下不需要加关键字。

在接口中,所有方法定义都隐含abstract。不过,您可以提供关键字,但不会有任何区别。

但是,在abstract 类中,当您想将方法表示为abstract 时,您需要键入abstract 关键字。这实际上使代码更具可读性和易于理解。

【讨论】:

  • 可读性是一个非常有效的观点,但直到不解释为什么它是必需的而不是可选的。
  • 我们可以结束this is how the language is designed 吗?
  • @Saif,因为如果它是可选的,每个人都会跳过它。 :)
  • 也喜欢这一点。并感谢您花时间在一个无用的问题上:)
【解决方案2】:

并非抽象类中的所有方法都必须是抽象的。事实上,你可以有一个没有任何抽象方法的抽象类。

另一方面,interface 中定义的所有方法都隐含为public abstract,因此您可以删除限定符。

【讨论】:

  • 我明白为什么我可以在接口的情况下删除限定符。我的问题是为什么在抽象类的情况下需要它。因为抽象方法可以通过no body和末尾的;来标识。
  • Kocko 提到了可读性。当您快速阅读代码时,特别是在大型消息签名的末尾,很容易错过单个字符 ; 的简单包含或缺失。
  • @vikingsteve OP 的观点是:抽象方法没有方法体……怎么会有人误读呢?行尾的; 并不重要。所以我同意,abstract 似乎是多余的。
  • 好吧,想象一下您在函数的末尾不小心在方法主体之前添加了一个额外的分号。然后编译器会将您的方法解释为抽象的,然后是instance initializer。例如void myMethod; { /* code */ } - 这是合法的,而且令人困惑。
  • @vikingsteve void myMethod; 会合法吗?你怎么解释?我没明白。为什么编译器会认为void myMethod; 是正确的,因为它不是变量而不是方法(末尾没有())?
【解决方案3】:

您明确提到它,以便任何扩展该类的人都知道他应该强制实现这些方法,并且如果他不需要,则不必为没有抽象关键字的方法而烦恼。

【讨论】:

  • 所以你说的是@kocko提到的readability
  • 是的,想想它是否与理解和可读性有关。
【解决方案4】:

两个答案

  1. 这就是语言的设计方式
  2. 抽象方法旨在在子类中被覆盖,这意味着某些 VM 在看到抽象关键字时可以进行各种优化

顺便说一句。在 java 4 中,接口中实际上有抽象关键字。现在它被认为已经过时了

【讨论】:

    猜你喜欢
    • 2020-04-13
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多