抽象メソッドを書きたいのですが、コンパイラはこのエラーを持続的に提供します:
抽象メソッドは本体を持つことができません
私はこのような方法があります:
public abstract boolean isChanged() {
return smt else...
}
ここで何が間違っていますか?
抽象メソッドは、そのデフォルト実装がなく、実装クラスが詳細を提供することを意味します。
基本的に、あなたは持っているだろう
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() {
...
}
}
Java keyword abstract
を使用する場合、実装を提供できません。
このアイデアは、C++のバックグラウンドを持ち、C++のvirtual
キーワードをJavaのabstract
キーワードと「ほぼ同じ」と勘違いすることから生まれることがあります。
C++では、virtual
はメソッドをオーバーライドでき、ポリモーフィズムが続くことを示しますが、abstract
in Javaは同じものではありません。InJava abstract
はpure virtual
メソッド、またはサブクラスによって実装を提供する必要があるメソッド。 Javaは宣言することなくポリモーフィズムをサポートしているため、すべてのメソッドはC++の観点からvirtual
です。したがって、オーバーライドされる可能性のあるメソッドを提供する場合は、 「通常の」メソッドとして記述します。
メソッドがオーバーライドされないように保護するために、Javaはキーワードfinal
をメソッド宣言と合わせて使用して、サブクラスがメソッドをオーバーライドできないことを示します。
エラーメッセージは正確な理由を伝えます:「抽象メソッドはボディを持つことができません」。
それらは抽象クラスとインターフェースでのみ定義でき(インターフェースメソッドは暗黙的に抽象的です!)、サブクラスがメソッドを実装するという考えです。
例:
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";
}
}