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
方法。。。对我来说有道理。