it-swarm.com.de

Abstrakte Methoden in Java

Ich möchte eine abstrakte Methode schreiben, aber der Compiler gibt ständig den folgenden Fehler aus:

abstrakte Methoden können keinen Körper haben

Ich habe eine Methode wie diese:

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

Was ist hier falsch?

31
caner

Abstrakte Methoden bedeuten, dass es keine Standardimplementierung dafür gibt und eine implementierende Klasse die Details bereitstellt.

Im Wesentlichen hättest du

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

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

Es ist also genau so, wie der Fehler besagt: Ihre abstrakte Methode kann keinen Body haben.

Ein vollständiges Tutorial finden Sie auf der Oracle-Website unter: http://download.Oracle.com/javase/tutorial/Java/IandI/abstract.html

Der Grund, warum Sie so etwas tun würden, ist, wenn mehrere Objekte ein bestimmtes Verhalten, aber nicht alle Verhalten gemeinsam haben können.

Ein sehr einfaches Beispiel wären Formen:

Sie können ein generisches Grafikobjekt haben, das weiß, wie es sich neu positioniert, aber die implementierenden Klassen zeichnen sich selbst.

(Dies ist von der Seite übernommen, die ich oben verlinkt habe)

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

Wenn Sie das Schlüsselwort Java abstract verwenden, können Sie keine Implementierung bereitstellen.

Manchmal beruht diese Idee darauf, dass Sie einen Hintergrund in C++ haben und das Schlüsselwort virtual in C++ als "fast gleich" mit dem Schlüsselwort abstract in Java verwechselt haben.

In C++ gibt virtual an, dass eine Methode überschrieben werden kann und der Polymorphismus folgt, aber abstract in Java ist nicht dasselbe. In Java abstract ist eher wie ein pure virtual -Methode oder eine Methode, bei der die Implementierung von einer Unterklasse bereitgestellt werden muss. Da Java den Polymorphismus unterstützt, ohne dass er deklariert werden muss, sind alle Methoden aus C++ - Sicht virtual. Wenn Sie also eine Methode bereitstellen möchten, die möglicherweise überschrieben wird, verwenden Sie einfach schreibe es als "normale" Methode.

Um eine Methode vor dem Überschreiben zu schützen, verwendet Java das Schlüsselwort final in Abstimmung mit der Methodendeklaration, um anzuzeigen, dass Unterklassen die Methode nicht überschreiben können.

21
Edwin Buck

Die Fehlermeldung gibt den genauen Grund an: "Abstrakte Methoden können keinen Body haben".

Sie können nur in abstrakten Klassen und Interfaces definiert werden (Interface-Methoden sind implizit abstrakt!) Und die Idee ist, dass die Unterklasse die Methode implementiert.

Beispiel:

 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