当我遇到两个返回对抽象类的引用的函数声明时,我正在阅读 Hadoop 文档:
public FSDataInputStream open(Path f) throws IOException
public abstract FSDataInputStream open(Path f, int bufferSize) throws IOException
除了参数不同之外,为什么这两个函数有不同的返回类型,一个显式声明abstract
而另一个没有?
谢谢。
当我遇到两个返回对抽象类的引用的函数声明时,我正在阅读 Hadoop 文档:
public FSDataInputStream open(Path f) throws IOException
public abstract FSDataInputStream open(Path f, int bufferSize) throws IOException
除了参数不同之外,为什么这两个函数有不同的返回类型,一个显式声明abstract
而另一个没有?
谢谢。
抽象方法已声明但没有实现。子类被迫实现它们并且不能继承它们,因为它们没有在超类中实现。
也回答原始问题,abstract
它不是返回类型的一部分,它是方法本身的修饰符,就像public
. 这两种方法的返回类型是相同的。
定义的类public abstract FSDataInputStream open(Path f, int bufferSize) throws IOException
本身就是抽象的。这意味着该类只提供了方法的声明,而不是实现。
另一个可以是以下之一:
如果在接口中声明,则表明该方法再次是抽象声明。
否则,它可能是具体类的一部分,表明它在那里有一个实现。
必须实现抽象方法。在不知道子类是什么的情况下,尚不清楚为什么在这种情况下,但是如果您要对其所在的任何类/接口进行子类化,则必须实现第二种方法,而您可以立即使用第一种方法。
编码文档:
抽象方法是在没有实现的情况下声明的方法(没有大括号,后跟分号),如下所示:
abstract void moveTo(double deltaX, double deltaY); If a class includes abstract methods, the class itself must be declared abstract, as in: public abstract class GraphicObject { // declare fields // declare non-abstract methods abstract void draw(); }
当抽象类被子类化时,子类通常为其父类中的所有抽象方法提供实现。但是,如果不是,则子类也必须声明为抽象的。
public abstract FSDataInputStream open(Path f, int bufferSize) throws IOException
这并不意味着我们正在返回一个抽象类,而是我们正在声明一个方法,但我们还没有给出它的实现,这个他们的关键字abstract
。
这是在abstract
课堂上完成的。所以另一个类将extend
抽象类并给出它的实现。
public FSDataInputStream open(Path f, int bufferSize) throws IOException
告诉我们现在给出抽象方法的实现。
1. public abstract FSDataInputStream open(Path f, int bufferSize) throws IOException
, 表示这个方法是一个抽象方法,所以它只是一个声明而不是一个实现。所以这个方法既可以是接口中的方法,也可以是抽象类中的方法。所以这个方法必须由第一个实现接口的具体子类来实现,或者扩展包含这个方法的类。
2. public FSDataInputStream open(Path f) throws IOException
如果在接口内声明此方法,则它是抽象方法,否则是抽象或非抽象类中的非抽象方法。