Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么抽象方法必须由第一个具体类来实现,而不是由下一个具体类来实现?_Java_Oop - Fatal编程技术网

Java 为什么抽象方法必须由第一个具体类来实现,而不是由下一个具体类来实现?

Java 为什么抽象方法必须由第一个具体类来实现,而不是由下一个具体类来实现?,java,oop,Java,Oop,我很好奇为什么抽象方法必须被第一个具体的实现类覆盖,而不是在层次结构的进一步变化中被覆盖 我不是说我想这样做,但我很好奇为什么它必须是头等舱 以这个例子为例 abstract class Upper { abstract void doSomething(); } class Middle extends Upper { void doSomething() { // I'm forced to be implemented here } } a

我很好奇为什么抽象方法必须被第一个具体的实现类覆盖,而不是在层次结构的进一步变化中被覆盖

我不是说我想这样做,但我很好奇为什么它必须是头等舱

以这个例子为例

abstract class Upper
{
    abstract void doSomething();
}

class Middle extends Upper
{
    void doSomething()
    {
       // I'm forced to be implemented here
    }
}

abstract class Lower extends Middle
{

}

class Bottom extends Lower
{
    void doSomething()
    {
        // I'm valid, but I'm too far down the hierarchy
    }
}

在您的示例中,如果中间没有doSomething声明,就没有代码可以运行。因此,类必须是抽象的。

根据定义,普通类必须实现所有抽象方法。如果您要声明中间抽象,那么就不必在中间实现这些方法


普通类可以实例化,而抽象类不能。想一想,如果您试图调用类中未实现的方法,会发生什么情况。

这实际上不是一个必须解决的问题。抽象类只是一个包含一个或多个方法的类,没有实现

这更像是说一个生物学上的男性必须有一个Y染色体。这不是法律;这只是定义的一部分

在您的示例中,如果您不想在
Middle
中实现
doSomething
,那么您真的不想
Middle
成为具体的。也就是说,它将有一个没有定义的方法。所以这是抽象的

当然,您可以将其实现为一个空函数,而不执行任何操作。我相信这与你所问的很接近


实际上,这只是一个术语问题。如果存在未实现的成员,则类型的抽象。就这么简单。

如果Middle是一个具体的类,那么没有定义抽象方法的实例化版本将不可调用(因为它没有定义)。这本身也会使中间类成为一个抽象类。

具体类是具体的。
这意味着它们应该能够被初始化和使用。
那么,如果不实现这些方法,如何正确地使用它们呢?它将是不完整的,因此不是具体的


您可以使另一个抽象类继承一个抽象类。

因为在非抽象类中不能有抽象方法。如果不需要任何方法,则不需要扩展该类

相反,只需让
类下限扩展上限


如果您仍然希望让
Lower
继承抽象方法并从
Middle
继承,只需将
Middle
声明为抽象。

只需将
Middle
创建为抽象类即可

如果您想将
Middle
保留为一个具体的类,但同时从中删除
doSomething
,请解释您希望此代码执行的操作:

Upper x = new Middle();
x.doSomething();

您必须在
Middle
中实现
doSomething
,因为Middle是一个具体的类。这意味着
Middle
必须提供来自其超类的所有抽象方法的实现,以及来自其实现的接口的任何接口方法的实现

如果将
Middle
标记为抽象类,则可以将
doSomething
的实现委托给
Bottom


有关抽象类的更多信息,请参阅。

中的此链接,可能是因为具体类不能有抽象方法。只有
abstract
类可以有
abstract
方法。。。对我来说有道理。