在抽象类中可以没有抽象方法
这是最近在Java开发人员工作面试的电话面试中向我的一位读者提出的有趣的Java核心问题之一。 即使他知道你
无法用Java将抽象类定型为final ,他对方法的措辞感到困惑。 答案很简单,不,在Java的最终类中不可能有抽象方法。 为什么? 因为一旦在Java类中声明抽象方法,该类就会自动变为抽象类,并且您无法像前面所讨论的那样在Java中将抽象类定为final ,因此,在Java的final类中不可能有抽象方法。
正如我说过的那样,许多Java程序员对这个问题的措辞感到困惑,就像我说的那样,即使是被问到这个问题的读者也很熟悉这个概念,他并没有意识到,只要您在其中声明了一个抽象方法就可以了。一个类,它将成为一个抽象类,并且不可能在Java中将抽象类定型为final。
这是一条丢失的信息,或者您称其为把它与更流行和常见的问题分开的把戏,是否可以在Java中声明一个抽象类和final类 ?
让我们看一个代码示例,以证明这一点,即您无法在最终类中声明抽象方法。 我们有一个名为Hello的公共最终类,该类中有一个名为print()的抽象方法。
Hello.java文件。
public final class Hello {public abstract print();}
在Eclipse IDE中键入该命令后,将立即收到以下错误消息:
Hello类型必须是抽象类才能定义抽象方法
这是另一个屏幕快照,显示您在Java的最终类中不能拥有抽象方法:
当您在记事本中写下此代码并从命令行窗口使用javac对其进行编译时 ,情况也是如此。 根据Java规范,一旦在类中声明了抽象方法,该方法便自动成为抽象类,并且由于无法在Java中将抽象类定型为最终类,因此编译器将引发错误。
Java中的顶级类或嵌套类均是如此。 即使在嵌套的最终类上声明抽象方法 ,您也会收到相同的错误。
关于此主题的另一个后续问题是,抽象类可以在Java中具有静态方法吗? 答案是肯定的,在Java中的抽象类中声明静态方法没有问题,因为您无需实例化类即可使用静态方法,只需使用类名即可调用它们。
我们可以修改代码示例,使其在Hello类中包括main()方法 ,该类是Java中的静态方法,如下所示:
public abstract class Hello {public abstract void print();public static void main(String args[]) {.. some code here}}
您可以看到没有编译时错误。 代码可以很好地编译,因此在Java 抽象类中声明静态方法是完全可以的。
这就是关于是否可以在最终类中使用抽象方法的全部内容? 正如我说的那样,这是不可能的,因为一旦您在类内部创建了抽象方法,按照Java规范,该类就会自动成为抽象类。 由于您无法使用Java将最终类抽象化,因此这变得非法,并且编译器会通过抛出错误来禁止这样做。 但是,是的,您可以在最终类和抽象类上都声明静态方法,这没有问题。 如果您正在学习Java,建议您进一步阅读
不耐烦的Core Java让您熟悉诸如抽象和最终类之类的核心概念。 它还涵盖了Java 8。
其他相关Java面试问题的练习
- 抽象类可以在Java中具有构造函数吗? ( 回答 )
- 您可以在Java中覆盖静态方法吗? ( 回答 )
- 您可以重载Java中的静态方法吗? ( 回答 )
- 您可以在Java中运行没有main()方法的程序吗? ( 回答 )
- 您可以覆盖Java中的私有方法吗? ( 回答 )
- 您可以重载和覆盖Java中的main()方法吗? ( 回答 )
- 您可以在Java中使数组易变吗? ( 回答 )
- 您可以在Java中声明一个静态类吗? ( 回答 )
进一步阅读
Java编程面试公开
Head First Java第二版
感谢您阅读本文,如果您喜欢这个核心Java面试问题和我的解释,请与您的朋友和同事分享。
翻译自: https://www.javacodegeeks.com/2017/07/possible-abstract-method-final-class.html
在抽象类中可以没有抽象方法