我想编写一个抽象方法,但编译器会持续发出此错误:
抽象方法不能有身体
我有这样的方法:
public abstract boolean isChanged() {
return smt else...
}
这里有什么问题?
答案 0 :(得分:74)
抽象方法意味着没有默认实现,实现类将提供详细信息。
基本上,你会有
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() {
...
}
}
答案 1 :(得分:21)
如果使用java关键字abstract
,则无法提供实现。
有时这个想法来自于拥有C ++背景,并将C ++中的virtual
关键字误认为与Java中的abstract
关键字“几乎相同”。
在C ++中virtual
表示可以覆盖一个方法,并且将遵循多态,但Java中的abstract
不是一回事。在Java中abstract
更像是pure virtual
方法,或者必须由子类提供实现的方法。由于Java支持多态而不需要声明它,因此从C ++的角度来看,所有方法都是virtual
。因此,如果您想提供一个可能被覆盖的方法,只需将其写为“普通”方法。
现在为了保护方法不被覆盖,Java使用与方法声明协调的关键字final
来指示子类不能覆盖该方法。
答案 2 :(得分:4)
错误消息告诉确切的原因:“抽象方法不能有正文”。
它们只能在抽象类和接口中定义(接口方法是隐式抽象的!),其思想是子类实现该方法。
示例:
public abstract class AbstractGreeter {
public abstract String getHelloMessage();
public void sayHello() {
System.out.println(getHelloMessage());
}
}
public class FrenchGreeter extends AbstractGreeter{
// we must implement the abstract method
@Override
public String getHelloMessage() {
return "bonjour";
}
}