Java 中的抽象方法

2022-09-01 07:58:51

我想写一个抽象的方法,但编译器持续给出这个错误:

抽象方法不能有主体

我有一个这样的方法:

public abstract boolean isChanged() {
    return smt else...
}

这是怎么回事?


答案 1

抽象方法意味着它没有默认的实现,实现类将提供详细信息。

从本质上讲,你会有

abstract class AbstractObject {
   public abstract void method();
}

class ImplementingObject extends AbstractObject {
  public void method() {
    doSomething();
  }
}

因此,这与错误所述完全相同:您的抽象方法不能具有主体。

Oracle网站上有一个完整的教程:http://download.oracle.com/javase/tutorial/java/IandI/abstract.html

您之所以会执行此类操作,是因为如果多个对象可以共享某些行为,但不是所有行为。

一个非常简单的例子是形状:

您可以有一个通用图形对象,它知道如何重新定位自身,但实现类实际上会绘制自身。

(这是从我上面链接的网站中获取的)

abstract class GraphicObject {
    int x, y;
    ...
    void moveTo(int newX, int newY) {
        ...
    }
    abstract void draw();
    abstract void resize();
}

class Circle extends GraphicObject {
    void draw() {
        ...
    }
    void resize() {
        ...
    }
}
class Rectangle extends GraphicObject {
    void draw() {
        ...
    }
    void resize() {
        ...
    }
}

答案 2

如果使用 java 关键字,则无法提供实现。abstract

有时,这个想法来自于C++的背景,并将C++中的关键字误认为与Java中的关键字“几乎相同”。virtualabstract

在C++表示可以重写方法,并且多态性将随之而来,但在Java中不是一回事。在Java中,它更像是一个方法,或者说实现必须由子类提供。由于Java支持多态性而无需声明它,因此所有方法都来自C++的角度。因此,如果要提供可能被覆盖的方法,只需将其编写为“正常”方法即可。virtualabstractabstractpure virtualvirtual

现在,为了防止方法被重写,Java 使用关键字与方法声明协调,以指示子类不能重写该方法。final