web-dev-qa-db-ja.com

Javaの抽象メソッド

抽象メソッドを書きたいのですが、コンパイラはこのエラーを持続的に提供します:

抽象メソッドは本体を持つことができません

私はこのような方法があります:

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

ここで何が間違っていますか?

31
caner

抽象メソッドは、そのデフォルト実装がなく、実装クラスが詳細を提供することを意味します。

基本的に、あなたは持っているだろう

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() {
        ...
    }
}
74
Reverend Gonzo

Java keyword abstractを使用する場合、実装を提供できません。

このアイデアは、C++のバックグラウンドを持ち、C++のvirtualキーワードをJavaのabstractキーワードと「ほぼ同じ」と勘違いすることから生まれることがあります。

C++では、virtualはメソッドをオーバーライドでき、ポリモーフィズムが続くことを示しますが、abstract in Javaは同じものではありません。InJava abstractpure virtualメソッド、またはサブクラスによって実装を提供する必要があるメソッド。 Javaは宣言することなくポリモーフィズムをサポートしているため、すべてのメソッドはC++の観点からvirtualです。したがって、オーバーライドされる可能性のあるメソッドを提供する場合は、 「通常の」メソッドとして記述します。

メソッドがオーバーライドされないように保護するために、Javaはキーワードfinalをメソッド宣言と合わせて使用​​して、サブクラスがメソッドをオーバーライドできないことを示します。

21
Edwin Buck

エラーメッセージは正確な理由を伝えます:「抽象メソッドはボディを持つことができません」。

それらは抽象クラスとインターフェースでのみ定義でき(インターフェースメソッドは暗黙的に抽象的です!)、サブクラスがメソッドを実装するという考えです。

例:

 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";
   }
 }
4
Andreas_D