2

当我遇到两个返回对抽象类的引用的函数声明时,我正在阅读 Hadoop 文档:

public FSDataInputStream open(Path f) throws IOException
public abstract FSDataInputStream open(Path f, int bufferSize) throws IOException

除了参数不同之外,为什么这两个函数有不同的返回类型,一个显式声明abstract而另一个没有?

谢谢。

4

7 回答 7

6

抽象方法已声明但没有实现。子类被迫实现它们并且不能继承它们,因为它们没有在超类中实现。

于 2012-07-13T17:45:32.347 回答
6

也回答原始问题,abstract它不是返回类型的一部分,它是方法本身的修饰符,就像public. 这两种方法的返回类型是相同的。

于 2012-07-13T17:48:04.403 回答
5

定义的类public abstract FSDataInputStream open(Path f, int bufferSize) throws IOException本身就是抽象的。这意味着该类只提供了方法的声明,而不是实现。

另一个可以是以下之一:

  • 如果在接口中声明,则表明该方法再次是抽象声明。

  • 否则,它可能是具体类的一部分,表明它在那里有一个实现。

于 2012-07-13T17:47:11.883 回答
3

必须实现抽象方法。在不知道子类是什么的情况下,尚不清楚为什么在这种情况下,但是如果您要对其所在的任何类/接口进行子类化,则必须实现第二种方法,而您可以立即使用第一种方法。

于 2012-07-13T17:47:35.050 回答
3

编码文档

抽象方法是在没有实现的情况下声明的方法(没有大括号,后跟分号),如下所示:

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();
}

当抽象类被子类化时,子类通常为其父类中的所有抽象方法提供实现。但是,如果不是,则子类也必须声明为抽象的。

于 2012-07-13T17:48:09.293 回答
2
public abstract FSDataInputStream open(Path f, int bufferSize) throws IOException

这并不意味着我们正在返回一个抽象类,而是我们正在声明一个方法,但我们还没有给出它的实现,这个他们的关键字abstract
这是在abstract课堂上完成的。所以另一个类将extend抽象类并给出它的实现。

public FSDataInputStream open(Path f, int bufferSize) throws IOException

告诉我们现在给出抽象方法的实现。

于 2012-07-13T17:50:54.540 回答
2

1. public abstract FSDataInputStream open(Path f, int bufferSize) throws IOException , 表示这个方法是一个抽象方法,所以它只是一个声明而不是一个实现。所以这个方法既可以是接口中的方法,也可以是抽象类中的方法。所以这个方法必须由第一个实现接口的具体子类来实现,或者扩展包含这个方法的类。

2. public FSDataInputStream open(Path f) throws IOException如果在接口内声明此方法,则它是抽象方法否则是抽象或非抽象类中的非抽象方法。

于 2012-07-13T17:52:20.263 回答